[英]Decoding H.264 video from h264_v4l2m2m on Raspberry Pi 4
我正在尝试使用h264_v4l2m2m
编解码器 (HWA) 从我的 Raspberry Pi 4 直播视频。 在接收端,我使用的是Broadway解码器。 对于较低的分辨率(320x320 @ 60fps),解码的视频质量很好。 然而,当我提高分辨率时,我开始注意到一种奇怪的镶嵌效果,如下图所示:
我尝试了其他编解码器和播放器(mpeg1video 和jsmpeg作为解码器),但在更高分辨率下,只有硬件加速的 H.264 才能达到可接受的帧速率。 对于我的特定应用程序,我不需要音频。
我正在运行以下命令以在单独的进程上启动ffmpeg
:
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=1
然后我使用 WebSocket 发送 H.264 NAL 单元。
以下片段是我调整后的示例应用程序,用于解码接收到的帧。
<!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>
我错过了什么? 是 ffmpeg 上的某个选项,还是解码器无法完全处理接收到的帧。 我尝试了多种比特率设置均无济于事。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.