【问题标题】:ffmpeg VBR -> CBR conversion and streaming of MPEG-2 TS video filesffmpeg VBR -> MPEG-2 TS 视频文件的 CBR 转换和流式传输
【发布时间】:2017-11-07 15:05:22
【问题描述】:

我正在尝试使用 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 的复用率和比特率之间的差异被空包填充。

问题是输出远非完美。整体比特率充其量是半 CBR。它的范围在 12Mbps 和 15Mbps 之间,我看到很多 PCR 准确度和 PCR 重复错误以及 VPID 和 APID 上的 CC 错误。

【问题讨论】:

    标签: ffmpeg streaming video-streaming


    【解决方案1】:

    一些想法:

    • 确保您拥有最新版本的 ffmpeg,因为在某些时候存在一个错误,会在流复制时弄乱 PCR 插入
    • 如果您想要恒定的 UDP 输出,您必须使用 bitrate 选项,例如:

      -flush_packets 0 -f mpegts "udp://destination_ip:1234?pkt_size=1316&bitrate=18000000"
      
    • UDP 是一个不可靠的协议,您可能会遇到数据包丢失(不幸的是,bitrate 选项目前仅适用于 UDP AFAIK)
    • 如果您有专用连接但仍遇到 CC 错误,请检查目标操作系统的最大 UDP 缓冲区大小并确保它可以处理 18 Mbps

    【讨论】:

    • 嗯,我的 ffmpeg 版本是 2.8.11-0ubuntu0.16.04.1。明天我可以尝试从源代码安装最新版本。但是对于我当前的版本,我没有任何填充物,而且比特率波动很大。不过,我已经设法使用 tsplay 取得了更好的结果。流式传输相同的 TS 文件实际上产生的 PCR 错误更少。
    • @GeorgеStoyanov 如果您想在不编译的情况下快速查看最新版本,请尝试最近的static build
    • @GeorgеStoyanov 如果你想做真正的 H.264 CBR 而不是插入 NULL 数据包,还有另一种方法。
    【解决方案2】:
    1. 还要指定-minrate-maxrate
    2. 使用大于bitrate-bufsize
    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  
    

    【讨论】:

    • @entrophy,感谢您的评论,我将对其进行测试并分享我的发现。
    • 此命令正在创建类似于上限 VBR 的内容,其中最大比特率是配置的 muxrate 和视频比特率变化很大。它还剥离了导致大量 PCR 错误的空数据包。
    猜你喜欢
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2012-03-06
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多