缺少参考帧,切片头解码错误

缺少参考帧,切片头解码错误

我把这个分开(http://www.auby.no/files/video_tests/h264_720p_mp_3.1_3mbps_aac_shrinkage.mp4) 视频使用 mp4box 命令“MP4Box -split 1 shrinking.mp4”分成每 1 秒的片段。我有以下问题:

尽管我以 1 秒为单位均匀地切割视频,但我得到的视频大小却不同。不知道这是怎么发生的?

当我尝试转储有关视频切片文件的信息时,我收到以下错误消息。有人能帮我理解它是什么吗,以及我如何修改上面的命令来摆脱它?生成的每个视频幻灯片都会发生此错误。此错误仅出现在切片视频上。

谢谢,/anil。

anilj@desk1:~/workspace/testprogs/shellscripts$ ffmpeg -i invideo/shrinking_01.mp4
ffmpeg version N-36083-g2501f93-xuggle-5.5 Copyright (c) 2000-2012 the FFmpeg developers
  built on Jun  3 2014 13:43:04 with gcc 4.6.4
  configuration: --prefix=/home/anilj/workspace/xugglehome --extra-version=xuggle-5.5 --extra-cflags=-I/home/anilj/workspace/xuggle-xuggler/build/native/x86_64-unknown-linux-gnu/captive/stage/home/anilj/workspace/xugglehome/include --extra-ldflags=-L/home/anilj/workspace/xuggle-xuggler/build/native/x86_64-unknown-linux-gnu/captive/stage/home/anilj/workspace/xugglehome/lib --disable-shared --enable-pic --enable-gpl --enable-nonfree --enable-libx264 --enable-version3 --enable-libmp3lame --enable-libvorbis --enable-libtheora --enable-libspeex --enable-libvo-aacenc --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-librtmp --enable-openssl --enable-zlib --enable-libvpx
  libavutil      51. 46.100 / 51. 46.100
  libavcodec     54. 14.101 / 54. 14.101
  libavformat    54.  3.100 / 54.  3.100
  libavdevice    53.  4.100 / 53.  4.100
  libavfilter     2. 67.101 /  2. 67.101
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0. 10.100 /  0. 10.100
  libpostproc    52.  0.100 / 52.  0.100
[h264 @ 0x1ddeac0] Missing reference picture
[h264 @ 0x1ddeac0] decode_slice_header error
[h264 @ 0x1ddeac0] Missing reference picture
[h264 @ 0x1ddeac0] decode_slice_header error
[h264 @ 0x1ddeac0] Missing reference picture
[h264 @ 0x1ddeac0] decode_slice_header error
[h264 @ 0x1ddeac0] Missing reference picture
[h264 @ 0x1ddeac0] decode_slice_header error
[h264 @ 0x1ddeac0] concealing 3600 DC, 3600 AC, 3600 MV errors
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'invideo/shrinking_01.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 1
    compatible_brands: isom
    creation_time   : 2014-06-19 20:21:02
  Duration: 00:00:00.90, start: 0.000000, bitrate: 38 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 30 kb/s, 29.96 fps, 29.96 tbr, 29956 tbn, 59.92 tbc
    Metadata:
      creation_time   : 2011-05-05 18:09:35
      handler_name    : ?Apple Video Media Handler
At least one output file must be specified

答案1

我不熟悉 MP4Box 的使用,但我可以解释一下幕后发生的情况。

为了解码视频,您首先需要一个入口点,也就是一张要引用的图片。此参考图片是通过帧内引用构建的,因此它独立于其他帧。其他帧将引用此帧和其他先前构建的帧,以便在解码时重新创建。值得注意的是,这些图片有时在编码顺序中的位置可能与在显示顺序中的位置不同。

好吧,你说你想要 1 秒长的视频,但我说除非至少在每一秒标记处都有 I 帧,否则这是不可能的。好吧,这是可能的,但这就像我说我可以做饭而不必担心我的食物是否可以食用一样。你可能以一秒为间隔进行剪辑,但视频在到达参考帧之前无法解码。

解决方案:ffmpeg 有一个分段器可以为您完成此操作,但结果不会完美地达到 1 秒长(这是不完美的,因为它无法真正处理某些编码顺序/pts 问题,一小部分情况)。当编码顺序中的帧出现在停止 I 帧(下一个片段的开始)后面,但在显示顺序中位于其前面时会发生什么?除了结尾之外,您在视频开头看到的情况相同。

您可以解码为原始格式,然后切片。您可以利用 I 帧检测和缓冲剪切进行大量操作(有趣)。

有很多方法可以做到这一点,并且根据内存/计算限制,您可以选择自己的方式。

我希望这可以解释您看到的错误并为您提供可能的解决方案。

相关内容