我正在尝试对用户生成的视频进行转码,这些视频有时音频和视频流的开始时间不同。到目前为止,当音频/视频流的开始时间不同时,所有转码视频都会导致音频和视频不同步。
开始时间差异并不总是恒定的。
用户生成视频示例
播放用户生成的视频时,音频和视频同步。
这里是示例文件。该视频是在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 秒)填充音频流。
理想情况下,解决方案应该能够处理不同的开始时间。任何建议都将不胜感激。