为什么ffmpeg以.ts格式开始时间非零?

时间:2014-01-22 12:19:37

标签: video ffmpeg avi

我正在使用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

1 个答案:

答案 0 :(得分:1)

当与mpegts混合时,ffmpeg将默认延迟应用于生成的时间戳。我认为这是为了应对现场情况,在这种情况下,确保生成的视频具有正确的时间戳很重要。

默认延迟为0.7秒(您可以在ffmpeg_opt.c中看到),但是如果是mpegts,则将其乘以2。为什么?我不太确定。我可以追溯到大约8年前的一次承诺,该承诺与增加对VBR混合的支持有关,但是我无法确定根本原因是什么。

无论如何,您最可能想做的就是通过在命令行中添加-muxdelay 0将多路复用延迟设置为0。这样,您在.ts文件中获得的开始时间将与在.mp4,.webm或.mov文件中获得的开始时间相同。