Я пытаюсь транслировать свой рабочий стол на сервер Facebook RTMP с помощью устройства записи экрана:

ffmpeg -re -rtbufsize 256M -f dshow -i audio="Mikrofon (Realtek Audio)" 
-rtbufsize 256M -f dshow -i audio="virtual-audio-capturer"  
-rtbufsize 1024M -f dshow -i video=screen-capture-recorder -r 30  
-filter:v scale=1280:720 -c:v  h264_nvenc -pix_fmt yuv420p -preset fast 
-b:v 8M -maxrate:v 10M  -c:a aac -b:a 128k -ar 44100 
-f flv rtmp://live-api.facebook.com:80/rtmp/..............

Я использую кодек h264_nvenc для ускорения GPU, но я могу передавать в RTMP только 12-18 кадров в секунду. Тем не менее, когда я поток в файл:

ffmpeg -re  -rtbufsize 256M -f dshow -i audio="Mikrofon (Realtek Audio)" 
-rtbufsize 256M -f dshow -i audio="virtual-audio-capturer"  
-rtbufsize 1024M -f dshow -i video=screen-capture-recorder -r 30  
-filter:v scale=1280:720 -c:v  h264_nvenc -pix_fmt yuv420p -preset fast 
-b:v 8M -maxrate:v 10M  -c:a aac -b:a 128k -ar 44100 
D:\test.mp4 -y

Я получаю 30 кадров в секунду без проблем, даже когда играю в игру (например. Call of duty 6, хорошенькая HW слива).

Кроме того, когда начинается потоковая передача (в rtmp), через некоторое время я продолжаю получать эту ошибку, хотя мой размер -rtbufsize составляет 1024M, что я считаю довольно большим, и многие кадры теряются:

real-time buffer too full or near too full! frame dropped!

Можете ли вы помочь мне, как предотвратить ошибку rtbufsize, и можно ли изменить мою команду, чтобы я мог передавать поток в rtmp со скоростью 30 кадров в секунду? Спасибо

При необходимости мой конфигурационный файл сборки ffmpeg:

ffmpeg версия 3.3.3 Copyright (c) 2000-2017 разработчики FFmpeg, созданные с конфигурацией gcc 7.1.0 (GCC): --disable-static --enable-shared --enable-gpl --enable-version3 --enable- cuda --enable-cuvid --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable- gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable- libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable -libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-zlib

1 ответ1

0

Для начала я бы потерял индивидуальный -rtbufsize для каждого ввода. Если ffmpeg отстает, увеличение буфера в реальном времени не поможет, если только вы не пытаетесь исправить случайные пики. Я не уверен, сколько запаса ffmpeg резервирует на окнах, но я думаю, можно с уверенностью предположить, что если вы получаете 12 кадров в секунду с частотой кадров на выходе, равной 30, это никогда не наверстает упущенное. Это в основном запись до 1 ГБ снимка экрана для последующего кодирования, выступающего в качестве буфера, возможно, минуты, возможно, короче, прежде чем он пропускает кадры.

Вы сказали, что можете без проблем сохранить в файл со скоростью 30 кадров в секунду, так что это, вероятно, скорость загрузки в Facebook. Таким образом, вы должны сделать вывод меньше, в основном.

Я почти уверен, что ffmpeg по умолчанию считывает все входные данные как 25fps, поэтому установка выходного значения 25fps вместо 30, вероятно, увеличит ваш fps до более 20 бесплатно. Я не уверен в том, как работает dshow, поэтому я могу ошибаться, если вы действительно хотите 30fps.

и я только что заметил, что вы поставили -b:v 8M для кодировщика ... это реально для вашего интернет-соединения? Многие интернет-провайдеры будут ограничивать загрузку для своих частных клиентов, поэтому вы не сможете делать больше, чем 3-4 Мбит / с, особенно если вы хотите транслироваться в прямом эфире.

Вы хотите использовать -preset=slow или medium если собираетесь использовать пресет. Он может отличаться для аппаратного кодировщика, поэтому вы можете проверить его параметры, но с узкими местами для скорости сети вы ничего не сможете сделать, если хотите потоковую передачу в реальном времени, видео должно быть меньше, либо по частоте кадров разрешение или сжатие.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .