FFMPEG:为输出流0:1缓冲的数据包太多

时间:2018-04-06 05:53:16

标签: ffmpeg

我想使用FFMPEG为视频添加徽标。我遇到了这个错误:“为输出流0:1缓冲了太多的数据包。”,“转换失败。”。我试过不同的图片和视频,总是得到同样的错误。谷歌也没多大帮助。我找到了一个帖子

C:\Users\Anwender\OneDrive - IT-Center Engels\_Programmierung & Scripting\delphi\_ITCE\Tempater\Win32\Debug\ffmpeg\bin>ffmpeg ^
Mehr? -i C:\Users\Anwender\Videos\CutErgebnis.mp4 ^
Mehr? -i C:\Users\Anwender\Pictures\pic.png ^
Mehr? -filter_complex "overlay=0:0" ^
Mehr? C:\Users\Anwender\Videos\Logo.mp4
ffmpeg version N-90054-g474194a8d0 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 7.2.0 (GCC)
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-bzlib --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libmfx --enable-amf --enable-cuda --enable-cuvid --enable-d3d11va --enable-nvenc --enable-dxva2 --enable-avisynth
  libavutil      56.  7.101 / 56.  7.101
  libavcodec     58. 11.101 / 58. 11.101
  libavformat    58.  9.100 / 58.  9.100
  libavdevice    58.  1.100 / 58.  1.100
  libavfilter     7. 12.100 /  7. 12.100
  libswscale      5.  0.101 /  5.  0.101
  libswresample   3.  0.101 /  3.  0.101
  libpostproc    55.  0.100 / 55.  0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\Users\Anwender\Videos\CutErgebnis.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.9.100
    comment         : Captured with Snagit 13.1.3.7993
                    : Microphone - Mikrofon (Steam Streaming Microphone)
                    :
  Duration: 00:01:51.99, start: 0.015011, bitrate: 148 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1918x718 [SAR 1:1 DAR 959:359], 149 kb/s, 14.79 fps, 15 tbr, 15k tbn, 30 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 1 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
Input #1, png_pipe, from 'C:\Users\Anwender\Pictures\pic.png':
  Duration: N/A, bitrate: N/A
    Stream #1:0: Video: png, pal8(pc), 400x400, 25 tbr, 25 tbn, 25 tbc
File 'C:\Users\Anwender\Videos\Logo.mp4' already exists. Overwrite ? [y/N] y
Stream mapping:
  Stream #0:0 (h264) -> overlay:main (graph 0)
  Stream #1:0 (png) -> overlay:overlay (graph 0)
  overlay (graph 0) -> Stream #0:0 (libx264)
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
Too many packets buffered for output stream 0:1.
[aac @ 000001f4c5257a40] Qavg: 65305.387
[aac @ 000001f4c5257a40] 2 frames left in the queue on closing
Conversion failed!

我的FFMPEG版本: FFMPEG-20180322-ed0e0fe-Win64的静电

有关视频的详情:

    C:\Users\Anwender\OneDrive - IT-Center Engels\_Programmierung & Scripting\delphi\_ITCE\Tempater\Win32\Debug\ffmpeg-20180322-ed0e0fe-win64-static\bin>ffprobe.exe C:\Users\Anwender\Videos\CutErgebnis.mp4
ffprobe version N-90399-ged0e0fe102 Copyright (c) 2007-2018 the FFmpeg developers
  built with gcc 7.3.0 (GCC)
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-bzlib --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth
  libavutil      56. 11.100 / 56. 11.100
  libavcodec     58. 15.100 / 58. 15.100
  libavformat    58. 10.100 / 58. 10.100
  libavdevice    58.  2.100 / 58.  2.100
  libavfilter     7. 13.100 /  7. 13.100
  libswscale      5.  0.102 /  5.  0.102
  libswresample   3.  0.101 /  3.  0.101
  libpostproc    55.  0.100 / 55.  0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\Users\Anwender\Videos\CutErgebnis.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.9.100
    comment         : Captured with Snagit 13.1.3.7993
                    : Microphone - Mikrofon (Steam Streaming Microphone)
                    :
  Duration: 00:01:51.99, start: 0.015011, bitrate: 148 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1918x718 [SAR 1:1 DAR 959:359], 149 kb/s, 14.79 fps, 15 tbr, 15k tbn, 30 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 1 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

7 个答案:

答案 0 :(得分:30)

尝试在视频选项的末尾添加此选项:

-max_muxing_queue_size 1024

这对我有用。我在这里发现了这个: https://discussion.mcebuddy2x.com/t/ffmpeg-bug-too-many-packets-buffered-for-output-stream/1148

答案 1 :(得分:11)

此问题可能已在最近的 ffmpeg 版本中“修复”。然而,根本原因似乎是错误的源文件内容而不是 ffmpeg。

TL;DR:有 3 种方法可以解决这个问题。

  1. 选择不同的源文件
  2. 应用 -max_muxing_queue_size 9999 的 ffmpeg 命令参数(如上面提到的其他参数)但是,请注意这是资源密集型的,并且取决于您的系统以及源文件格式错误的严重程度,可能会导致 ffmpeg 崩溃。
  3. 使用 2020 年 11 月 23 日之后发布的每晚版本为自己构建一个自定义版本的 ffmpeg(并希望一切顺利)。

详细信息...详细信息...用于探究思想...

-max_muxing_queue_size 9999 告诉 ffmpeg 为缓存视频帧分配额外的内存。基本上发生的事情是源文件视频帧的结构存在问题,而 ffmpeg 试图跟踪文件中的早期帧,直到它能够弄清楚它应该如何组织。这样做意味着 ffmpeg 必须消耗更多内存。有时,更多。 “9999”是一个任意值,您几乎可以将其视为将其设置为无穷大;这意味着,使用这种方法可能会耗尽 RAM(很少见,但可能...并且高度依赖于您的硬件)。

您可以在此处阅读 ffmpeg 中所谓的“修复”:

您可以通过此处的原始缺陷报告阅读有关可疑原因的更多信息:https://trac.ffmpeg.org/ticket/6375

或者,在这里更简洁地解释:https://trac.ffmpeg.org/ticket/6375#comment:36

您会在这里找到可能修复它的 10 月 29 日提交的代码更改(但再次记住,这并不是 ffmpeg 的错……所以,坦率地说,这是一个创可贴修复……谢谢解决它的开发人员...但真正的解决方法是使用不同的源文件!):https://github.com/FFmpeg/FFmpeg/commit/453b2f3c154f6b83221940ad411599ded91f7413

答案 2 :(得分:1)

同样的问题发生在我之前的片刻。我尝试了很多解决方案,但无法解决这个问题。然后我分析了误差。它说太多的数据包缓冲意味着,当录制开始或视频制作时,在给定的第二个太多数据包用于记录该时刻。所以我想如果我从给定的秒到结束裁剪视频然后我尝试转换使其工作。它奏效了。以下是裁剪视频文件的命令。您可以根据要求进行调整。基本是你的视频文件已损坏。如果您可以从文件中裁剪一秒并使用它,那么此解决方案就可以了。

裁剪 -

ffmpeg -i video.mp4 -ss 00:00:05 -t 00:03:14 -async 1 cut.mp4

然后我试图转换文件并发现此问题的命令。

转换 -

ffmpeg -i cut.mp4 -crf 32 output2.mp4
希望它会有所帮助。

答案 3 :(得分:0)

我通过添加此选项(ffmpeg版本3.4.6)解决了问题:

-max_muxing_queue_size 9999

例如:

ffmpeg -i input.mp4 -max_muxing_queue_size 9999 out.mp4

答案 4 :(得分:0)

我不知道这是否与这里的问题有关,但是我在尝试硬字幕带有外部字幕的文件时遇到了 2 帧错误。我尝试了各种方法,终于在我的情况下解决了。

  1. 过滤器和副本无法协同工作时出现了一些问题 解决方案 - 我只是使用了副本
  2. 关闭错误时队列中剩余的 2 帧 解决方案 - 删除了我的字幕文件名称中存在的所有逗号 (,)

答案 5 :(得分:-1)

就我而言,我的输入文件也是由 ffmpeg 生成的,我连接(使用 concat 分路器方法)多个 png 图像并使用 -c:v copy,因此,视频流输出文件(我用作下一个操作的输入文件并导致此错误)的 FormatPNG 而不是 AVC 或其他内容。我已经阅读了@MrPotatoHead 的回答,在阅读更多内容后,我对发生的事情有所了解。

所以我在第一次操作中简单地删除了 -c:v copy 并且我第一次操作的视频流格式变成了 AVC 并且当我尝试使用该输出文件作为我的下一个输入时不再出现错误操作。

答案 6 :(得分:-1)

就我而言:

我正在使用:

ffmpeg -i downloaded.mp4 -ss -to -async 1 -c:v copy trimmed.mp4 

裁剪视频的一部分,

所以简单地删除过去的 -c:v copy 不会导致缓冲区问题