我正在使用 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
使用?你确定命令中的变量正确吗?