我正在尝试使用以下方式将视频(带音频)转码为 HEVC英特尔的 SVT-HEVC 编码器. 转码前视频的音轨是同步的。
ffprobe
和均mediainfo
同意输入视频的帧率为 23.98 fps (24 / 1.001):
# ffprobe
Stream #0:0: Video: h264 (High), yuv420p(progressive), 1872x1080 [SAR 1:1 DAR 26:15], 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
# mediainfo
Video
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : [email protected]
Width : 1 872 pixels
Height : 1 080 pixels
Display aspect ratio : 1.733
Frame rate mode : Constant
Frame rate : 23.976 (24000/1001) FPS
现在,我在我的 Linux 系统上构建了以下ffmpeg
+SvtHevcEncApp
命令行,将该视频转码为 H.265:
inputFile="testmovie.mp4"
outputFile="testmovie.hevc"
: ${frameCount:=68808}
: ${videoWidth:=1872}
: ${videoHeight:=1080}
: ${videoBitRate:=2359296}
: ${videoFrameRateNum:=24000}
: ${videoFrameRateDenom:=1001}
ffmpeg \
-hide_banner \
-i "$inputFile" \
-nostdin \
-f rawvideo \
-pix_fmt yuv420p \
- | SvtHevcEncApp \
-i stdin \
-n $frameCount \
-w $videoWidth \
-h $videoHeight \
-rc 1 \
-tbr $videoBitRate \
-fps-num $videoFrameRateNum \
-fps-denom $videoFrameRateDenom \
-profile main \
-encMode 0 \
-bit-depth 8 \
-tier main \
-b "$outputFile"
然后我可以观察如何ffmpeg
将帧交给SvtHevcEncApp
后者并将其编码为.hevc
流。
我的问题是,当我将.hevc
流与音轨重新混合时,它们很快就会不同步(剪辑开始 1 分钟后,音轨已经偏离了 1 秒多)。尽管原始剪辑和转码剪辑在ffprobe
和中都显示 23.98 fps mediainfo
。
原始剪辑中 62.042 秒处发生的场景在 HEVC 剪辑中 59.542 秒处发生。由于它没有以更快的帧速率播放,因此一定SvtHevcEncApp
是跳帧/丢帧。
这里可能出了什么问题?ffmpeg
输出时是否有可能改变帧速率(即复制一些帧)stdout
?
答案1
我从来没有发现为什么音频不同步,只是模糊地感觉 MKVtoolnix 可能无法.hevc
正确计算文件的帧速率。
到目前为止,我的解决方法是使用一些非常具体的参数将.hevc
文件转换为:.mkv
mkvOutputFile=${outputFile%.*}.mkv
mkvmergeParameters=()
mkvmergeParameters+=(--default-duration 0:${videoFrameRateNum}/${videoFrameRateDenom}fps)
mkvmergeParameters+=(--fix-bitstream-timing-information 0)
mkvmerge \
"${mkvmergeParameters[@]}" \
"$outputFile" \
-o "$mkvOutputFile"
这.mkv
将从文件中生成一个文件.hevc
,当与其他流(即音频)混合时,该文件将继续以正确的帧速率播放。