FFMPEG:为输出流 0:1 缓冲的数据包过多
Posted
技术标签:
【中文标题】FFMPEG:为输出流 0:1 缓冲的数据包过多【英文标题】:FFMPEG: Too many packets buffered for output stream 0:1 【发布时间】:2018-09-16 02:17:32 【问题描述】:我想使用 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
【问题讨论】:
这不应该发生,但尝试复制音频-filter_complex "overlay=0:0" -c:a copy ^
这是a known issue on FFmpeg。该问题中讨论的解决方法与@arc 的答案中提到的解决方法相同,但有些人报告说必须使用更高的数字,例如-max_muxing_queue_size 9999
.
我很好奇-max_muxing_queue_size
使用的内存单元。谁能告诉我这里的内存单位是什么? (Mb, Kb....)
【参考方案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
【讨论】:
作物根本不是一个决定。您为什么认为 OP 需要裁剪结果?【参考方案2】:尝试在视频选项末尾添加此选项以增加队列大小:
-max_muxing_queue_size 1024
这对我有用,但您可能需要更高的值,例如 2048 甚至 4096。我在这里找到了相关信息: https://discussion.mcebuddy2x.com/t/ffmpeg-bug-too-many-packets-buffered-for-output-stream/1148
【讨论】:
我什至用 9999 作为这个值,但还是不行。有什么想法吗? 我禁用了相机上的音频流,没有此选项它可以正常工作。在手册中,我阅读了有关 ffmpeg 的信息,它在每个此类流都有一个数据包之前不会开始写入输出。 @swdev 将其设置为高于 9999 的值。【参考方案3】:我通过添加这个选项解决了(ffmpeg 版本 3.4.6):
-max_muxing_queue_size 9999
例如:
ffmpeg -i input.mp4 -max_muxing_queue_size 9999 out.mp4
【讨论】:
【参考方案4】:此问题可能已在最近的 ffmpeg 版本中“修复”。但是,根本原因似乎是源文件内容错误,而不是 ffmpeg。
TL;DR:有 3 种方法可以解决这个问题。
-
选择不同的源文件
应用
-max_muxing_queue_size 9999
的 ffmpeg 命令参数(如上所述)但是,请注意这是资源密集型的,并且取决于您的系统以及源文件格式错误的严重程度,可能会导致 ffmpeg 崩溃。
使用 2020 年 11 月 23 日之后发布的每晚构建版本为自己构建一个自定义版本的 ffmpeg(希望一切顺利)。
详细信息...详细信息...求知欲...
-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
【讨论】:
最好在这个答案中指定最新的损坏版本。 我觉得这很难判断,因为任何人都可以自定义编译 ffmpeg。受影响的文件是:fftools/ffmpeg.c | fftools/ffmpeg.h | fftools/ffmpeg_opt.c 真正的解决方案是修复内容文件。【参考方案5】:在我的情况下,我的输入文件也是由 ffmpeg 生成的,我正在连接(使用concat
demuxer 方法)多个 png 图像并使用-c:v copy
,因此,输出文件的视频流(我用作下一个操作的输入文件并导致此错误)具有PNG
的Format
而不是AVC 或其他东西。我已经阅读了@MrPotatoHead 的答案,并且在阅读了更多内容之后,我对发生了什么有所了解。
所以我在第一次操作中简单地删除了-c:v copy
,我第一次操作的视频流格式变成了 AVC,当我尝试使用该输出文件作为下一次操作的输入时,错误不再出现。
【讨论】:
【参考方案6】:我不知道这是否与这里的问题有关,但我在尝试使用外部字幕硬分送文件时遇到 2 帧错误。我尝试了各种方法,最终在我的情况下解决了它。
-
过滤器和复制无法协同工作存在一些问题
解决方案 - 我只是使用了副本
关闭错误时队列中剩余 2 帧
解决方案 - 删除了我的字幕文件名称中存在的所有逗号 (,)
【讨论】:
【参考方案7】:就我而言:
我正在使用:
ffmpeg -i downloaded.mp4 -ss -to -async 1 -c:v copy trimmed.mp4
裁剪一部分视频,
所以简单地删除过去的 -c:v copy
不会导致缓冲区问题
【讨论】:
【参考方案8】:从4.0.2_1 -> 4.4_2
版本升级后,此问题已修复。
在 Mac 上,运行:
brew install ffmpeg
这将更新它。
【讨论】:
【参考方案9】:我能够单独编码错误的音频流。然后我对视频进行了编码,并将已经完成的音频包含在-c:a copy
中。
(这显然是一种解决方法,而不是正确的修复方法,但它对我有用。)
【讨论】:
以上是关于FFMPEG:为输出流 0:1 缓冲的数据包过多的主要内容,如果未能解决你的问题,请参考以下文章