ffmpeg VBR->MPEG-2 TS视频文件的CBR转换和流式传输

ffmpeg VBR->MPEG-2 TS视频文件的CBR转换和流式传输,ffmpeg,streaming,video-streaming,Ffmpeg,Streaming,Video Streaming,我正在尝试使用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。

我正在尝试使用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之间,我在VPID和APID上看到了很多PCR准确性和PCR重复错误以及CC错误

一些想法:

请确保您拥有最新版本的ffmpeg,因为在某些情况下,在流复制时出现了一个错误,导致PCR插入错误 如果想要恒定的UDP输出,则必须使用比特率选项,如:

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

请确保您拥有最新版本的ffmpeg,因为在某些情况下,在流复制时出现了一个错误,导致PCR插入错误 如果想要恒定的UDP输出,则必须使用比特率选项,如:

-flush_packets 0 -f mpegts "udp://destination_ip:1234?pkt_size=1316&bitrate=18000000"
UDP是一种不可靠的协议,您可能会遇到数据包丢失。不幸的是,比特率选项目前仅适用于UDP AFAIK 如果您有一个专用连接,但仍然遇到CC错误,请检查目标OS max UDP缓冲区大小,并确保它可以处理18 Mbps 同时指定-minrate和-maxrate。 使用-bufsize大于比特率。 设置-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  
同时指定-minrate和-maxrate。 使用-bufsize大于比特率。 设置-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版本是2.8.11-0ubuntu0.16.04.1。明天我可以尝试从源代码安装最新版本。但在我目前的版本中,我没有任何填充物,比特率波动很大。不过,我使用tsplay取得了更好的效果。而流式传输相同的TS文件实际上会产生较少的PCR错误。@GeorgöStoyanov如果您想在不编译的情况下快速检查最新版本,请尝试最新版本。@GeorgöStoyanov如果您想执行真正的H.264 CBR而不是插入空数据包,还有另一种方法。嗯,我的ffmpeg版本是2.8.11-0ubuntu0.16.04.1。明天我可以尝试从源代码安装最新版本。但在我目前的版本中,我没有任何填充物,比特率波动很大。不过,我使用tsplay取得了更好的效果。流式传输同一个TS文件实际上会产生较少的PCR错误。@GeorgöStoyanov如果您想在不编译的情况下快速检查最新版本,请尝试使用最新版本。@GeorgöStoyanov如果您想执行真正的H.264 CBR而不是插入空包,还有另一种方法。@entrophy,谢谢您的评论,我将测试它并分享我的发现。此命令正在创建一个类似于上限VBR的东西,最大比特率、配置的muxrate和视频比特率变化很大。它还正在剥离导致大量PCR错误的空数据包。@entrophy,感谢您的评论,我将测试它并分享我的发现。此命令正在创建一个类似于封顶VBR的东西,最大比特率、配置的muxrate和视频比特率变化很大。它还剥离导致大量PCR错误的空数据包。