提取视频部分内容时进行 Ffmpeg 同步

提取视频部分内容时进行 Ffmpeg 同步

这个问题可以看作是这个问题。我正在使用ffmpeg 2.0.1。

当您想要根据时间标记提取一个大视频文件的部分内容时,以下命令很有用。

ffmpeg -i 00402.MTS -s 1280x720 -ss 0:00:05.38608 -vcodec libxvid -qscale:v 2 -acodec ac3 -ar 48000 -ab 256k -t 0:00:06.61391 m001.avi

我的问题是,在输出文件中,起始值为 0,音频和视频之间有约 50ms 的偏移。在提取大视频文件 ('.mts') 的几个部分时,我应该使用什么参数来考虑这个“起始值”?这个“起始值”是什么意思?

ffprobe 从大型 MTS 视频文件输出

ffprobe m001.MTS 
ffprobe version 2.0.1 Copyright (c) 2007-2013 the FFmpeg developers built on Sep 24 2013 05:31:18 with gcc 4.8 (Debian 4.8.1-10)
configuration: --extra-cflags=-I../static/include --extra-ldflags='-L../static/lib -static' --enable-gpl --enable-version3 --enable-static --disable-shared --disable-debug --enable-runtime-cpudetect --enable-libmp3lame --enable-libx264 --enable-libspeex --enable-libvorbis --enable-libvpx --enable-libfreetype --enable-libxvid --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-gray --enable-libopenjpeg --disable-ffserver
libavutil      52. 38.100 / 52. 38.100
libavcodec     55. 18.102 / 55. 18.102
libavformat    55. 12.100 / 55. 12.100
libavdevice    55.  3.100 / 55.  3.100
libavfilter     3. 79.101 /  3. 79.101
libswscale      2.  3.100 /  2.  3.100
libswresample   0. 17.102 /  0. 17.102
libpostproc    52.  3.100 / 52.  3.100
Input #0, mpegts, from 'm001.MTS':
Duration: 00:01:18.25, start: 0.455556, bitrate: 12217 kb/s
Program 1 
Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), yuv420p, 1440x1080 [SAR 4:3       DAR 16:9], 25 fps, 50 tbr, 90k tbn, 50 tbc
Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 256 kb/s

提取样本的 ffprobe 输出

Input #0, avi, from 'm001.avi':
Metadata:
encoder         : Lavf55.12.100
Duration: 00:00:06.64, start: 0.000000, bitrate: 4950 kb/s
Stream #0:0: Video: mpeg4 (Simple Profile) (xvid / 0x64697678), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 25 tbr, 25 tbn, 25 tbc
Stream #0:1: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, mono, fltp, 256 kb/s

答案1

我以前遇到过这个问题,唯一的解决办法是使用itsoffset和map。

ffmpeg -i 00402.MTS -itsoffset 0.455556 -i 00402.MTS -map 1:0 -map 0:1 -s 1280x720 -ss 0:00:05.38608 -vcodec libxvid -qscale:v 2 -acodec ac3 -ar 48000 -ab 256k -t 0:00:06.61391 m001.avi

这个页面很好地解释了它为什么以及如何工作。

http://www.kkoncepts.net/blog/fixing-out-sync-audio-and-video-ffmpeg
(原始链接已不再可用;现在来自 web-beta.archive.org)

编辑这里有两个主要工具需要注意:1)itsoffset 2)map

itsoffset 用于偏移不同步的流,而 map 则通知 ffmpeg 使用来自特定输入的某些流并将其应用于输出。

在这个例子中,我们两次使用相同的输入,这样映射流:我们使用第一个输入的视频流(似乎从 00:00:00.00 开始)我们使用第二个输入作为音频流,但偏移输入时间 0.455556 秒。

来自上述网站:

这里“-map 1:0”告诉 ffmpeg 使用第二个输入文件 (1) 并将其第一个流 (0) 作为视频源。由于这是“-itsoffset”开关后面的输入,因此该流将被延迟。然后“-map 0.1”告诉它使用第一个输入的第二个流作为音频。由于没有对第一个输入文件应用偏移,因此它将被正常处理。

相关内容