正在上传图片(0/1)

【重磅干货】H264硬件解码Sample(基于妙算2-G)

 9
手机看帖 26 11627


   各位论坛的小伙伴们,好久不见!
   今天准备给大家分享一个 H264 的硬件解码 sample

   在分享之前先说说问题的背景
   不知道你之前在使用 DJI OSDK 获取视频流时是否会有这样的苦恼
   
   
     我不就是跑个视频流 Sample 吗,为啥 CPU 占用率都上 200% 了
     或者遇到这样的情况
     
     
      这延迟得有 400 多毫秒了吧,比我手机玩 DOTA 延迟高了五六倍不止

      

       好吧,仔细分析,你会发现造成延迟和占用率高的主要原因都是 H264 进行 CPU 软件解码造成的

      

        为了不让 CPU 作为背锅侠,我们今天我们试着一起来跑一下 H264 硬件解码的 sample
        废话不多说,Sample 开源代码我丢这里了
         camera_h264_hardware_decode_sample.zip (16.99 KB, 下载次数: 870)              
       1. Sample 运行环境
       OSDK :OSDK 4.0.1 或者更高版本   https://github.com/dji-sdk/Onboard-SDK
        平   台:妙算2-G   https://www.dji.com/cn/manifold-2
        飞行器:M200 V2, M300 RTK  https://www.dji.com/cn/matrice-300
        相  机:H20, Z30 https://www.dji.com/cn/zenmuse-h20-series

       2. 安装依赖工具
        2.1 安装 gstreamer
         妙算2-G 已经安装有 gstreamer,并支持硬件解码,所以本步骤可以跳过
        2.2 安装 gstreamer lib
         sudo apt-get install libgstreamer-plugins-base1.0
                     
       2.3  检查 gst-inspect 是否安装成功
         gst-inspect-1.0 | grep -E "h264parse|omxh264dec|nveglglessink"
         
        
        3. 准备Sample
        3.1 将本例的 Sample 复制到 OSDK 的代码包中                                   
         复制的目标位置 onboard-sdk/sample/platform/linux/advanced-sensing/
         
        3.2 修改 CMakeLists.txt
         文件位置 onboard-sdk/sample/platform/linux/advanced-sensing/CMakeLists.txt
         在 46 行后添加 add_subdirectory(camera_h264_hardware_decode_sample)
         
        3.3 编译
         cd onboard-sdk/
         mkdir build
         cd build
         cmake ..
         make -j6 camera-h264-hardware-decode-sample
         
         正常情况下,编译成功,如上图提示。

       4. 运行和验证 Sample
       4.1 复制 UserConfig.txt 到 onboard-sdk/build/bin 当中
         cp ../sample/platform/linux/common/UserConfig.txt ./bin
         
         编辑该文件
         添加一行 acm_port : /dev/ttyACM0
         添加 APP ID  和 APP Key
         
         关于环境搭建和硬件连接可以参考如下链接:
         https://developer.dji.com/cn//32bc1c7e-6c55-421f-afc9-fc99437b5392
       4.2 运行 Sample 观察结果
         ./camera-h264-hardware-decode-sample ./UserConfig.txt
         
         选择云台挂载的位置,一般我们都会挂载在1号位,可以选择 a
         
         CPU 占用率骤降 140%
                         
         延迟骤降 200+ms !
         
        接下来我们 简单分析下 Sample 的代码内容
            
        Sample 总共 只有9个文件,主要由三部分组成,如上图红框所示
        红框1:负责H264的硬件解码
        红框2:负责解码后的RGB显示
        红框3:IDR帧的十六进制编码表
        其余文件
           camera_h264_hardware_decode_sample.cpp: sample 代码运行入口
           README.md:操作和使用介绍
           CMakeLists.txt:Cmake配置文件

        关于代码的运行流程,我这里 贴一张程序流程图
      
     其实,硬件解码已经交给 Gstreamer 去做了,我们只需要在 init 阶段配置下解码参数即可
     
     关于 Gstreamer 的使用可以参考 https://gstreamer.freedesktop.org/ 这里我们不做过多阐述

     开发者更应该关注的 核心点在于 怎么解码 GDR 格式的 H264 码流          
     最新的 Z30 固件和 H20 输出的 H264 码流都是 GDR 编码格式,所以普通的 IDR 解码方式在这里不适用。
     如果你还不是很了解什么是 GDR 或者 IDR,可以参考 Winddoing 网友的分享   
     https://winddoing.github.io/post/35564.html

     这里我们介绍一种 “Insert the black I frame” 的方法   
     让 Gstreamer 也能解码 GDR 编码格式的 H264 码流
     核心要领就是造一个 black I frame 的二进制编码表
     Sample 里面已经分别提供了 Z30 和 H20 在拍照和录像模式下的两种 black I frame
     
     然后在相机开始的第一帧,或者在相机切换拍照/录像模式后的第一帧,灌入 black I frame
     
     上图表示对应的程序流程图位置
     对应的代码位置如下图
     
      完成了这一步,接下来就是正常解码 P 帧的操作了~

      至此,大功告成!


      谢谢你的点赞,分享和转发!
评论
上传
你需要登录之后才能回帖    登录 | 注册
赵三岁   2021-1-20 3#
大佬,看下你下面第二个帖子,救救我
dji4529   2021-1-26 4#
你好,请问能同时进行硬件编解码吗
GDR H264->硬件解码->硬件编码->RTMP(H264)
dji4529   2021-1-27 5#
另外关于“Insert the black I frame”有没有相关资料分享,谢谢大佬
大佬,为什么我跟着例程走,播放延迟起码有5s这样,嵌入式用Xavier NX,请问是什么原因,谢谢。
dji45291-26 15:19
你好,请问能同时进行硬件编解码吗
GDR H264->硬件解码->硬件编码->RTMP(H264)
目前实现的在Gstreamer下软解硬编,UDP传输没问题,RTMP传输掉帧了
大佬能分享一下Gstreamer得UDP推流资料吗,我测试本地播放速度可以但改UDP推出去接收无法解析,谢谢。
dji4529   2021-4-19 8#
我改了示例代码,将gstreamer硬解码之后的视频流NV12 转成opencv的RBG格式mat,直接使用imshow,结果就掉帧了
OpenJetson   2021-4-19 9#
Jetson是支持gdr格式h264硬解码的,你这个方法有点麻烦,我用硬解延时在160ms左右,而且cpu占用率极低
OpenJetson   2021-4-19 10#
dji45294-19 09:30
我改了示例代码,将gstreamer硬解码之后的视频流NV12 转成opencv的RBG格式mat,直接使用imshow,结果就掉帧了
opencv非常占用cpu资源
OpenJetson   2021-4-19 11#
dji45291-26 15:19
你好,请问能同时进行硬件编解码吗
GDR H264->硬件解码->硬件编码->RTMP(H264)
可以的 gst就支持
OpenJetson   2021-4-19 12#
djiuser_Izp0M7D2-22 15:08
大佬,为什么我跟着例程走,播放延迟起码有5s这样,嵌入式用Xavier NX,请问是什么原因,谢谢。
jetson nx要直接硬解码,他这个方法不适合
dji4529   2021-4-26 13#
OpenJetson4-19 15:37
Jetson是支持gdr格式h264硬解码的,你这个方法有点麻烦,我用硬解延时在160ms左右,而且cpu占用率极低
您好 能分享下jetson下的硬解码方案吗
dji4529   2021-4-26 14#
OpenJetson4-19 15:41
jetson nx要直接硬解码,他这个方法不适合
如何调OSDK将数据送到gst的管道呢
suzhenyu  Inspire 2认证用户 2021-5-6 15#
djiuser_Izp0M7D2-22 15:08
大佬,为什么我跟着例程走,播放延迟起码有5s这样,嵌入式用Xavier NX,请问是什么原因,谢谢。
兄弟,这个问题解决了吗?能否帮个忙呢?
suzhenyu  Inspire 2认证用户 2021-5-6 16#
OpenJetson4-19 15:37
Jetson是支持gdr格式h264硬解码的,你这个方法有点麻烦,我用硬解延时在160ms左右,而且cpu占用率极低
你好,能否提供下方法呢?
   2021-5-6 17#
OpenJetson4-19 15:41
jetson nx要直接硬解码,他这个方法不适合
大神方便加微信吗?想向您请教一下这方面的问题。
MUQIN   2021-5-17 18#
ERRORLOG/1 @ UpdateRealIdrFrameTask, L277: Get camera mode error!

运行程序报这个错要怎么解决?
MUQIN   2021-5-25 19#
[2704967.529]ERRORLOG/1 @ CreateShowPipeline, L91: Unable to set the pipeline to the playing state.
[2704967.529]ERRORLOG/1 @ CameraStreamShow, L47: Create show pipeline error


运行后遇到这个错误是什么原因啊?
沙丁鱼   2021-6-23 20#
给大佬点赞。感谢。
dji4529   2021-8-4 21#
OpenJetson4-19 15:37
Jetson是支持gdr格式h264硬解码的,你这个方法有点麻烦,我用硬解延时在160ms左右,而且cpu占用率极低
你好,请问Jetson如何硬解码gdr格式h264
我用OSDK接口保存GDR格式H264文件,然后使用
gst-launch-1.0 filesrc location=MainCam.h264 ! h264parse ! omxh264dec ! autovideosink
无法播放,保存的FPV文件可以播放,求助

gst版本1.14.5,Jetson NX
tuyaliang  Mavic 3 M认证用户 2021-8-6 22#
dji45298-4 11:32
你好,请问Jetson如何硬解码gdr格式h264
我用OSDK接口保存GDR格式H264文件,然后使用
gst-launch-1.0 filesrc location=MainCam.h264 ! h264parse ! omxh264dec ! autovideosink
无法播放,保存的FPV文件可以播放,求助

gst版本1.14.5,Jetson NX
nvv4l2decoder
OpenJetson   2022-2-16 24#


Jetson NX解码流畅播放显示 延时<100ms(右图是解码后HDMI显示时间,左图是H20对着拍的时间)
tomy_jack   2022-4-20 25#
OpenJetson2-16 09:26
[图片]

Jetson NX解码流畅播放显示 延时<100ms(右图是解码后HDMI显示时间,左图是H20对着拍的时间)
你好,能公开一下硬解流程吗?我手上的也是jetson,跑贴子的程序CPU占用率110%左右,画面明显慢放,延迟就更不用说了,还是解决不了,能否指点一下,谢谢
tomy_jack   2022-4-20 26#
你好,按照你的帖子方法,我手上的jetson xavier nx,装的jetpad 4.6,装好了NV的CUDA,opencv等组件,按照你的程序跑,显示画面明显延迟很多,画面中的时间应该是100ms-300ms左右,明显的慢动作,延迟更不用说非常大,请问是什么问题呢,诚心请教
tomy_jack   2022-4-20 27#
dji45292021-8-4 11:32
你好,请问Jetson如何硬解码gdr格式h264
我用OSDK接口保存GDR格式H264文件,然后使用
gst-launch-1.0 filesrc location=MainCam.h264 ! h264parse ! omxh264dec ! autovideosink
无法播放,保存的FPV文件可以播放,求助

gst版本1.14.5,Jetson NX
你好,我这边也是同样的问题,请问你解决了吗?
tomy_jack4-20 21:34
你好,按照你的帖子方法,我手上的jetson xavier nx,装的jetpad 4.6,装好了NV的CUDA,opencv等组件,按照你的程序跑,显示画面明显延迟很多,画面中的时间应该是100ms-300ms左右,明显的慢动作,延迟更不用说非常大,请问是什么问题呢,诚心请教
您好,我用这个方法也是延时巨大,而且越来越大,请问您的问题解决了吗?
你好,还有OSDK转接板的说明吗?
取消 点赞 评论
分享至:
回复:
上传
取消 评论
快速回复 返回顶部 返回列表