该篇文章转自大疆开发论坛:https://bbs.dji.com/forum.php?mod=viewthread&tid=260759

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

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

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

为了不让 CPU 作为背锅侠,我们今天我们试着一起来跑一下 H264 硬件解码的 sample
        废话不多说,Sample 开源代码我丢这里了
         camera_h264_hardware_decode_sample.zip (16.99 KB, 下载次数: 19)              
       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 帧的操作了~

至此,大功告成!

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

  1. 基于Intel 集成显卡的 FFmpeg 调用 VAAPI 硬件解码零数据拷贝链接推理引擎工作流程的实现

    概述 在视频处理流程中,视频的解码通常在 CPU 中进行,若用户需要使用集成显卡进行深度学习推理,解码数据需要从 CPU的缓存中拷贝至集成显卡中进行推理.本文旨在通过集成显卡进行硬件解码,使用FFmp ...

  2. 图像融合亮度一致_重磅干货低光图像处理方案

    点击上方"AIWalker",选择加"星标"或"置顶"    重磅干货,第一时间送达 Tips:一点点提示,因内容较多建议先关注,再置顶,最 ...

  3. 视频的基本参数及H264编解码相关概念

    概述 上几篇文章介绍了音频的采集以及编码,现在我们开始学习视频相关的知识,同样先从概念开始.本篇文章的主要内容有: 视频相关参数 帧率(fps) 分辨率 DTS和PTS 码率 音视频同步 对视频编解码 ...

  4. RIoTBoard开发板系列笔记(十二)—— gstreamer + vpu实现视频硬件解码播放

    i.mx6 solo芯片中包含一个VPU (video processing unit),可以进行视频硬件编解码加速,之前RIoTBoard开发板系列笔记(四)-- 使用VPU硬件解码文章简单的记录了 ...

  5. 重磅干货 | 五万字长文总结 C/C++ 知识(下)

    置顶/星标公众号????,硬核文章第一时间送达! 链接 | https://github.com/huihut/interview 回顾上篇:<重磅干货 | 五万字长文总结 C/C++ 知识(上 ...

  6. SkeyeRTSPLive高效转码之SkeyeVideoDecoder采用Nvidia独立显卡高效硬件解码解决方案(附源码)

    在我之前写的一篇文章<SkeyeRTSPLive传统视频监控互联网+实现利器解决方案>中提到RTSP转RTMP的转流过程,简化流程就是通过SkeyeRTSPClient拉RTSP流,获取音 ...

  7. CUDA和FFMPEG硬件解码视频流

    本文主要讲述了通过FFMPEG获取H264格式的RTSP流数据(也可以获取本地视频文件),并通过CUDA进行硬件解码的过程.其他博客给出的教程要么只是给出了伪代码,非常的模糊,要么是基于D3D进行显示 ...

  8. CrossWalk WebView添加支持WebRTC及H264编解码

    前言 1.WebView简介 WebView是Android平台上的一个非常重要的系统组件,用于将一个显示浏览器页面的窗口嵌入到应用程序,并提供一组接口让开发者定制一些页面加载及JavaScript对 ...

  9. SkeyeRTSPLive高效转码之SkeyeVideoDecoder采用Intel集成显卡高效硬件解码解决方案(附源码) (1)

    在我之前写的一篇文章<SkeyeRTSPLive传统视频监控互联网+实现利器解决方案>中提到RTSP转RTMP的转流过程,简化流程就是通过SkeyeRTSPClient拉RTSP流,获取音 ...

最新文章

  1. 浅谈lastIndexOf
  2. VisualSVN5.1.7补丁原创发布
  3. C++ 学习路线推荐
  4. Zabbix服务器性能优化记录
  5. ARM处理器上电/复位操作
  6. CSS:修改输入框placeholder样式
  7. RHEL6本地YUM源配置
  8. 再谈MV*(MVVM MVP MVC)模式的设计原理—封装与解耦
  9. 【笔记】vim如何删除重复行
  10. GDI GDI+ 的区别
  11. java se11.0.1安装_jdk11下载安装及环境变量配置
  12. 加入云上江湖—蚂蚁 SOFAStack
  13. Qt浅谈之三十系统托盘(QSystemTrayIcon)
  14. 360极速浏览器Onetab插件存储位置
  15. 在arm架构的mac上安装sql server(m1芯片 or m2芯片)
  16. ubuntu设置开机启动图形应用程序,替换默认图形桌面
  17. S参数的应用|从S参数看通道阻抗匹配 | 理解插入损耗
  18. SELinux策略语言--类型强制(编写TE规则)
  19. 关于一个进程结束另外一个带有NotifyIcon托盘的进程残留图标问题解决方法
  20. 获取国内飞机航班时刻表数据

热门文章

  1. pythonios免费下载_附近的兼职
  2. AvosCloud的文件存储 Demo
  3. ubuntu/ubuntukylin安装基于deepin-wine的微信、qq、迅雷精简版、百度云等
  4. SiTime硅晶振相位噪声测量指南
  5. 非编网 制作服务器,电视台后期制作网非编系统机房非编工作站
  6. 相机中的透视投影几何——讨论相机中的正交投影,弱透视投影以及透视的一些性质
  7. c++ std vector用法介绍
  8. 用自编码器对数据进行降维
  9. Nginx - 服务器架构
  10. 用护眼灯到底好不好?盘点四款高品质的护眼灯