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。因此,根据我的理解,这段代码应该提供 18Mbp​​s 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
  1. 同时指定 -minrate-maxrate
  2. 使用 -bufsize 大于 bitrate
  3. 设置 -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