我正在使用ffmpeg将视频转码为.ts格式,并且我在输出文件中获得了意外的开始时间。
为简化起见,我开始使用一个简单的AVI文件(没有音频):
ffmpeg -i in.avi
...
Input #0, avi, from 'in.avi':
Metadata:
encoder : Lavf55.25.100
Duration: 00:00:05.00, start: 0.000000, bitrate: 448 kb/s
Stream #0:0: Video: mpeg4 (Simple Profile) (FMP4 / 0x34504D46), yuv420p, 480x270 [SAR 1:1 DAR 16:9], 24 tbr, 24 tbn, 24 tbc
持续时间= 5秒, startTime = 0s ,正如所料。
但是,如果我转码为.ts文件,没有自定义:
ffmpeg -i in.avi -y out.ts
...
Input #0, avi, from 'in.avi':
Metadata:
encoder : Lavf55.25.100
Duration: 00:00:05.00, start: 0.000000, bitrate: 448 kb/s
Stream #0:0: Video: mpeg4 (Simple Profile) (FMP4 / 0x34504D46), yuv420p, 480x270 [SAR 1:1 DAR 16:9], 24 tbr, 24 tbn, 24 tbc
Output #0, mpegts, to 'out.ts':
Metadata:
encoder : Lavf55.25.100
Stream #0:0: Video: mpeg2video, yuv420p, 480x270 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 90k tbn, 24 tbc
Stream mapping:
Stream #0:0 -> #0:0 (mpeg4 -> mpeg2video)
Press [q] to stop, [?] for help
frame= 120 fps=0.0 q=31.0 Lsize= 315kB time=00:00:04.95 bitrate= 519.9kbits/s dup=1 drop=0
video:277kB audio:0kB subtitle:0 global headers:0kB muxing overhead 13.491544%
然后我得到一个非常奇怪的参数(持续时间= 4:96s, startTime = 1.441667 ):
ffmpeg -i out.ts
...
Input #0, mpegts, from 'out.ts':
Duration: 00:00:04.96, start: 1.441667, bitrate: 519 kb/s
Program 1
Metadata:
service_name : Service01
service_provider: FFmpeg
Stream #0:0[0x100]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv), 480x270 [SAR 1:1 DAR 16:9], max. 104857 kb/s, 24 fps, 24 tbr, 90k tbn, 48 tbc
现在,我可以理解为什么转码可能丢失几帧,这解释了持续时间,但我不明白为什么开始时间应该与AVI文件的开始时间有任何不同。
我尝试过转码为.mp4,.webm和.mov,并且在每种情况下我们都得到0.0s的'正确'开始时间。任何人都可以帮助解释为什么.ts文件的行为不同吗?
提前致谢!
(ffmpeg版本信息:)
ffmpeg version N-60031-ga459891 Copyright (c) 2000-2014 the FFmpeg developers
built on Jan 21 2014 05:31:54 with gcc 4.6 (Debian 4.6.3-1)
configuration: --prefix=/root/ffmpeg-static/64bit --extra-cflags='-I/root/ffmpeg-static/64bit/include -static' --extra-ldflags='-L/root/ffmpeg-static/64bit/lib -static' --extra-libs='-lxml2 -lexpat -lfreetype' --enable-static --disable-shared --disable-ffserver --disable-doc --enable-bzlib --enable-zlib --enable-postproc --enable-runtime-cpudetect --enable-libx264 --enable-gpl --enable-libtheora --enable-libvorbis --enable-libmp3lame --enable-gray --enable-libass --enable-libfreetype --enable-libopenjpeg --enable-libspeex --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-version3 --enable-libvpx
libavutil 52. 63.100 / 52. 63.100
libavcodec 55. 48.102 / 55. 48.102
libavformat 55. 25.100 / 55. 25.100
libavdevice 55. 5.102 / 55. 5.102
libavfilter 4. 1.100 / 4. 1.100
libswscale 2. 5.101 / 2. 5.101
libswresample 0. 17.104 / 0. 17.104
libpostproc 52. 3.100 / 52. 3.100
答案 0 :(得分:1)
当与mpegts
混合时,ffmpeg将默认延迟应用于生成的时间戳。我认为这是为了应对现场情况,在这种情况下,确保生成的视频具有正确的时间戳很重要。
默认延迟为0.7秒(您可以在ffmpeg_opt.c
中看到),但是如果是mpegts,则将其乘以2。为什么?我不太确定。我可以追溯到大约8年前的一次承诺,该承诺与增加对VBR混合的支持有关,但是我无法确定根本原因是什么。
无论如何,您最可能想做的就是通过在命令行中添加-muxdelay 0
将多路复用延迟设置为0。这样,您在.ts文件中获得的开始时间将与在.mp4,.webm或.mov文件中获得的开始时间相同。