![ffmpeg 产生的比特率高于预期。我错过了什么吗?](https://linux22.com/image/1380910/ffmpeg%20%E4%BA%A7%E7%94%9F%E7%9A%84%E6%AF%94%E7%89%B9%E7%8E%87%E9%AB%98%E4%BA%8E%E9%A2%84%E6%9C%9F%E3%80%82%E6%88%91%E9%94%99%E8%BF%87%E4%BA%86%E4%BB%80%E4%B9%88%E5%90%97%EF%BC%9F.png)
我正在使用 ffmpeg 创建一些 h264 传输流。视频的比特率为 496k,音频的比特率为 64k。但是,当 (2 遍) 编码完成时,我得到的流超过 600k。我在脚本中使用以下语法:
codec=h264
streamsuffix=ts
audiocutoff=15000
audioprofile=aac_low
audiosamplerate=48000
video_med=496k
audio_med=64k
suffix_med=_med
preset=veryslow
threads=4
dirname="${1%/*}"
filename=$(basename "$1")
extension="${filename##*.}"
filename="${filename%.*}"
ffmpeg -i $filename"."$extension -preset $preset -strict experimental -threads $threads -c:v $codec -b:v $video_med -bsf:v h264_mp4toannexb -pass 1 -an -f rawvideo -y /dev/null
ffmpeg -y -i $filename"."$extension -preset $preset -strict experimental -threads $threads -c:a aac -cutoff $audiocutoff -profile:a $audioprofile -b:a $audio_med -ar $audiosamplerate -c:v $codec -b:v $video_med -bsf:v h264_mp4toannexb -pass 2 $filename$suffix_med"."$streamsuffix
我是不是漏掉了什么?我需要强制执行目标比特率吗?非常感谢!
答案1
这对 TS 来说大约是 7% 的开销。这差不多是对的。ffmpeg 的传输流输出效率非常低。TS 流被分成 188 字节的数据包。每个数据包都有一个 4 字节的标头(剩下 184 字节的有效负载),并且每帧还有一个额外的 PES 标头。将开销添加到每个帧后,如果帧不在 TS 边界上结束,则最终数据包将用 0xFF 字节填充。您可以通过使用十六进制编辑器查看 ts 文件来确认这一点。您还可以尝试编码为 mp4 并查看文件大小。
更多信息请点击这里: http://blog.zencoder.com/2011/12/08/announcing-the-clouds-most-efficient-http-live-streaming/
答案2
在哪里$video_hi
定义,在哪里video_med
使用?你确定命令中的变量正确吗?