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

 

posted @   Bigben  阅读(3392)  评论(0编辑  收藏  举报
编辑推荐:
· 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生命周期
点击右上角即可分享
微信分享提示