Estoy tratando de transmitir video en vivo desde mi Raspberry Pi 4 usando el códec h264_v4l2m2m (HWA). En el extremo receptor, estoy usando el decodificador de Broadway . Para resoluciones más bajas (320x320 a 60 fps), la calidad del video decodificado es buena. Sin embargo, cuando aumento la resolución empiezo a notar un extraño efecto de teselado como en las siguientes capturas:
Efecto de teselado en mayor resolución (960x960)
Probé otros códecs y reproductores (mpeg1video y jsmpeg como decodificador), pero a resoluciones más altas solo el H.264 acelerado por hardware alcanza una velocidad de fotogramas aceptable. Para mi aplicación particular no necesito audio.
Estoy ejecutando el siguiente comando para iniciar ffmpeg en un proceso separado:
ffmpeg -hide_banner -fflags nobuffer -f rawvideo -pixel_format yuv420p -s 960x960 \ -i tcp://127.0.0.1:15000?listen=1 -f h264 -codec:v h264_v4l2m2m -s 960x960 -profile:v 66 \ -level 4.2 -coder 0 -bf 0 -an -b:v 4M tcp://0.0.0.0:15001?listen=1Luego envío las unidades NAL H.264 usando un WebSocket.
El siguiente fragmento es mi aplicación de ejemplo ajustada para decodificar los marcos recibidos.
<!DOCTYPE html> <html> <head> <meta charset='utf-8'> <title>PiCamera H264 Streaming</title> </head> <body> <h1>PiCamera H264 Streaming</h1> <div id='viewer'></div> <script src='Decoder.js'></script> <script src='YUVCanvas.js'></script> <script src='Player.js'></script> <script> // player window.player = new Player({ useWorker: true, webgl: false }) var playerElement = document.getElementById('viewer') playerElement.appendChild(window.player.canvas) // Websocket var wsUri = window.location.protocol.replace(/http/, 'ws') + '//' + window.location.hostname + ':20000' var ws = new WebSocket(wsUri) ws.binaryType = 'arraybuffer' ws.onopen = function (e) { console.log('Client connected') ws.onmessage = function (msg) { // decode stream let data = new Uint8Array(msg.data); console.log(data); window.player.decode(data); } } ws.onclose = function (e) { console.log('Client disconnected') } </script> </body> </html>¿Qué me estoy perdiendo? ¿Hay alguna opción en ffmpeg, o podría ser que el decodificador no pueda procesar completamente los cuadros recibidos? He intentado varias configuraciones de tasa de bits en vano.
Al final encontré jmuxer que puede reproducir video H.264 en vivo sin ningún problema. Obtuve la pista de esta publicación .