范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

AndroidFFmpeg系列04FFmpeg调用MediaCodec进行硬解码

  1、引言
  在上篇文章中我们通过FFmpeg软解并渲染了本地的一个mp4视频
  Android FFmpeg系列03--视频解码与渲染
  本文基于之前的Demo添加了FFmpeg使用MediaCodec来硬解码的方式,包括解码出buffer再利用OpenGL进行渲染上屏和直接解码到Surface然后上屏两种方式
  FFmpeg使用MediaCodec可以在解封装后拿到AVPacket再利用jni将buffer回调到java层,然后在java层调用MediaCodec;也可以直接在native层利用AMediaCodec
  用于测试的mp4采用H264编码
  所以使用上述两种调用MediaCodec方式的时候需要先通过
  "h264_mp4toannexb" filter
  将AVPacket进行转换一次,相关背景可以参考H264码流之AnnexB和AVCC
  不过在本系列教程中使用的FFmepg5.0.1版本,bitstream filter的相关接口都已经被移除
  所以接下来采用FFmpeg在3.1之后提供的直接调用MediaCodec的C接口来实现硬解码
  (https://trac.ffmpeg.org/wiki/HWAccelIntro)
  可以看到目前还只支持解码而不支持编码 2、编译
  在之前的编译脚本中打开如下三个配置即可(详情参考Android FFmpeg系列01--编译与集成) --enable-jni  --enable-mediacodec  --enable-decoder=h264_mediacodec
  不需要再配置h264_mediacodec的硬件加速(list中已经查找不到了)
  --enable-hwaccel=h264_mediacodec
  解码出Buffer
  解码流程和软解类似,不再赘述,重点描述一下流程不一样的地方 2.1 将JVM实例设置给FFmpeg// libavcodec/jni.h // int av_jni_set_java_vm(void *vm, void *log_ctx); // 方式一,在so加载的JNI_OnLoad方法中调用 // 方式二,在用到ffmpeg的模块调用即可,该方法可以多次调用,只要jvm实例相同即可 JavaVM *javaVm = nullptr; env->GetJavaVM(&javaVm); if (javaVm != nullptr) {     av_jni_set_java_vm(javaVm, nullptr); }2.2 通过"h264_mediacodec"查找解码器
  由于h264_mediacodec解码器和h264解码器id相同,所以 // 软解时 avcodec_find_decoder(id); // 使用mediacodec硬解时 avcodec_find_decoder_by_name("h264_mediacodec");
  之后的步骤和软解步骤完全相同,不需要做任何更改
  本地测试采用软解出来的AVFrame格式是 AV_PIX_FMT_YUV420P ,
  使用h264_mediacodec硬解出来的AVFrame格式是 AV_PIX_FMT_NV12 2.3 解码到Surface
  解码流程和软解的流程也是类似的,这里重点描述下差异的地方
  也可以参考ffmpeg5.0.1/doc/examples/hw_decode.c
  要硬解到Surface上,重点是配置 get_format 和 hw_device_ctx
  查找type AVHWDeviceType type = av_hwdevice_find_type_by_name("mediacodec");
  C++音视频学习资料免费获取方法:关注音视频开发T哥  ,点击「链接」即可免费获取2023年最新 C++音视频开发进阶独家免费学习大礼包! 2.4 查找hw_pix_fmt,能找到就是支持mediacodec解码for (int i = 0; ; ++i) {     const AVCodecHWConfig *config = avcodec_get_hw_config(h264Mediacodec, i);     if (!config) {         LOGE("Decoder: %s does not support device type: %s", h264Mediacodec->name,av_hwdevice_get_type_name(type))         break;     }     if (config->methods & AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX && config->device_type == type) {         // AV_PIX_FMT_MEDIACODEC(165)         hw_pix_fmt = config->pix_fmt;         LOGE("Decoder: %s support device type: %s, hw_pix_fmt: %d, AV_PIX_FMT_MEDIACODEC: %d", h264Mediacodec->name,                          av_hwdevice_get_type_name(type), hw_pix_fmt, AV_PIX_FMT_MEDIACODEC);         break;     } }2.5 get_hw_format方法static enum AVPixelFormat hw_pix_fmt = AV_PIX_FMT_NONE; static enum AVPixelFormat get_hw_format(AVCodecContext *ctx,                                         const enum AVPixelFormat *pix_fmts) {     const enum AVPixelFormat *p;      for (p = pix_fmts; *p != -1; p++) {         if (*p == hw_pix_fmt) {             LOGI("get HW surface format: %d", *p);             return *p;         }     }      LOGE("Failed to get HW surface format");     return AV_PIX_FMT_NONE; }2.6 解码器上下文设置get_formatmVideoCodecContext->get_format = get_hw_format;2.7 配置hw_device_ctxav_hwdevice_ctx_create(&mHwDeviceCtx, type, nullptr, nullptr, 0); mVideoCodecContext->hw_device_ctx = av_buffer_ref(mHwDeviceCtx);2.8 要解码到Surface上,还需要配置AVMediaCodecContextif (surface != nullptr) {     mMediaCodecContext = av_mediacodec_alloc_context();     av_mediacodec_default_init(mVideoCodecContext, mMediaCodecContext, surface); }
  从源码中可以看到将生成的mediac codec ctx设置给解码器ctx的hwaccel_context
  上述步骤都是在打开解码器之前完成,剩下的步骤和软解一致了,只是解码出来的AVFrame的fmt为上面我们查找到的hw_pix_fmt,也就是 AV_PIX_FMT_MEDIACODE 3、渲染到Surface上
  (http://mplayerhq.hu/pipermail/ffmpeg-devel/2016-March/191700.html)
  如果需要从hw surface上拿到buffer,可以通过av_hwframe_transfer_data进行转换
  (Demo还是上篇文章的地址,切换到dev分支即可 ) 4、参考
  1.【ffmpeg mediacodec硬解初探】
  http://www.4k8k.xyz/article/tifentan/80605472#google_vignette
  2.【FFmpeg 调用 MediaCodec 硬解码到 Surface 上】
  https://cloud.tencent.com/developer/article/1901883?from=article.detail.1928893
  原文链接: Android FFmpeg系列04--FFmpeg调用MediaCodec进行硬解码

河南省著名古城,曾经是世界第一大城市,如今却只是国内三线小城这里是刘小顺的旅行和生活研究所。位于我国华中地区的河南省,历史悠久人文底蕴深厚,是中华文化的重要发祥地之一,旅游资源也非常丰富,每年都会吸引大量游客来到河南省旅游。河南省有许多著名荒野大镖客2史低引热潮,在线人数创新高自从秋促开始以来,荒野大镖客2新史低便是玩家们关注的重点,毕竟是目前游戏史上的巅峰作品之一,有如此热度并不奇怪,就和DICE的战地一样,如今荒野大镖客2的在线人数已经创造了新的高度来自20多个国家和地区的专家学者探讨加强全球科技合作人类福祉是在开放交流中实现的在一个主题为科技与发展的国际论坛上,谈到人类面临的挑战这一话题时,未来学家戈尔德莱昂哈德认为,人类面临的最大的挑战不在于科学或技术领域,而在于能否合作上。11月26日至28日,第四个人养老金来了,按12000元档次缴费,15年能够增加多少养老金?日前,我国的个人养老金制度开始真正实施了。目前第一批在上海市北京市青岛市等36个城市试点。这些地区的人们可以通过指定的商业银行在信息平台开设个人养老金账户,并在银行开设个人养老金资翻开这本清朝皇室取名指南吧探源中华文明砥砺民族之魂大部分父母在给孩子取名这件事上,总是怀揣着美好的想法,要么是挑选寓意上乘的字眼,希望孩子能成长为父母所期待的模样要么是针对孩子可能存在的缺陷进行补足,比如名关于死亡谷国家公园死亡谷国家公园的名字并不难猜。死亡谷是一个灼热的沙漠,拥有世界上最热和最干燥的条件,当谈到植物和动物的生存时,死亡谷的景观是毫无疑问的挑战。因此,这个干旱的公园是一种独特的野生动物艾顿背靠背取下57分33篮板,内线野兽苏醒终成禁区统治者?一个赛季82场常规赛,每一个NBA球员都会在漫长的赛季中经历起起伏伏。如果他们想不通这个问题,那么很快他们就会感到自卑。对菲尼克斯太阳首发中锋德安德烈艾顿来说,过去四个多赛季他经历男性备孕须知这5种杀精行为,必须禁止29岁的小萱,三年前结婚,婚后一年开始备孕,但一直没有好消息。去年开始,小萱开始间断在某医院生殖门诊监测排卵促排卵治疗,结果提示有优势卵泡排卵,但就是怀不上。治疗期间,医生也多次提宝宝红屁屁如何预防新手妈妈必做功课头条创作挑战赛2022育儿季冬天虽然没有夏天那么炎热,但是天气冷宝宝穿的厚,在日常生活中不注意的话宝宝还是很容易红屁屁的,新手妈妈一定要注意!我总结了一下,导致宝宝红屁屁的原因大概当妈后总忘东忘西,是人类祖先留下的高级本领你是不是经常有同样的感受?手机明明刚刚还在用,一转眼就找不到了钥匙就在手里抓着,翻来覆去找不着想去厨房拿碗和筷子,结果就拿了碗出来为啥怀了个孕,感觉脑子就不够使了?当妈后,为啥感觉儿科医生说秋冬季儿童流感的中药及中成药的选择和治疗首先明确个概念流感样病例是指在流感流行季节(秋冬季)出现以下表现发热体温()伴有咳嗽和或咽痛针对流感样病例,临床及确诊流感病例岁患儿可选用口服奥司他韦或和口服中药治疗年龄岁,可根据
体育强省好声音省举重中心直面挑战,奋力擦亮王牌之师金字牌匾编者按过去的一年,湖南体育战线锐意进取,真抓实干,体育强省建设工作扎实推进。2023年全省体育工作会议上,各运动管理中心各市州体育主管部门的代表就2022年体育工作进行经验分享。即(两会声音)海尔董事局主席周云杰连续7年为中国工业互联网发展建言全国人大代表周云杰(左一)在海尔再循环互联工厂调研。林郅贤摄中新网青岛3月2日电(蔡亚群)2023年全国两会开幕在即,第十四届全国人大代表,海尔集团董事局主席首席执行官周云杰今年再(两会声音)李谢华有色金属更绿色,世界方能更有色图为中国铝业集团高端制造股份有限公司党委副书记总裁李谢华。梁钦卿摄中新网重庆3月2日电(梁钦卿)有色金属行业未来只有走绿色发展之路,才能让世界更加有色。作为全国人大代表,中国铝业集男性刮胡子频率高,说明了什么?导语由于男女生理结构的不同,男性朋友的胡须也是一种独特的生理标志,是男生成长为男性朋友的标志,是成熟的一大特征。长胡子是男人的标志,一般雄激素分泌旺盛的男性会长得更快,胡须里的血管你捻死过蚂蚁吗?其实蚂蚁也会感觉到痛!蚂蚁是由什么演变出来的?据科学家的研究,蚂蚁是从古代的蜘蛛类动物演变而来的。在大约1。3亿年前的白垩纪时期,这些原始的蜘蛛类动物开始出现一些变化,它们的身体逐渐变得更加坚硬和紧凑,华彬快消品参展2023FHE战马获创新健康科技产品奖近日,博鳌健康食品科学大会暨博览会(FHE)在博鳌亚洲论坛国际会议中心举办,本次大会旨在通过国内外科学信息的交流,推动健康食品产业的发展,搭建一个政府学术界产业界,以及产学研交流合产品上做减法,长城汽车能否完成160万辆销量目标?特斯拉在今年开年打响了降价第一枪,随后问界小鹏等多家车企跟随降价,即便是2022年销量第一的比亚迪近日也将新推出的DMi车型起售价格首次下探至10万元以内。某种程度上,特斯拉降价打月子中心超全月子餐,坐月子的宝妈看过来因第一周产后体力消耗大肠胃虚弱没有食欲。推荐进食一些清淡易消化的食物,以清除恶露为主。第一天不需要太补,以免一周恶露排不干净。饮食应以稀软清淡营养为原则,食物主要能补充水分,如蛋花孩子上课易走神好多动?滨医附院专家提醒家长应早发现早干预通讯员张莹莹随着新学期的开始,有的家长通过老师了解到,孩子在课堂听讲时,存在注意力不集中多动等状况。类似的情况还包括作业拖拖拉拉边写边玩常常马马虎虎,会把6看成9,把b看成d格外活涉嫌辱华电影雄狮少年第二部来了!网友抵制别再眯眯眼了文薛定谔的猹日前,国产动漫雄狮少年正式宣布第二部已经立项通过,并正式开始制作。从影片备案信息可以看出,继第一部的舞狮题材后,第二部则继续聚焦于传统文化,换成了大家更为熟悉的武术题材给宝宝起小名有讲究吗给宝宝起小名有什么讲究吗有的。乳名是指小孩子出生以后还在吃奶时期,父母给他们起的昵称。又称小名,与学名不同,并不正式。乳名一般意思简单,琅琅上口,叫着亲切自然。古人对名字格外的重视