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

96

我想使用FFMPEG将标志添加到视频中。我遇到了这个错误:“输出流0:1缓冲的数据包过多”,“转换失败”。我尝试使用不同的图片和视频,但仍然得到相同的错误。Google也没有提供太多帮助。我找到了一个帖子。

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-static

视频详情:

    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

这不应该发生,但请尝试复制音频-filter_complex“overlay=0:0”-c:a copy ^ - Gyan
8
这是FFmpeg的已知问题。该问题中讨论的解决方法与@arc的回答中提到的相同,但一些人报告称必须使用更高的数字,例如-max_muxing_queue_size 9999 - doubleDown
我对-max_muxing_queue_size所使用的内存单位很好奇。有人能告诉我这里的内存单位是什么吗?(Mb、Kb……) - Appu Mistri
9个回答

192

1
我甚至使用了9999作为这个值,但仍然不起作用。有什么想法吗? - swdev
我在相机上禁用了音频流,没有这个选项它可以正常工作。在手册中,我读到关于FFmpeg的内容,它不会开始写入输出,直到它有每个这样的流的一个数据包。 - Orlov Const
@swdev 将其设置为高于9999的某个值。 - TylerH

61

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

-max_muxing_queue_size 9999
例如:
ffmpeg -i input.mp4 -max_muxing_queue_size 9999 out.mp4

33

这个问题可能已经在最新版本的ffmpeg中得到了“修复”。然而,根本原因似乎是有误的源文件内容,而不是ffmpeg的问题。

简而言之:解决这个问题有三种方法。

  1. 选择另一个源文件
  2. 应用ffmpeg命令参数(如上面其他人提到的)-max_muxing_queue_size 9999。但请注意,这会消耗更多的资源,并且根据您的系统和源文件的损坏情况程度,可能会导致ffmpeg崩溃。
  3. 自己构建一个定制版的ffmpeg,使用2020年11月23日之后发布的夜间构建版本(并希望一切顺利)。

细节... 细节... 对于好奇心强的人...

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

您可以通过这里的原始缺陷报告了解更多有关疑似原因的信息:https://trac.ffmpeg.org/ticket/6375

或者,您可以在此处简洁地了解更多:https://trac.ffmpeg.org/ticket/6375#comment:36

您将在此找到10月29日提交的代码更改,这可能会修复它(但请记住,这不是FFmpeg的问题……坦白说,这只是一个应急措施……虽然感谢解决它的开发人员……但真正的解决方案是使用不同的源文件!):https://github.com/FFmpeg/FFmpeg/commit/453b2f3c154f6b83221940ad411599ded91f7413


在这个回答中也最好指明最新的已损坏版本。 - Ciro Santilli OurBigBook.com
1
我发现这很难判断,因为任何人都可以自定义编译ffmpeg。受影响的文件是:fftools/ffmpeg.c | fftools/ffmpeg.h | fftools/ffmpeg_opt.c真正的解决方案是修复内容文件。 - MrPotatoHead

6
最近我也遇到了同样的问题。尝试了很多解决方案但都没有成功。后来我分析了错误信息,发现它说“数据包过多”,这意味着在录制或制作视频时,在给定的秒数内使用了太多数据包。所以我想,如果我将视频从给定的秒数裁剪到结束然后再尝试转换它,它就可以工作了。
下面是裁剪视频文件的命令。你可以根据需要进行调整。基本上,你的视频文件已经损坏了。如果你不介意从文件中裁剪一秒钟并使用它,那么这个解决方案是可行的。 裁剪:
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
"裁剪"根本不是一个决定。为什么你认为OP需要裁剪后的结果? - Alex Sham

0

我在升级版本4.0.2_1 -> 4.4_2后,问题得到了解决。

在Mac上运行:

brew install ffmpeg

这将会更新它。


仍在使用 ffmpeg 版本 5.1.2 进行操作。 - szeryf

0

我能够单独编码有问题的音频流。然后,我使用-c:a copy编码视频并将已完成的音频包含在内。

(显然,这只是一个解决方法而不是一个正确的修复方法,但对我来说有效。)


-1

我不知道这是否与此处的问题相关,但在尝试使用外部字幕硬编码文件时,我遇到了2帧错误。我尝试了各种方法,最终在我的情况下解决了它。

  1. 过滤器和复制一起使用存在问题 解决方案-我只使用了复制
  2. 关闭时队列中剩余2帧的错误 解决方案-删除字幕文件名称中存在的任何逗号(,)

-1
在我的情况下,我的输入文件也是由ffmpeg生成的,我正在连接(使用concat解复用器方法)多个png图像,并且正在使用-c:v copy,结果,输出文件的视频流(我将其用作下一个操作的输入文件并导致此错误)具有格式PNG而不是AVC或其他内容。我已经阅读了@MrPotatoHead的答案,并在进一步阅读后,我已经对发生了什么有了一定的理解。
因此,我只需在我的第一个操作中删除-c:v copy,我的第一个操作的视频流格式变为AVC,并且当我尝试将该输出文件用作下一个操作的输入时,错误不再出现。

-2
在我的情况下:
我正在使用:
ffmpeg -i downloaded.mp4 -ss -to -async 1 -c:v copy trimmed.mp4 

裁剪视频的一部分,

因此简单地删除过去的 -c:v copy 不会导致缓冲问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接