ffmpeg VBR -> MPEG-2 TS 视频文件的 CBR 转换和流式传输
ffmpeg VBR -> CBR conversion and streaming of MPEG-2 TS video files
我正在尝试使用 ffmpeg 将源 VBR SPTS MPEG-2 TS 文件转换为 CBR。我使用的代码如下:
#!/bin/bash
pkill ffmpeg
ffmpeg \
-re -i source.ts -c copy \
-muxrate 18000K \
-f mpegts \
udp://destination_ip:1234?pkt_size=1316
源 VPID 比特率为 ~ 10Mbps,APID 为 296Kbps。因此,根据我的理解,这段代码应该提供 18Mbps CBR,其中所有 PID 的 muxrate 和比特率之间的差异被空数据包填充。
问题是输出远非完美。整体比特率充其量是半 CBR。它的范围在 12Mbps 和 15Mbps 之间,我看到很多 PCR 准确性和 PCR 重复错误以及 VPID 和 APID 上的 CC 错误。
一些想法:
- 确保你有最新版本的
ffmpeg
因为在某些时候有一个错误,在流复制时搞乱了 PCR 插入
如果您想要恒定的 UDP 输出,您必须使用 bitrate
选项,例如:
-flush_packets 0 -f mpegts "udp://destination_ip:1234?pkt_size=1316&bitrate=18000000"
UDP
是一个不可靠的协议,您可能会遇到数据包丢失(不幸的是 bitrate
选项目前仅适用于 UDP
AFAIK)
- 如果您有专用连接但仍然遇到 CC 错误,请检查目标 OS 最大 UDP 缓冲区大小并确保它可以处理 18 Mbps
- 同时指定
-minrate
和 -maxrate
。
- 使用
-bufsize
大于 bitrate
。
- 设置
-muxrate
值,例如 bufsize
。
最终命令:
ffmpeg \
-re -i source.ts \
-b:v 10500k \
-minrate 10500k \
-maxrate 10500k \
-bufsize 18000k \
-muxrate 18000k \
-f mpegts \
udp://destination_ip:1234?pkt_size=1316
我正在尝试使用 ffmpeg 将源 VBR SPTS MPEG-2 TS 文件转换为 CBR。我使用的代码如下:
#!/bin/bash
pkill ffmpeg
ffmpeg \
-re -i source.ts -c copy \
-muxrate 18000K \
-f mpegts \
udp://destination_ip:1234?pkt_size=1316
源 VPID 比特率为 ~ 10Mbps,APID 为 296Kbps。因此,根据我的理解,这段代码应该提供 18Mbps CBR,其中所有 PID 的 muxrate 和比特率之间的差异被空数据包填充。
问题是输出远非完美。整体比特率充其量是半 CBR。它的范围在 12Mbps 和 15Mbps 之间,我看到很多 PCR 准确性和 PCR 重复错误以及 VPID 和 APID 上的 CC 错误。
一些想法:
- 确保你有最新版本的
ffmpeg
因为在某些时候有一个错误,在流复制时搞乱了 PCR 插入 如果您想要恒定的 UDP 输出,您必须使用
bitrate
选项,例如:-flush_packets 0 -f mpegts "udp://destination_ip:1234?pkt_size=1316&bitrate=18000000"
UDP
是一个不可靠的协议,您可能会遇到数据包丢失(不幸的是bitrate
选项目前仅适用于UDP
AFAIK)- 如果您有专用连接但仍然遇到 CC 错误,请检查目标 OS 最大 UDP 缓冲区大小并确保它可以处理 18 Mbps
- 同时指定
-minrate
和-maxrate
。 - 使用
-bufsize
大于bitrate
。 - 设置
-muxrate
值,例如bufsize
。
最终命令:
ffmpeg \
-re -i source.ts \
-b:v 10500k \
-minrate 10500k \
-maxrate 10500k \
-bufsize 18000k \
-muxrate 18000k \
-f mpegts \
udp://destination_ip:1234?pkt_size=1316