发送h264 video
ffmpeg -re -stream_loop -1 -i h264.mp4 -vcodec h264 -f rtp rtp://127.0.0.1:5006
SDP: # 这个信息默认会输出到terminal
v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 127.0.0.1
t=0 0
a=tool:libavformat LIBAVFORMAT_VERSION
m=video 5006 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
执行这条命令,如上SDP端,默认会生成SDP信息输出,单独播放很简单,复制前面的sdp信息到a.sdp(也可以直接在命令后跟> v.sdp
符号生成v.sdp
文件),然后就可以用命令直接播放,指定codec参数后,会经过重新编码发送。
ffmpeg -re -stream_loop -1 -i h264.mp4 -vcodec h264 -f rtp rtp://127.0.0.1:5006 > v.sdp
ffplay -protocol_whitelist "file,rtp,udp" -i v.sdp
ffplay后直接跟rtp://127.0.0.1:5006
的url播放是不可以的。
发送aac audio
ffmpeg -re -stream_loop -1 -i aac.mp4 -acodec aac -f rtp rtp://127.0.0.1:5008
SDP:
v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 127.0.0.1
t=0 0
a=tool:libavformat LIBAVFORMAT_VERSION
m=audio 5008 RTP/AVP 97
b=AS:128
a=rtpmap:97 MPEG4-GENERIC/44100/2
a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=121056E500
Stream mapping:
Stream #0:0 -> #0:0 (aac (native) -> aac (native))
播放:
ffmpeg -re -stream_loop -1 -i aac.mp4 -acodec aac -f rtp rtp://127.0.0.1:5008 > a.sdp
ffplay -protocol_whitelist "file,rtp,udp" -i a.sdp
合并播放
根据前面audio和video输出的sdp信息,创建video.sdp文件,两路rtp独立发送,一路播放也可以。sdp内容如下:
v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 127.0.0.1
t=0 0
m=video 5006 RTP/AVP 96
b=AS:200
a=rtpmap:96 MP4V-ES/90000
m=audio 5008 RTP/AVP 97
b=AS:128
a=rtpmap:97 MPEG4-GENERIC/44100/2
a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=121056E500
播放:
ffplay -protocol_whitelist "file,rtp,udp" -i video.sdp -sync ext
-sync type
:set audio-video sync. type (type=audio/video/ext),AV同步支持三个参数,前面的这个分离流发送,用ext做同步效果好一些,播放经过一段时间后,av同步比较好,能明显的听出来用ext同步,audio会被拉伸。
[udp @ 0x7fbfe8009260] bind failed: Address already in useB f=0/0
video.sdp: Invalid data found when processing input
- 如果出现这段error,修改端口就可以正常播放
ffmpeg rtp发送ts流
发送video
ffmpeg -re -stream_loop -1 -i h264.ts -vcodec h264 -rtpflags h264_mode0 -f rtp rtp://172.0.0.1:1234
报错:
[rtp @ 0x55cccc59c0f0] NAL size 2256 > 1460, try -slice-max-size 1460
去掉-rtpflags h264_mode0
就好了,-vcodec
指定为copy
也是可以的。
ffmpeg -re -stream_loop -1 -i h264.ts -vcodec h264 -f rtp rtp://172.0.0.1:1234
所以是:
ffmpeg -re -stream_loop -1 -i h264.ts -vcodec h264 -f rtp rtp://172.0.0.1:1234
这里源文件是ts,也输出了sdp信息,但是指定对应的sdp播放失败。
ffplay -protocol_whitelist "file,rtp,udp" v.sdp
发送audio
ffmpeg -re -stream_loop -1 -i aac.ts -acodec copy -rtpflags latm -f rtp rtp://172.0.0.1:1235
如果没有参数-rtpflags latm
,会报错:AAC with no global headers is currently not supported.
,不要这个参数,实际acodec后面跟aac重新编码后就没问题了。
但是和前面一样,源文件是ts,指定对应的sdp播放失败。
AAC as an RTP payload
工作正常:
ffmpeg -re -i aac.mp4 -c:a aac -f rtp rtp://127.0.0.1:8000
AAC with no global headers is currently not supported:
ffmpeg -re -i file.aac -c:a copy -f rtp rtp://127.0.0.1:8000
这个用了copy,应该是acc的frame可能不是adts,在指定codec为aac后重编码后的aac是adts格式,video也是一样的,这个需要看代码确定一下。
https://www.reddit.com/r/ffmpeg/comments/mq6jzv/aac_as_an_rtp_payload/
使用rtp_mpegts
rtp_mpegts是一种基于RTP协议的MPEG-2传输流(MPEG-2 Transport Stream)的封装格式。它将MPEG-2传输流封装成RTP数据包,以便在IP网络上进行传输。
所以通过rtp_mpegts可以直接发送包含video和audio的ts流,也可以用来单独发送:
ffmpeg -re -stream_loop -1 -i test.ts -vcodec copy -acodec copy -f rtp_mpegts rtp://239.0.0.1:5656
经过rtp_mpegts发送的流不需要指定sdp,ffplay直接跟url就可以播放,这里用了组播地址,用127.0.0.1也是可以的:
ffplay -protocol_whitelist "file,rtp,udp" rtp://239.0.0.1:5656
rtp不支持两路流
ffmpeg不支持两路流输入,下面这两种写法都不支持:
ffmpeg -re -stream_loop -1 -i aac.mp4 -i h264.mp4 -acodec copy -vcodec copy -f rtp rtp://172.0.0.1:1234
独立video和audio流作为输入不可以。
ffmpeg -re -stream_loop -1 -i h264.mp4 -i aac.mp4 -acodec copy -vcodec copy -f rtp rtp://172.0.0.1:1234
mp4文件中包含两路流也是不行的。文章来源:https://www.toymoban.com/news/detail-672432.html
都会报错:文章来源地址https://www.toymoban.com/news/detail-672432.html
[rtp @ 0x5618af7603c0] Only one stream supported in the RTP muxer
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Error initializing output stream 0:1 --
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #1:0 -> #0:1 (copy)
Last message repeated 1 times
到了这里,关于ffmpeg rtp发送video和audio并播放的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!