ffmpeg mediacodec 硬解初探

2024-04-08 11:32

本文主要是介绍ffmpeg mediacodec 硬解初探,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ffmpeg mediacodec硬解初探
1编译:
ffmpeg自3.1版本加入了android mediacodec硬解支持,解码器如图

硬件加速器如图(还不清楚硬件加速器的功能)

编译带h264_mediacodec版本的库需要开启以下选项
–enable-jni
–enable-mediacodec
–enable-decoder=h264_mediacodec
–enable-hwaccel=h264_mediacodec(不知道有什么用,还是开了)

2使用:
首先在JNI_OnLoad函数,或者使用解码器之前调用
av_jni_set_java_vm(vm, NULL);(位于libavcodec/jni.h)
来设置java虚拟机(反调mediacodec时会用到)

其次,由于h264_mediacodec解码器和h264解码器id相同所以,软解时,通过
avcodec_find_decoder(id)来寻找解码器
而想使用mediacodec硬解时,使用
avcodec_find_decoder_by_name(“h264_mediacodec”);寻找指定解码器

之后所有步骤和软解完全相同,不需要更改任何内容

3暂时的现象和问题:
现象:不知道是否和播放器本身架构设计和实现有关,对比h264软解和硬解,cpu使用率并没有明显下降,多数下相差不大,有一部分视频能出现5%-10%的下降
但较为明显提升的是解码速度,解码640X360分辨率时,已有明显区别(左图软解,右图硬解,数字为每一帧解码耗费时间,单位毫秒,左右两图时间并非一一对应,仅比较量级)
视频为http://ips.ifeng.com/video19.ifeng.com/video09/2015/02/28/3019136-102-008-1929.mp4

解码1920X1080分辨率时,区别很大(左图软解,右图硬解,数字为每一帧解码耗费时间,单位毫秒,左右两图时间并非一一对应,仅比较量级)
视频为http://gitdown.bravovcloud.com/video/3.mp4

问题:软解出来的数据格式为YUV420P,直接使用libyuv转换即可;在我这台手机上硬解出来的数据格式为NV12
据网上博客所说,不同机器解码出来的数据格式不尽相同,这就导致解码出来后的数据,需要根据其类型来做转化,使用ffmpeg自带的转换函数非常简单通用,但是效率有待考察。

libyuv中包含neon加速,但是不包含通用转换函数,需要自行判断类型,而且还不包含ToRGBA的函数,主要包含ToARGB的函数,native
window显示时,只支持RGBA8888,RGBX8888和RGB656,这样会在转换上增加了一些复杂度

https://www.polarxiong.com/archives/Android-MediaCodec%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%E7%A1%AC%E4%BB%B6%E8%A7%A3%E7%A0%81-%E9%AB%98%E6%95%88%E7%8E%87%E5%BE%97%E5%88%B0YUV%E6%A0%BC%E5%BC%8F%E5%B8%A7-%E5%BF%AB%E9%80%9F%E4%BF%9D%E5%AD%98JPEG%E5%9B%BE%E7%89%87-%E4%B8%8D%E4%BD%BF%E7%94%A8OpenGL.html

这篇博客讲述了android在api21之后,硬解指定格式的方法
附:
在libavcodec中的 mediacodec_common.c里面我找到了这个

注意ffmpeg里面也有jni.h,需要引入avcodec时加上路径,然后mk文件里面不引入到avcodec这一级目录。

感谢同事刘衍的调研

这篇关于ffmpeg mediacodec 硬解初探的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/885465

相关文章

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

ffmpeg面向对象-待定

1.常用对象 rtsp拉流第一步都是avformat_open_input,其入参可以看下怎么用: AVFormatContext *fmt_ctx = NULL;result = avformat_open_input(&fmt_ctx, input_filename, NULL, NULL); 其中fmt_ctx 如何分配内存的?如下 int avformat_open_input(

FFmpeg系列-视频解码后保存帧图片为ppm

在正常开发中遇到花屏时怎么处理呢?可以把解码后的数据直接保存成帧图片保存起来,然后直接看图片有没有花屏来排除是否是显示的问题,如果花屏,则代表显示无问题,如果图片中没有花屏,则可以往显示的方向去排查了。 void saveFrame(AVFrame* pFrame, int width, int height, int iFrame){FILE *pFile;char szFilename[

【IPV6从入门到起飞】4-RTMP推流,ffmpeg拉流,纯HTML网页HLS实时直播

【IPV6从入门到起飞】4-RTMP推流,ffmpeg拉流,纯HTML网页HLS实时直播 1 背景2 搭建rtmp服务器2.1 nginx方案搭建2.1.1 windows 配置2.1.2 linux 配置 2.2 Docker方案搭建2.2.1 docker 下载2.2.2 宝塔软件商店下载 3 rtmp推流3.1 EV录屏推流3.2 OBS Studio推流 4 ffmpeg拉流转格式

Java注解初探

什么是注解 注解(Annotation)是从JDK5开始引入的一个概念,其实就是代码里的一种特殊标记。这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息。有了注解,就可以减少配置文件,现在越来越多的框架已经大量使用注解,而减少了XML配置文件的使用,尤其是Spring,已经将注解玩到了极致。 注解与XML配置各有

ffmpeg使用安装使用教程(命令行-Python)

安装教程 https://blog.csdn.net/yuanmomoya/article/details/141992114 ffmpeg转换操作视频十分的占用cpu,会把cpu打满,线上使用的话需要注意下 命令行操作 一、视频转码 将视频从一种格式转换为另一种格式: ffmpeg -i input_video.mp4 output_video.avi 这将把输入的 MP4

ffmpeg安装测试(支持cuda支持SRT)

文章目录 背景安装ffmpeg直接下载可执行文件选择版本选择对应系统版本下载测试Linux下安装 查看支持协议以及编码格式 常见错误缺少 libmvec.so.1LD_LIBRARY_PATH 错误 GPU加速测试SRT服务器搭建下载srs5.0源码解压安装配置启动 SRT推流测试SRT播放测试 背景 在音视频开发测试中,FFmpeg是一个不可或缺的工具,它以其强大的音视频处理

IOS Core Data框架初探

在IOS系统中已经集成了关系型数据库SqLite3数据库,但是由于在OC中直接操作C语言风格的SqLite3相对繁琐,因此Apple贴心的提供了一个ORM(Object Relational Mapping对象关系映射)框架——Core Data让我们在程序中以面向对象的方式,操作数据库。Core Data框架提供的功能相当强大,属于入门容易精通难的东西,值得我们用心专研。现在,就先记录一下我对该

【FFMPEG】Install FFmpeg CUDA gltransition in Ubuntu

因为比较复杂,记录一下自己安装过程,方便后续查找,所有都是在docker环境安装cuda11.7的 **ffmpeg 4.2.2 nv-codec-headers-9.1.23.3 ** 手动下载安装吧 https://github.com/aperim/docker-nvidia-cuda-ffmpeg/blob/v0.1.10/ffmpeg/Dockerfile最好手动一个一个安装,错误跳

使用ffmpeg在视频中绘制矩形区域

由于项目需要对视频中的人脸做定位跟踪, 我先使用了人脸识别算法,对视频中的每个帧识别人脸、通过人脸库比对,最终记录坐标等信息。 然后使用ffmpeg中的 drawbox 滤镜功能,选择性的绘制区域。从而实现人脸定位跟踪 1、drawbox 在FFmpeg中,drawbox 滤镜的 enable 参数用于控制矩形框绘制的条件和时机。通过这个参数,你可以指定在何时或者在哪些帧上启用 dra