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

Android硬编解码MediaCodec解析从猪肉餐馆的故事讲起(一)

  初识MediaCodec
  前面视频理论基础几篇篇文章已经比较详细地介绍了H264编辑码基本原理以及H264码流结构一探究竟,其中并未叙述具体编解码算法,因为对于一般的工程类开发来说,这些知识已经足矣,算法那是专门做算法的人员需要研究的。
  而对于一般开发来说,已经有成熟的工具来处理编解码了,其中,MediaCodec就是Android平台中专门处理音视频 硬编硬解码 的利器。
  解码 的作用,就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。反之, 编码 的作用,就是将非压缩的视频/音频原始数据转为视频/音频压缩编码数据。
  ( 虽然关于MediaCodec的文章百度一下大把,但是很多其实也就是对官网的一个翻译,本文我将尽量结合之前几篇文章中关于编解码相关的内容并将自己一些个人想法写上来,使得此MediaCodec文章非彼(百度)MediaCodec文章 。
  不过这样出现错误的风险也会提高哈哈,所以有什么错误也请各位指教)
  首先要解释的是什么是硬编硬解码,有硬就有软,当然这里只是一种行内的约定俗成的说法,并不是真的一种很硬一种很软。一般来说:
  软编软解码 :使用CPU进行编码,一般是执行代码运行算法指令编码。  硬编硬解码 :使用非CPU进行编码,如显卡GPU、专用的DSP、FPGA、ASIC芯片等,一般是算法已经固化在芯片中。
  一般来说,软编码会使CPU负载更重,所以性能相对比硬编要低,不过兼容性一般比硬编好,低码率下质量通常比硬编码要好一点。而硬编码一般性能比软编码好一些,但是兼容性就差一些,低码率下通常质量 低于软编码 的。
  按照MediaCodec官网的定义,MediaCodec是Android平台提供的一个底层的音视频编解码框架,它是安卓底层多媒体基础框架的重要组成部分。
  它经常和  MediaExtractor, MediaSync, MediaMuxer, MediaCrypto, MediaDrm, Image, Surface, AudioTrack  一起使用。
  C++学习资料免费获取方法:关注音视频开发T哥  ,+「链接」即可免费获取2023年最新 C++音视频开发进阶独家学习资料!
  资料包部分内容展示
  这里的底层是相对于上层的MediaPlayer这一类封装好的可以几个api的简单调用就能搞定一段视频从解复用、解码、播放的全过程的工具类而言的。那既然有了MediaPlayer这一类傻瓜式调用即可的工具,为啥还要MediaCodec呢?
  因为我们的需求肯定不会满足于简单的播放视频,我们要根据自己的需要去定制视频,比如最常见的就是抖音那种给视频加滤镜特效,需要对视频每一帧专门进行处理。
  之所以说MediaCodec是硬编解码,是因为MediaCodec就相当一个处于CPU中的遥控器,专门遥控音视频编解码芯片进行工作,而非CPU本身去进行编解码处理 。大概是这样一个工作流程:
  MediaCodec工作流程
  说起MediaCodec工作流程工作流程,那肯定要祭出官网这张经典的图:
  MediaCodec的api在业内号称Android平台最不人性化之一,多少英雄好汉对其望而生畏。所以理解整个工作流程便成了重中之重。
  从图上可以看出,左边是输入端,右边是输出端。其中有输入和输出端各有若干个buffer,输入端不断拿到一个空buffer,装上数据,再传入MediaCodec直到所有数据输入为止。输出端不断从MediaCodec获取到buffer,每次得到处理好的数据后,再将buffer交还给MediaCodec。
  根据上面描述的流程,写出来的代码就会是input端一个循环,output端一个循环,并且一些细节还很繁琐,比如状态很多都要手动管理,还有buffer还不能直接获取,还要先拿到buffer在buffer数组中的index才可以获取等,所以说api设计是不人性化的。
  对于这一个过程更通俗的理解, 个人认为可以把MediaCodec看做一家猪肉餐馆。
  首先看左右两端绿色的Client部分, 左边可以看做猪肉采购员,右边可以看做吃猪肉的顾客,中间MediaCodec可以看做是餐馆厨师。那么生猪肉就是编码数据,烧熟的猪肉就是解码后的数据
  输入端:  左边input的empty input buffer可以看做空的生猪肉篮子,当猪肉采购员带着生猪肉来到餐馆的时候,就对餐馆厨师(MediaCodec)说:
  "厨师,拿个空篮子给我。"
  于是老板拿出一个空篮子(input buffer)交给采购员,采购员装了一些生猪肉(待编解码的数据),然后再交给厨师(MediaCodec)。
  厨师马不停蹄地做菜煮猪肉,另一边顾客过来问:
  "师傅,猪肉做好了没?"
  厨师如果已经做好,就立刻将做好的猪肉放到盘子(output buffer)上。交给顾客(输出端Client)。顾客吃完之后,再将盘子归还。
  是的,MediaCodec的工作就是这样不断循环反复地放生猪肉煮猪肉吃猪肉的过程,直到所有猪肉,即整个视频文件编解码完成为止。
  具体的生猪肉有哪些呢?由官网可知。mediacodec接受三种数据格式: 压缩数据,原始音频数据和原始视频数据 。压缩数据一般是解码端的输入和编码端的输出,反之原始音频数据和原始视频数据一般是编码的输入和解码端的输出。 1.对于压缩数据来说:
  压缩数据可以作为解码器的输入数据或者编码器的输出数据,需要指定数据格式,这样编码/解码器才能知道如何处理这些压缩数据。当使用视频时,一般是包含完整的一帧数据,也就是我们要输入给解码器一帧完整的数据或者从编码器得到一帧完整的数据。
  一般都不要传递给mediacodec不是完整帧的数据 ,除非是标记了BUFFER_FLAG_PARTIAL_FRAME的数据。BUFFER_FLAG_PARTIAL_FRAME指示了缓冲区只包含帧的一部分,并且解码器应该对数据进行批处理,直到没有该标志的缓冲区在解码帧之前出现。 2.对于原始视频数据来说: 视频编解码支持三种色彩格式:
  native raw video format  : COLOR_FormatSurface,可以用来处理surface模式的数据输入输出。
  flexible YUV buffers : 例如COLOR_FormatYUV420Flexible,可以用来处理surface模式的输出输出,在使用ByteBuffer模式的时候可以用getInput/OutputImage(int)方法来获取image数据。
  specific formats : 支持ByteBuffer模式,有一些厂家会定制, 其他的在MediaCodecInfo.CodecCapabilities中可以看到,格式较多,不列举. 假如是flexible format, 同样可以使用Image来处理数据,getInput/OutputImage(int)。
  从LOLLIPOP_MR1(api22)以后,mediacodec支持所有的flexible YUV 4:2:0格式。
  (原始音频数据以后博文再讲) MediaCodec工作生命周期
  当然,要学会使用MediaCodec,仅仅知道餐馆吃猪肉还是不够的,我们需要更细致地了解它的工作生命周期,又要祭出官网另一张图了:
  由上图可知,MediaCodec就是一个状态机,在工作期间会经历多个状态阶段。 具体来说是总共有三个大状态:Stopped, Executing ,Released,其中Stopped包含Uninitialized, Configured and Error三个小状态,Executing包含Flushed, Running and End-of-Stream三个小状态。
  当MediaCodec对象实例刚创建好的时候,处于Stopped状态中的Uninitialized状态。好比早上晨光熹微的时候,猪肉餐馆老板刚到达餐馆,打开大门,厨房和桌椅都有待收拾。
  此时需要调用调用configure方法,就能进入Configured状态,就好比猪肉餐馆老板将厨房和桌椅都收拾好,已经进入新的一天奋斗拉客的准备状态。
  一个start方法的调用,标志着老板已经开门准备迎接顾客和生猪肉采购员了,此时进入Executing状态了,目前暂时处于Flushed状态,即采购员还没将生猪肉(待编解码数据)带到餐馆也没有顾客在等待炒好的猪肉(编码或解码好的数据)状态。
  随着采购员的脚步到了,向厨师要一个空猪肉篮子(dequeueInputBuffer方法调用),厨师告诉他去拿第bufferIndex个篮子装(dequeueInputBuffer方法的返回值。这也能看出api设计不人性化的地方,不是直接返回对应buffer,还要使用bufferIndex再获取一次buffer),于是采购员去拿第bufferIndex个篮子(getInputBuffer方法)得到对应的篮子(buffer),再将生猪肉装进篮子(queueInputBuffer),于是餐馆正是进入Running状态,真正可以营业啦(进行编解码处理)。
  MediaCodec工作阶段大部分时间都处于Running状态中,在Running状态,不断地由采购员(input端)送进生猪肉,顾客拿炒猪肉盘子(output端),形成一个循环,直到猪肉生猪肉采购到上限且顾客已经全部吃完,这时候有个细节,就是到了采购员带来今天最后一篮子生猪肉的时候,采购员会小心翼翼地将一个标签(end-of-stream )和生猪肉一起装入篮子,厨师拿到带有这个标签的生猪肉,心领神会,就任性地不再接收任何采购员带来的生猪肉了(解码器不再接受任何新的数据输入),即进入End-of-Stream状态,然后对应炒出来的猪肉盘子也带上一个标签,让顾客知道这是今天最后一盘子猪肉了,吃完就要关门了。
  当顾客吃完最后一盘猪肉并且离开餐馆之后,老板便把餐馆门关上(调用stop),此时又回到了Stopped状态中的Uninitialized状态。此时一般是收拾桌椅和厨房(调用release方法来释放所有的资源),然后老板也要撤了,进入Released状态。
  当然在餐馆营业中,可能会出现一些意外,比如厨师突然生病了,于是餐馆进行不下去,被迫停止营业,就会进入Stopped中的Error状态,这时候有2个选择,一个是直接关门(release)进入Released状态。一种是如果还要继续营业,老板可以请另一位厨师,然后一切从Stopped状态中的Uninitialized状态重新开始营业。
  上面猪肉餐馆的版本可能有点啰嗦了,各位如果是老司机的话也可以直接结合官网快速看一看 MediaCodec States
  还是那句话,"纸上得来终觉浅,绝知此事要躬行", 下一篇博文 # Android硬编解码工具MediaCodec解析——从猪肉餐馆的故事讲起(二),就是熟悉的代码实践环节,为了保证代码足够权威, 特定找来了Google官方MediaCodec的学习项目 grafika,包含了Android硬编解码、照相机、OpenGL各种常用操作 ,非常适合新手学习,麻雀虽小五脏俱全,缺点是有些api已经过时。 总结
  本文首先介绍了MediaCodec的功能以及基本特点,然后描述了它的具体工作流程和生命周期图。希望猪肉餐馆的故事能够帮助更多人更好理解MediaCodec,而不是起到反作用的效果。 作者:半岛铁盒里的猫
  链接:https://juejin.cn/post/7110805190512967717/
  来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  在开发的路上你不是一个人,欢迎加入 C++音视频开发交流群「链接」大家庭讨论交流!

未来已来?美的发布家庭AI机器人,激光显示核心部分来自光峰科技当所有人以为智能音箱是未来智能家居的唯一入口的时候,美的发布了一款家庭服务服务机器人小惟机器人,这条消息乎点醒了市场和消费者,或许未来家庭服务机器人才是未来全屋智能家居的入口,就像补上最后的技术拼图,国产光刻机突破核心技术,要跟ASML说再见了点击关注,每天精彩不断!导读补上最后的技术拼图,国产光刻机突破核心技术,要跟ASML说再见了众所周知,在老美多次修改芯片规则以后,就让芯片的重要性逐渐凸显出来,如今整个科技领域的发凌晨转会利物浦国米米兰巴黎曼城热刺巴萨皇马尤文和英超身价榜第六日23时48分国米将在近期官宣小因扎吉续约一事,还将进一步推动目前的谈判迪巴拉卢卡库姆希塔良奥纳纳,球队已敲定阿斯拉尼转会的细节皮纳蒙蒂不愿去蒙扎。00时24分曝巴黎已与波帅达NBA10条最新交易动态,76人将组建超级球队北京时间6月16日,NBA一共更新了10条交易动态,让我们来看看吧1。专家JonathanGivony透露活塞队计划交易格兰特,老鹰和开拓者是主要交易对象。2。76人想要打造顶级争排便困难怎么办?日常多吃这3种天然泻剂,或让你大便通畅吃喝拉撒,是每个人日常生活必不可缺的。而人们维持基本的生命体征最重要的就是进食和排泄。排便的顺畅,直接影响着身体的健康,通畅规律的排便,是身体健康的象征。然而随着城市规模的扩大,生湿热下注,造成交公粮困难,中医一方清热化湿,少走冤枉路随着生活水平的提高,很多人会有长期饮酒,过度喜食油腻,辛辣类的食物,导致体内湿热蕴结,而湿热之邪长期的淤积于下焦,致使宗筋被湿热包裹,长期得不到营养的濡养,就容易出现隐疾的情况。前女排4位富二代魏秋月成就高,惠若琪负面新闻多,刘晏含最可惜混不好,就要回去继承家产!这句话是网友用来调侃娱乐圈那些出身富豪家庭的明星,但这种富二代不仅娱乐圈有,体育圈更是不少,今天就让我们一起来认识一下中国女排的四位富二代队员一魏秋月魏秋从2699元跌到2299元,3200万自拍66W,华为鸿蒙手机冲刺618对于自己喜欢的品牌支持就行了,不要在意别人的眼光,毕竟手机买回来是自己用,也不会给别人用。你喜欢索尼,喜欢原生的安卓系统,喜欢那种更高阶的拍照体验,那么索尼就很适合你,前提是你的预90后小伙捡漏法拍房省了700多万冲上热搜作者kangins6月15日,阿里拍卖上一套位于北京市顺义区澳景园一区的住宅以1660万成交,这个成交价不仅低于市场价700万,创下了近期北京法拍房捡漏的最高记录,而差价部分甚至可爆款预订!iPhone14Pro紫色超逼真粉丝渲染图来了手机中国新闻不出意外的话,苹果将在今年9月举行的秋季新品发布会上带来全新的iPhone14系列。距离发布时间越接近,iPhone14的爆料消息越来越多,关于新机的配色也早就有了爆料CBA谁有资格退役球衣?易建联与郭艾伦毫无悬念,广东队两人在内CBA很少为球员退役球衣,放眼整个历史,一共才十几名球员获得退役球衣待遇,其中广东队有外援积臣杜锋朱芳雨,是退役球衣最多的球队,还有上海队的刘炜姚明,江苏队的胡雪峰,广厦队的王博,
企石上洞特色精品村创建项目完工乡村更美群众更幸福展示深厚草龙文化底蕴的腾龙广场古香古色的姚氏宗祠舒适僻静的栈道公园200亩的翡翠花海观光区企石镇上洞村以创建特色精品村建设为契机,大力推进人居环境整治工作,提升村容村貌,并充分整合五一前佛山还有黄金周祖庙庙会盛大回归!热闹持续四天南都记者在17日举行的2023佛山(禅城)民俗文旅周新闻发布会了解到,4月21日至24日,2023佛山(禅城)民俗文旅周将在佛山禅城举行。本次活动以古新韵潮游岭南为主题,紧扣民俗文无忧无虑四季常开无忧花绽放的无忧花引得游客纷纷拍照打卡。新品种四季无忧扫码看无忧花视频千年花城每月一花开篇语千年花城风光如画,每月都有花海美景。从本月起,广州市林业和园林局和广州日报报业集团联合策为期3个月!泉州一地将发放2。6万余份消费券来源泉州广电无线泉州长达3个月!泉州惠安将发放2。6万余份总价值超百万元的消费券涵盖景区门票酒店民宿惠安乡土特产4月14日至16日,惠安县崇武古镇举办最美海岸风情惠安的文旅嘉年华活不负春光,在曲江池的浮生一日HAPPYSPRING万物随春醒美好皆可期叮!你的四月好运正在派送中近期一种新的旅游方式逐渐在社交媒体走红那就是特种兵式旅游连夜奔赴火车站,一天游览多景点追求在短时间打卡更多景点和成都想不到吧,外来人来成都看风景品美食,而成都人在喝茶今年1季度,随着旅游业再度起飞,外地的人想来成都看风景品成都美食。然而成都的本地人都在那里喝茶摆龙门阵一句成都来了就不想走的城市为人们留下了多么美好的空间,四面八方的游客纷纷涌向这上班了!快赶走假日综合征七天长假,原本是家人团聚放松休闲的时刻,但不少人将放松变成了放纵,酒桌应酬久坐搓麻通宵娱乐等不健康的放松休闲方式,往往会导致人胃肠道功能紊乱,睡眠质量下降,各类假日综合征成了医院过常吃厄贝沙坦氢氯噻嗪缬沙坦氨氯地平,有何危害?注意什么?如何做健康老年人一厄贝沙坦氢氯噻嗪厄贝沙坦是临床上常用的一线降压药,属于血管紧张素II受体拮抗剂,主要通过选择性阻滞血管紧张素II与其AT1型受体结合,更充分有效地阻断血管紧张素I静安夷陵号旅游专列发车助力对口支援地区驶上乡村振兴快车道出发,去看三峡!4月17日一早,载着约300名上海游客的静安夷陵号旅游专列从上海火车站出发。它将沿着长江,带着游客一路领略幽深秀丽的三峡风光。图说静安夷陵号旅游专列发车鲁哲摄(下同绿色产业助力中国高质量发展图为消博会上展出的纯电动移动便利店。新华社记者王泽聪摄4月10日至15日,第三届中国国际消费品博览会(简称消博会)在海南省海口市举行。国际社会关注到,本届消博会践行绿色办展低碳办会展现石家庄的第一燕盛街上开国第一城开国第一城市党报等主题造型吸引市民打卡来源石家庄新闻网图为市民在燕盛街拍照打卡。记者刘俊科摄真没想到,咱石家庄还有这么多个第一,走在这条街上,满满都是自豪。4月13日,看到以书页造型精心打造的以开国第一城开国第一城市党