RTP 用ffmpeg
rtp,对于它的实现ffmpeg和gstreamer。对于这种复杂协议,实现肯定会有不同和妥协。
下面都是用命令窗口操作。命令换行(\
on Linux, ^
on Windows),环境变量访问 ($NAME
or ${NAME}
on Linux, %NAME%
on Windows).
先理解概念 转码:
由于发送端和接收端需要的文件格式不一致,需要:
1)解码媒体,成raw格式和信息部分;2)编码raw格式用不同的编码器codec。
上图有个mkv文件,音频OPUS,视频是vp8.转码成视频h264,音频MP3,然后用mp4 container封装。
我们用rtp是不用封装到container的。
FFmpeg
ffmpeg \ [global_options] \ { [input_options] -i input_url } \ { [output_options] output_url }
命令是有序的,一般是上面这个结构。
RTP流命令概览
ffmpeg \ -re \ -i video.mp4 \ -an \ -c:v copy \ -f rtp \ -sdp_file video.sdp \ "rtp://192.168.1.109:5004"
参数意义:
-re
: 模拟直播流,慢速推;否则ffmpeg会尽快发送完成.-i video.mp4
: Input file.-an
: 输出不要音频.-c:v copy
: 视频不转码,直接拷贝输出.-f rtp
: 输出格式,rtp。如果想保存成文件,直接写文件名,会根据后缀猜测转成的类型.-sdp_file video.sdp
: 生成sdp文件,这个文件能拷贝给另外一个去播放.rtp://192.168.1.109:5004
: 输出的url.
添加音频 -c:a copy
("copy audio"), 有下面报错:
[rtp @ 0x6fec300] Only one stream supported in the RTP muxer
BUG:
事实上,生成的sdp文件多了行
SDP:
需要去掉:sed -i '/^SDP:/d' video.sdp
FFmpeg ≥ 4.3没有这个问题。
附加特性:
RTCP端口设定:
ffmpeg -re -i video.mp4 -an -c:v copy -f rtp -sdp_file video.sdp \ "rtp://192.168.1.109:5004?rtcpport=54321"
但是ffmpeg有个bug,生成的sdp里面不包含这个
rtcpport=54321
端口的生成,需要手动加上。
Symmetric RTP
ffmpeg -re -i video.mp4 -an -c:v copy -f rtp -sdp_file video.sdp \ "rtp://192.168.1.109:5004?rtcpport=5005&localrtpport=5004&localrtcpport=5005"
可以inspect这个口的rtp和rtcp包。
RTP and RTCP multiplexing
不支持
Timestamps 纠正
ffmpeg \ -re \ -fflags +genpts \ -i video.mp4 \ -an \ -c:v copy \ -f rtp \ -sdp_file video.sdp \ "rtp://192.168.1.109:5004"
输入时转码
-c:v vp8 替换 copy
注意用htop去看cpu从0.7%到转码飙升到10-55%
播放 RTP流
由于 dynamic Payload Types的使用,必须用sdp文件播放,没有工具用rtp播放的。
FFmpeg playback
ffplay \ -protocol_whitelist file,rtp,udp \ -i video.sdp
GStreamer playback
安装:
sudo apt-get update && sudo apt-get install --yes \ gstreamer1.0-plugins-{good,bad,ugly} \ gstreamer1.0-{libav,tools}
播放:
gst-launch-1.0 playbin uri="sdp://$PWD/video.sdp"
等价于命令
gst-launch-1.0 \ filesrc location=video.sdp \ ! sdpdemux timeout=0 ! queue \ ! rtph264depay ! h264parse ! avdec_h264 \ ! videoconvert ! autovideosink
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2018-01-04 30分钟学会如何使用Shiro
2018-01-04 Java NIO 系列教程
2018-01-04 Kafka学习之路
2018-01-04 Kafka消费组(consumer group)
2017-01-04 口语句子
2017-01-04 4-8 同义词
2015-01-04 基础总结篇之一:Activity生命周期