ffmpeg для потоковой передачи в rtmp со скоростью 30 кадров в секунду

615
user6326558

Я пытаюсь транслировать свой рабочий стол на сервер 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

0

1 ответ на вопрос

0
user3052786

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

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

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

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

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

Похожие вопросы