繁体   English   中英

在 Raspberry Pi 4 上从 h264_v4l2m2m 解码 H.264 视频

[英]Decoding H.264 video from h264_v4l2m2m on Raspberry Pi 4

问题总结

我正在尝试使用h264_v4l2m2m编解码器 (HWA) 从我的 Raspberry Pi 4 直播视频。 在接收端,我使用的是Broadway解码器。 对于较低的分辨率(320x320 @ 60fps),解码的视频质量很好。 然而,当我提高分辨率时,我开始注意到一种奇怪的镶嵌效果,如下图所示:

对更高分辨率 (960x960) 的镶嵌效果

我尝试了其他编解码器和播放器(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 上的某个选项,还是解码器无法完全处理接收到的帧。 我尝试了多种比特率设置均无济于事。

最后我发现jmuxer可以毫无问题地播放实时 H.264 视频。 我从这篇文章中得到了提示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM