为什么我的 SVT-HEVC 编码的视频不同步?

为什么我的 SVT-HEVC 编码的视频不同步?

我正在尝试使用以下方式将视频(带音频)转码为 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,当与其他流(即音频)混合时,该文件将继续以正确的帧速率播放。

相关内容