ffmpeg streaming para rtmp a 30fps

0

Estou tentando transmitir meu desktop para o servidor facebook rtmp usando o screen-capture-recorder:

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/..............

Estou usando o codec h264_nvenc para aceleração de gpu, mas posso transmitir para o rtmp com apenas 12 a 18 fps. No entanto, quando eu fluxo em um arquivo:

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

Eu recebo 30 fps sem problemas, mesmo quando estou jogando (por exemplo, Call of duty 6, muito drenagem HW).

Além disso, quando o streaming (para rtmp) é iniciado, depois de um tempo recebo esse erro, embora meu tamanho -rtbufsize seja 1024M, o que considero muito grande e muitos quadros são perdidos:

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

Você pode me ajudar a evitar erros de rtbufsize e é possível modificar meu comando para que eu possa transmitir para o rtmp a 30 fps? Obrigado

Se necessário, minha configuração de configuração do ffmpeg é:

ffmpeg versão 3.3.3 Copyright (c) 2000-2017 os desenvolvedores do FFmpeg construído com o gcc 7.1.0 (GCC) configuração: --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

    
por user6326558 24.01.2018 / 09:15

1 resposta

0

Para começar, eu perderia o individual -rtbufsize para cada entrada. Se o ffmpeg estiver atrasado, o aumento do buffer em tempo real não ajudará, a menos que você esteja tentando remediar picos ocasionais. Eu não tenho certeza de quanta headroom o ffmpeg reserva no windows, mas eu acho que é seguro assumir que se você estiver obtendo 12fps com a taxa de frames de saída configurada para 30, ele nunca vai alcançar. Basicamente, é possível gravar até 1GB da captura de tela para codificar mais tarde, agindo como um buffer de talvez um minuto, provavelmente mais curto antes de soltar quadros.

Você disse que conseguiu salvar a 30fps sem problemas, então provavelmente é a velocidade de upload para o facebook. Então você tem que fazer a saída menor, basicamente.

Tenho certeza que o ffmpeg lê todas as entradas como 25fps por padrão, então definir a saída para 25fps em vez de 30 provavelmente aumentaria seu fps para mais de 20 de graça. Eu não tenho certeza sobre como o dshow funciona, então eu posso estar errado sobre isso, se você realmente quer 30fps.

e eu notei que você colocou -b:v 8M para o codificador ... isso é realista para a sua conexão com a internet? Muitos provedores de internet vão acelerar os uploads para seus clientes residenciais, então você pode não conseguir fazer mais do que 3-4mbps, especialmente se quiser transmitir ao vivo.

Você deseja usar -preset=slow ou medium se for usar uma predefinição. Pode ser diferente para o codificador de hardware, então você pode querer verificar suas opções, mas com velocidades de rede como gargalos, não há muito o que fazer se você quiser streaming em tempo real, o vídeo tem que ser menor, seja na taxa de quadros , resolução ou compactação.

    
por 03.02.2018 / 08:17