前言
参考资料:
https://blog.csdn.net/zhoubotong2012/article/details/86711097
https://blog.csdn.net/zhoubotong2012/article/details/86711097
正文
首先, rtp每次推送只能推一路流, 如果用ffmpeg推送普通的影片,比如, mp4, 起码有视频流以及音频流,请在ffmpeg命令里面指定要推送的是视频还是音频, 否则会出现以下错误:
推送命令:
##推送视频流: ffmpeg -re -i magic-01.mp4 -vcodec libx264 -an -f rtp rtp://192.168.0.101:11112>test_magic_01_video.sdp ##推送音频流 ffmpeg -re -i magic-01.mp4 -vn -acodec copy -f rtp rtp://127.0.0.1:11112>test_magic_01_audio.sdp 解释: -re 表示实时推送, 不加的话就是按照最大速度推送. -an 表示, 不要推audio 音频 -vn 表示 不要推 video 视频 后面的sdp表示顺便保存到sdp文件里面去.
注意!!!!
标准协议里面规定,rtp的端口要用偶数端口, rtcp的端口要用奇数端口, 在一些开源项目以及软件里面都遵守这个规则, 譬如:jrtplib,live555等, 如果你随便推送到奇数端口那么vlc是会报错的,就是10s内没有接收到数据.
执行推送命令以后ffmpeg出现:
然后你可以看到当前目录下面有一份文件:
内容为:
注意到 文件前面的 [SDP]字样没有? 这个是不标准的, 用vlc打开是没有任何反应的, 根据描述:
需要删除第一行的SDP字样,如下:
v=0 o=- 0 0 IN IP4 127.0.0.1 s=No Name c=IN IP4 192.168.0.101 t=0 0 a=tool:libavformat 58.29.100 m=video 11112 RTP/AVP 96 a=rtpmap:96 H264/90000 a=fmtp:96 packetization-mode=1
然后, 使用 vlc打开可以看到:
总结
就一个简单的ffmpeg推送rtp流, vlc接收并且播放都有几个坑点...
真不知道以后要弄 rtp接收合并为rtmp的时候会怎么样...
草稿[试错]
尝试推送普通mp4影片:
ffmpeg -re -i magic-01.mp4 -vcodec copy -f rtp rtp://127.0.0.1:1234>test_rtp_h264.sdp
出错:
其他人的解释:
rtp自身限制每次只能一个媒体流, 修正如下:
##分别推送 视频以及音频到不同的端口. ffmpeg -re -i magic-01.mp4 -vcodec copy -an -f rtp rtp://127.0.0.1:11111>test_magic_01_video.sdp -vn -acodec copy -f rtp rtp://127.0.0.1:11112>test_magic_01_audio.sdp
成功:
本机
美中不足的是,这个命令似乎先推audio,再推video,vidoe的sdp一直为0字节.
去掉audio的推送以后就能够直接看到video sdp有内容了,
然后, 查看本机端口,11111的使用情况:
.....没有任何程序占用它们....
也就是说, 上面的文章都漏了一个东西, ffmpeg是推送端, 那么接收端在哪里? 哪个程序在监听11111这个端口?
尝试一
又查了一些资料, 我终于明白了:
https://www.cnblogs.com/vitoboy/p/8393205.html
首先, 使用ffmpeg推rtp的时候需要有一个接收端, vlc可以先作为接收端, 首先在vlc上面
"媒体"> "打开网络窜流"
点击播放, 可以看到
vlc已经在准备中了, 然后 查询一下 端口11111的占用情况:
vlc已经在监听端口了, 好了, 接下来就用ffmpeg推rtp流了:
ffmpeg -re -i magic-01.mp4 -vcodec copy -an -f rtp rtp://127.0.0.1:11111>test_magic_01_video.sdp
ffmpeg工作正常:
而这时候你会看到vlc提醒:
https://www.techwalla.com/articles/how-to-play-an-sdp-stream-on-vlc
尝试二
[尝试一]不成功, 又找了些资料:
https://stackoverflow.com/questions/61687212/ffmpeg-vlc-won-t-open-sdp-files-generated-by-ffmpeg
里面提到:
我查了一下ffmpeg生成的sdp格式, 确实有:
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 58.29.100 m=video 11111 RTP/AVP 96 b=AS:569 a=rtpmap:96 H264/90000 a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QAH6zZQEQE3lqEAAAPpAAC7gA8YMZY,aO+Pyw==; profile-level-id=64001F
然后用vlc重新打开:
ps:
我直接用的命令行,因为能够看到出错信息:
vlc test_magic_01_video.sdp
出现界面,
等待一段时间,报错:
无意中看到资料, 原来协议规定了rtp是偶数端口, rtcp是奇数端口, 而在 很多开源项目都遵守这个规定, 只要将端口改为偶数 vlc就能正常播放了.
话说, 网上用端口11111来推送rtp流的例子是怎么用vlc播放的? vlc播放不了的啊.