FFMPEG支持创建多种协议的视频流,举例说明使用FFMPEG创建视频流,以及接受视频流
UDP协议
UDP全称为用户数据报协议(User Datagram Protocol,UDP)
下面的命令实现将本地文件以H.264祼流发送到地址udp://127.0.0.1:1234
1 | ffmpeg -re -i minis.mp4 -vcodec copy -f h264 udp://127.0.0.1:1234 |
使用ffplay接收UDP视频流:
1 | ffplay udp://127.0.0.1:1234 |
ffplay也可以手动指定解码参数:ffplay -f h264 udp://127.0.0.1:1234
RTP协议
RTP是实时传输协议(Real-time Transport Protocol)
通过FFMPEG将本地文件作为输入创建基于RTP的视频流:
1 | ffmpeg -re -i input.mpg -vcodec copy -an -f rtp rtp://127.0.0.1:20000 -vn -acodec copy -f rtp rtp://127.0.0.1:30000 |
- “-re” 指定ffmpeg以正确的速率推送流,如果不指定ffmpeg会尽可能快的推送流
- “input.mpg” 输入文件
- “-vcodec copy”和“-acodec copy” 表示不改变原来视频文件的视频和音频的编码格式
- “-an”(no audio)和“-vn”(no video)分别用来单独输出视频和音频,否则会出现错误
[rtp @ 0x353cb00] Only one stream supported in the RTP muxer
- “-f rtp” 指定输出的视频流格式为RTP
- “rtp://ip:port” 指定IP和端口
例如我的测试命令:
1 | ffmpeg -re -i bunny.avi -vcodec copy -an -f rtp rtp://127.0.0.1:20000 -vn -acodec aac -f rtp rtp://127.0.0.1:30000 |
我把音频编码格式改成了aac,否则我这里由于系统中不支持AC3会导致失败
上述命令创建后会输出很多信息,其中包含SDP信息:
1 | SDP: |
将上述内容保存到文件,命名为a.sdp
然后运行ffplay接收流:
1 | ffplay bunny.sdp -protocol_whitelist file,udp,rtp |
注意,如果没有添加后面的-protocol_whitelist
选项,会报错Protocol not on whitelist 'file,crypto'!/0
bunny.sdp: Invalid data found when processing input
RTSP协议
RTSP协议全称为实时流协议(Real Time Streaming Protocol)
ffserver
参考:
1.FFmpeg Protocols Documentation
2.FFmpeg wiki:StreamingGuide
3.FFmpeg wiki:ffserver
4.RTP streaming with ffmpeg