FFmpeg:使用不同的音频和视频流开始时间对视频进行转码

FFmpeg:使用不同的音频和视频流开始时间对视频进行转码

我正在尝试对用户生成的视频进行转码,这些视频有时音频和视频流的开始时间不同。到目前为止,当音频/视频流的开始时间不同时,所有转码视频都会导致音频和视频不同步。

开始时间差异并不总是恒定的。

用户生成视频示例

播放用户生成的视频时,音频和视频同步。

这里是示例文件。该视频是在Safari浏览器中录制的。

跑步

ffprobe input.mp4 -show_entries stream=codec_type,start_time,duration -of compact

以用户生成的视频输出为例:

ffprobe version 4.3.1 Copyright (c) 2007-2020 the FFmpeg developers
  built with gcc 10.2.1 (Alpine 10.2.1_pre1) 20201203
  configuration: --prefix=/usr --enable-avresample --enable-avfilter --enable-gnutls --enable-gpl --enable-libass --enable-libmp3lame --enable-libvorbis --enable-libvpx --enable-libxvid --enable-libx264 --enable-libx265 --enable-libtheora --enable-libv4l2 --enable-libdav1d --enable-postproc --enable-pic --enable-pthreads --enable-shared --enable-libxcb --enable-libsrt --enable-libssh --enable-libvidstab --disable-stripping --disable-static --disable-librtmp --enable-vaapi --enable-vdpau --enable-libopus --enable-vulkan --enable-libsoxr --enable-libaom --disable-debug
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
  Metadata:
    major_brand     : iso5
    minor_version   : 1
    compatible_brands: isomiso5hlsf
    creation_time   : 2021-06-30T05:18:17.000000Z
  Duration: 00:00:16.51, start: 0.000000, bitrate: 9700 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 640x480 [SAR 1:1 DAR 4:3], 9815 kb/s, 28.89 fps, 600 tbr, 600 tbn, 1200 tbc (default)
    Metadata:
      creation_time   : 2021-06-30T05:18:17.000000Z
      handler_name    : Core Media Video
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 185 kb/s (default)
    Metadata:
      creation_time   : 2021-06-30T05:18:17.000000Z
      handler_name    : Core Media Audio
stream|codec_type=video|start_time=0.506667|duration=16.005000
stream|codec_type=audio|start_time=0.000000|duration=16.044989

音频和视频流的持续时间不同,但值得注意的是,视频开始时间比音频开始时间晚约 0.5 秒。

转码命令

ffmpeg  -i input.mp4 \
        -c:v libx264 \
        -crf 23 \
        -profile:v main \
        -r 30 \
        -video_track_timescale 30 \
        -level 3.0 \
        -pix_fmt yuv420p \
        -c:a aac \
        -ac 2 \
        -af aresample=async=1000 \
        -ar 44100 \
        -sample_fmt fltp \
        -b:a 128k \
        -vsync 1 \
        -vf scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:-1:-1:color=black \
        output.mp4

输出

生成的文件播放时音频会延迟

ffprobe在输出视频上再次运行会产生:

ffprobe version 4.3.1 Copyright (c) 2007-2020 the FFmpeg developers
  built with gcc 10.2.1 (Alpine 10.2.1_pre1) 20201203
  configuration: --prefix=/usr --enable-avresample --enable-avfilter --enable-gnutls --enable-gpl --enable-libass --enable-libmp3lame --enable-libvorbis --enable-libvpx --enable-libxvid --enable-libx264 --enable-libx265 --enable-libtheora --enable-libv4l2 --enable-libdav1d --enable-postproc --enable-pic --enable-pthreads --enable-shared --enable-libxcb --enable-libsrt --enable-libssh --enable-libvidstab --disable-stripping --disable-static --disable-librtmp --enable-vaapi --enable-vdpau --enable-libopus --enable-vulkan --enable-libsoxr --enable-libaom --disable-debug
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.45.100
  Duration: 00:00:17.07, start: 0.000000, bitrate: 5177 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 5241 kb/s, 30 fps, 30 tbr, 30 tbn, 60 tbc (default)
    Metadata:
      handler_name    : Core Media Video
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 102 kb/s (default)
    Metadata:
      handler_name    : Core Media Audio
stream|codec_type=video|start_time=0.000000|duration=16.500000
stream|codec_type=audio|start_time=0.000000|duration=17.045011

视频和音频流的持续时间相差约 0.5 秒且不同步。

尝试的解决方案

我尝试了-fflags +shortest几个-map命令,并删除了faststart命令,但无济于事。

我试图避免的一个可能的解决方案是计算偏移量并以固定的时间量(在本例中约为 0.5 秒)填充音频流。

理想情况下,解决方案应该能够处理不同的开始时间。任何建议都将不胜感激。

相关内容