实时缓冲区太满 (FFMPEG)

Real-Time Buffer Too Full (FFMPEG)

所以我一直在使用 ffmpeg 遇到这个问题,让硬件和命令真正执行我想做的事情是一段旅程,但我仍然有一个问题。

有时,当我在录制时,我开始疯狂丢帧,这可能是在录制一个小时甚至十个小时之后......一切都会正常工作,然后突然我会开始丢帧,因为到 "real-time buffer too full or near too full"。无论我将比特率放多低,缓冲区大小都允许,这种情况都会发生,最终我会开始丢帧。几乎看起来像是启动了省电功能,但它看起来太不一致了。就像我说的,有时我可以坚持 10 个小时而不会遇到这个问题。

有什么想法吗?

这是我的代码块:

ffmpeg -guess_layout_max 0 -y -f dshow -video_size 3440x1440 -rtbufsize 2147.48M -pixel_format nv12 -framerate 200 ^
-i video="Video (00 Pro Capture HDMI 4K+)":audio="SPDIF/ADAT (1+2) (RME Fireface UC)" -map 0:0,0:1 -map 0:1 ^
-preset: llhp -codec:v h264_nvenc -pix_fmt nv12 -b:v 250M -maxrate:v 250M -minrate:v 250M -bufsize:v 250M -b:a 320k ^
-ac 2 -r 100 -async 1 -vsync 1 -segment_time 600 -segment_wrap 9 -f segment C:\Users\djcim\Videos\PC\PC%02d.mp4 ^
-guess_layout_max 0 -f dshow -rtbufsize 2000M -i audio="Analog (3+4) (RME Fireface UC)" -map 1:0 -b:a 320k -ac 2 ^
-af "adelay=200|200" -segment_time 600 -segment_wrap 9 -f segment C:\Users\djcim\Videos\PC\Voices\Theirs\TPC%02d.wav ^
-guess_layout_max 0 -f dshow -rtbufsize 2000M -i audio="Analog (5+6) (RME Fireface UC)" -map 2:0 -b:a 320k -ac 2 ^
-af "adelay=825|825" -segment_time 600 -segment_wrap 9 -f segment C:\Users\djcim\Videos\PC\Voices\Mine\MPC%02d.wav

这是错误,它在锁定 ffmpeg 之前重复了大约 300 次,迫使我在再次开始录制之前退出:

[dshow @ 0000019a596bdcc0] real-time buffer [Video (00 Pro Capture HDMI 4K+)] [video input] too full or near too full (62% of size: 2147480000 [rtbufsize parameter])! frame dropped!

解决了,

认为解决方案是对 h.265 进行编码,但出于某种原因根本无法正常工作,认为这可能是我的构建,所以我获得了最新的夜间构建。仍然无法让 h.265 工作,所以我回到 h.264 并开始收到一个我从未见过的新警告,然后告诉我我的 "thread queue size" 太低了。经过几个小时的反复试验/发现每个输入都有一个线程队列大小,我最终得到了这段代码:

ffmpeg -y -thread_queue_size 5096 -guess_layout_max 0 -f dshow -video_size 3440x1440 -rtbufsize 2147.48M -framerate 200 ^
-pixel_format nv12 -i video="Video (00 Pro Capture HDMI 4K+)":audio="SPDIF/ADAT (1+2) (RME Fireface UC)" -map 0:0,0:1 ^
-map 0:1 -preset: llhp -c:v h264_nvenc -pix_fmt nv12 -b:v 250M -minrate 250M -maxrate 250M -bufsize 250M -b:a 320k -ac 2 ^
-r 100 -async 1 -vsync 1 -segment_time 600 -segment_wrap 9 -f segment C:\Users\djcim\Videos\PC\PC%02d.mp4 ^
-guess_layout_max 0 -thread_queue_size 5096 -f dshow -rtbufsize 2000M -i audio="Analog (3+4) (RME Fireface UC)" -map 1:0 ^
-b:a 320k -ac 2 -af "adelay=200|200" -segment_time 600 -segment_wrap 9 -f segment ^
C:\Users\djcim\Videos\PC\Voices\Theirs\TPC%02d.wav ^
-guess_layout_max 0 -thread_queue_size 5096 -f dshow -rtbufsize 2000M -i audio="Analog (5+6) (RME Fireface UC)" -map 2:0 ^
-b:a 320k -ac 2 -af "adelay=825|825" -segment_time 600 -segment_wrap 9 -f segment ^
C:\Users\djcim\Videos\PC\Voices\Mine\MPC%02d.wav

基本上我向每个输入添加了 -thread_queue_size 5096,从那以后就没有在摄取时丢失一帧。一切都保持同步,镜头非常流畅。