专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

MediaCodecAPI,完成音频AAC硬编,5。0异步处

  本文代码示例采用的Kotlin语法,但是没什么高级特性
  MediaExtractor:视频文件的提取器,能将视频和音频分离
  MediaMuxer:音视频文件合成器,能将提取到的视频和音频合成新的视频
  MediaFormat:提取器获取到的媒体格式类,保存了获取到的媒体的信息(媒体类型,帧率等)1。设置需要权限
  一。如果是本地文件,会涉及到读取和写入,需要在Manifest配置
  6。0以上要在代码中动态申请,这里就省略了2。获取需要的视频文件
  本文是直接通过contentResolver查询多媒体文件valcursorcontentResolver。query(
  MediaStore。Video。Media。EXTERNALCONTENTURI,
  null,null,null,null
  )
  查询到的数据存储到了自建的Song类中,存了文件名(name)和路径(path),然后用ListView展示,
  为了省事,直接使用的就是点击的文件和相邻下一个文件做为提取视频和音频的原材料如果不想麻烦去找文件,也可以直接把视频文件放到resraw文件夹下,raw要自己创建然后获取文件,MediaExtractor。setDataSource支持很多方式填充
  【更多音视频学习资料,点击下方链接免费领取,先码住不迷路】
  点击领取音视频开发基础知识和资料包3。提取音视频
  配置音视频提取器
  paramposition点击的文件下标
  funconfigureVideoAndAudioExtractor(position:Int){
  try{
  1。设置要提取视频的文件
  MediaExtractor反复提示初始化失败
  1。检查文件访问权限
  2。检查视频文件大小是否大于0!!!!!!!!!!!!!!!
  3。最好不要用拼接路径,比如
  mVideoMediaExtractor。setDataSource(context。getFilesDir()xxx。mp4)
  最好添加路径变量或完整路径地址,比如下面的变量或
  mntsdcard。。。。。。xxx。mp4这种的
  初始化解析器和合成器对象,合成输入的格式是mp4,
  outputVideoPath是合成后输出的路径,自己构建就好
  我的是fileDirvideo。mp4
  mMediaMuxerMediaMuxer(outputVideoPath,
  MediaMuxer。OutputFormat。MUXEROUTPUTMPEG4)
  mVideoMediaExtractorMediaExtractor()
  mAudioMediaExtractorMediaExtractor()
  songList是一个集合,存着Song类,
  设置要提取出视频的原材料文件
  mVideoMediaExtractor。setDataSource(songList〔position〕。path)
  设置要提取出音频的文件
  mAudioMediaExtractor。setDataSource(songList〔position〕。path)
  获取轨道,找到视频轨道
  for(iin0untilmVideoMediaExtractor。trackCount){
  valmediaFormatmVideoMediaExtractor。getTrackFormat(i)
  if(mediaFormat。getString(MediaFormat。KEYMIME)。startsWith(video)){
  获取到视频轨道
  mVideoMediaExtractor。selectTrack(i)
  获取添加到Muxer后生成的新的视频轨道下标
  videoMuxerTrackIndexmMediaMuxer。addTrack(mediaFormat)
  获取视频帧最大值,为了后面合成新视频,读取文件时候设定缓冲区大小
  maxFrameSizemediaFormat。getInteger(MediaFormat。KEYMAXINPUTSIZE)
  获取视频帧率,为了后面计算获取到的文件处于的播放时间
  frameRatemediaFormat。getInteger(MediaFormat。KEYFRAMERATE)
  }
  }
  找到视频文件中的音频轨道,方法和获取视频差不多
  for(jin0untilmAudioMediaExtractor。trackCount){
  valmediaFormatmAudioMediaExtractor。getTrackFormat(j)
  if(mediaFormat。getString(MediaFormat。KEYMIME)。startsWith(audio)){
  获取音轨
  mAudioMediaExtractor。selectTrack(j)
  添加音轨到Muxer
  audioMuxerTrackIndexmMediaMuxer。addTrack(mediaFormat)
  获取音频最大输入,为了计算缓冲区大小
  maxAudioSizemediaFormat。getInteger(MediaFormat。KEYMAXINPUTSIZE)
  }
  }
  这个方法内执行MediaMuxer的合成操作,下面会贴出来
  compoundVideoAndAudioWithPermissionCheck()
  }catch(e:IOException){
  Log。i(exception,e。message)
  }finally{
  释放资源,切记最后要是放资源,重新添加合成文件时候要新建MediaExtractor和MediaMuxer
  if(mMediaMuxer!null){
  mMediaMuxer。release()
  }
  if(mVideoMediaExtractor!null){
  mVideoMediaExtractor。release()
  }
  if(mAudioMediaExtractor!null){
  mAudioMediaExtractor。release()
  }
  }
  }
  总结一下步骤就是
  1。创建MediaExtractor和MediaMuxer对象
  2。为MediaExtractor对象添加需要的文件setDataSource()
  3。for循环获取视频轨道和音频轨道MediaExtractorselectTrack(),并添加到MediaMuxer中MediaMuxeraddTrack()
  4。开始准备合并4。合成音视频
  合成视频和音频
  funcompoundVideoAndAudio(){
  1。开始合成
  mMediaMuxer。start()
  2。输入提取到的视频,videoMuxerTrackIndex是之前addTrack生成的下标,
  如果为1就是添加失败
  if(1!videoMuxerTrackIndex){
  描述缓冲区数据信息类,最后Muxer合成要求有的东西
  valvideoBufferInfoMediaCodec。BufferInfo()
  创建缓冲区,最后Muxer合成要求有的东西
  valvideoByteBufferByteBuffer。allocate(maxFrameSize)
  while(true){
  3。获取样本大小
  valvideoSampleSizemVideoMediaExtractor。readSampleData(videoByteBuffer,0)
  if(videoSampleSize0){
  break
  }
  4。设置样本信息
  videoBufferInfo。offset0堆buffer缓冲区写入时的字节偏移
  videoBufferInfo。sizevideoSampleSize
  videoBufferInfo。flagsmVideoMediaExtractor。sampleFlags
  读取到的文件的时间戳,单位是微秒
  videoBufferInfo。presentationTimeUs10001000frameRate每次加每帧的微秒数
  MediaMuxer写入样本数据
  videoMuxerTrackIndex之前加入Muxer的视频轨下标
  videoByteBuffer上面创建的Buffer对象
  videoBufferInfo上面创建的BufferInfo对象
  mMediaMuxer。writeSampleData(videoMuxerTrackIndex,videoByteBuffer,videoBufferInfo)
  5。推进到下个样本类似快进
  mVideoMediaExtractor。advance()
  }
  }
  合成音频,和视频类似
  if(1!audioMuxerTrackIndex){
  valaudioBufferInfoMediaCodec。BufferInfo()
  valaudioByteBufferByteBuffer。allocate(maxAudioSize)
  while(true){
  valaudioSampleSizemAudioMediaExtractor。readSampleData(audioByteBuffer,0)
  if(audioSampleSize0){
  break
  }
  audioBufferInfo。offset0
  audioBufferInfo。sizeaudioSampleSize
  audioBufferInfo。flagsmAudioMediaExtractor。sampleFlags
  audioBufferInfo。presentationTimeUs10001000frameRate
  mMediaMuxer。writeSampleData(audioMuxerTrackIndex,audioByteBuffer,audioBufferInfo)
  mAudioMediaExtractor。advance()
  }
  }
  }
  }
  }
  这个方法是在之前的方法内调用,所以try。。catch写在上面的方法中,这些步骤都可以在子线程中去做,最后可以通过系统的VideoView控件来播放outputVideoPath路径的视频,查看是否合成成功
  【更多音视频学习资料,点击下方链接免费领取,先码住不迷路】
  点击领取音视频开发基础知识和资料包总结流程创建Buffer对象和MediaCodecBufferInfo对象读取样本数据,验证数据大小填写bufferInfo的信息将缓冲区内容写入Muxer调用MediaExtractoradvance(),推进到下个样本数据,循环步骤25释放资源
  需要注意的地方!!!!!!!!!!!!!!!
  1。权限获取
  2。验证要提取的文件是否合法,比如大小,本人遇到MediaExtractor。setDataSource()一直无法初始化MediaExtractor,结果发现添加的视频大小为0KB
  3。时间戳会影响合成后效果,需要注意计算
  如果你对音视频开发感兴趣,觉得文章对您有帮助,别忘了点赞、收藏哦!或者对本文的一些阐述有自己的看法,有任何问题,欢迎在下方评论区讨论!

科莫多巨蜥的毒液到底有多可怕?2009年,一名31岁的渔民安瓦尔,在印尼科莫多岛上采摘水果,结果不小心从水果树上掉了下来,刚好踩到了一只巨型蜥蜴,蜥蜴瞬间就朝他扑了过去,咬住了他的腿,之后又咬住了他的手臂,身体武汉未来的房价会涨到100000元平米吗?这个问题的答案是肯定的!以目前的趋势,未来武汉房价必然达到10万的水平,只是时间长短的问题。2010年至2017年,短短七年间,武汉的房价已经翻了3番,目前,武汉部分高端楼盘如洞庭兰州青白石片区,中央公园怎么样?兰州北拓的黄金区域,目前基础交通还跟不上建设需要,交通滞后可能会成为十四五期间兰州青白石片区发展的的最大障碍!不过就兰州地理位置和城区格局而言,青白石片区是离主城区最近的待开发区域农民为什么不在国家统计失业范围之内?中国有四个儿子,大儿子叫工人,二儿子叫子弟兵,三儿子叫公务员,四儿子叫农民,所以四儿子就没有纳入统计失业包括养老金范围,因为四儿子有金山银山还有三分地。农民有土地,这是农民可以赖以农村成立社区是什么意思?很多农村驻有村委会办公室,同时也驻有社区管理委员会办公室,特别是在城市郊区的农村和街道的农村都同时设立了村委会和社区管理委员会,很多人弄不明白是怎么回事。那农村成立社区是什么意思呢农村里的剩男,为何一剩再剩呢?到底是什么原因?男女比例失调。计划生育只要一个孩子时,受封建思想影响,都拚命要男孩,等他们长大了,很难找到媳妇。一,农村姑娘远嫁,二,女孩见少,三,彩礼高,四,剩男挣钱少。我就一大龄剩男!个人亲身抖音付费直播试水,看直播要给钱了?我们应该如何思考?使劲收,最好是家人们看的话,一分钟100块钱。毕竟粉丝听话的很。毕竟人设都设计好了打PK,卖货摆错价格,怒亏2个亿回馈粉丝。没事就怼工厂,怼员工反正就是赔钱回馈粉丝。赔完还得补交税马上就要退休了,退休工资才3650元太少了,怎么办?3600不少了。我企业工龄32年,退休时退休金只有2200,涨了这么多年还不到3000。知足常乐吧!如果身体不好,这些钱也够生活了,如果身体还可以,就找一些力所能及的工作,打打工补南宁五象新区未来的发展潜力很大吗?五象新区无法成为国家级新区!!!目前看来,五象新区的潜力也就这样了。我们对比一下贵阳的贵安新区,贵安新区的面积是1700平方公里,由贵阳市的郊区和安顺市合并得来。是全国第8个国家级如果把三峡大坝加高10米,截留更多的洪水,可行吗?我国的三峡大坝,作为当今世界上最大的水利枢纽工程,位于湖北省宜昌市上游,距下游葛洲坝水电站38公里,三峡大坝全长2309米高185米,呈梯形形状,集发电旅游航运调控洪水于一身。三峡大家有经历过亲人去世吗?是怎样走出痛苦和想念的?2018年9月1日下午3点8分,我的妻子在医院里停止了呼吸。她的眼睛没有闭上,我流着泪,帮她合上了双眼。我永远失去了我最亲近的爱人,孩子永远的失去了妈妈。一位好妻子,好女儿,好姑妈
上海外企的员工英语都好吗?正好我正在题主所说的上海一外企工作。我所经历的欧美外企对英语的要求大致是这样入职面试时,对英语的要求外企面试一般会有英语的部分。有两种,一种是国内的你的主管领导和你进行一些业务方面拖欠农民工工资,合法吗?如果不合法,算不算违法呢?如果违法,为什么一些单位不怕?董先生个人观点一,拖欠任何人工资都是不合法的,工资是工作的基本报酬,是用人单位必须履行承担的法律义务。二,农民工是现代城市建设者,高楼大厦的建设者,他们为城市的繁荣发展做出了卓越的农民自家的承包地上可以建房吗?不可以。农民没有自家的土地,土地都属于集体的。即使现住的房屋所在的宅基地,其性质仍是集体性质。农民建房,必须打报告向村镇两级政府请示,待批准并划定宅基地才允许建房。原住房整修也得向为什么有人说在地级市怀化几乎所有经过的高铁普铁都会在此停下而比如长沙武汉都有不停的车?对于这个问题,身为怀化人的我也一直觉得很奇怪。首先问题绝对没夸张,自记事起好像就没听说过有什么车经过怀化不停的,有些连省会长沙都不停的车也到怀化必停。而且,几乎在怀化的停车时间都比香港到底算不算国际大都市?如果香港不算国际大都市,那么中国就没有国际大都市了,北京和上海的国际大都市排名都不如香港,香港是国际公认的仅次纽约伦敦巴黎东京的国际大都市。至于香港为什么拥有这么前的国际大都市排名无锡的发展瓶颈在哪里?现在在无锡找个像样的工作基本没戏,我工作15年,身边不下20个前同事陆陆续续都跑到苏州,上海,南京,常州工作。临近的每天来回,100多公里,远点的一周回一次。这都是为啥?还不是因为娶个老师是什么体验?我就是那个娶了老师的人,在外人眼里我是那么幸福娶了个文化人,可其中的痛苦和辛酸只有我自己知道。娶了老师,你就成了免费司机奶爸学生,还不能反驳,因为你吵也吵不过她。我今年36岁,自由为什么有些公司发工资,一部分发现金,一部分打银行卡,这是什么原因?你怎么看?一句话为了偷税漏税,做账的工资少了,员工可以少交个人所得税。工资低了,单位社保交费基数少了,可以少交社保。目录绝大多数用私账发工资的公司,可能都已经涉嫌违法了。很多老板可能都有过这为什么感觉一些大厂招聘算法工程师工资普遍比开发工资高?因为算法工程师比开发工程师牛1从技能上来说,算法工程师干得了开发可开发工程师干不了算法。2从专业上来说,算法工程师对数学能力要求特别高而开发工程师编程水平高就行了。3从工作要求上来广西考驾照很容易吗?我是在桂林考的,我觉得不难。首先先说一下我们这边的费用吧。桂林这边的驾校普遍是3000多到5000左右。当然有一些包含了补考费。但是有一些是不包含补考费的。(南宁那边还有一些驾校收1954年首批确定的重点大学是哪几所?现在的实力如何?1954年,我国的重点高校工作范围协议出台,第一批全国重点大学确立,一共是六所北京大学清华大学哈尔滨工业大学北京农业大学人民大学和北京医科大学。这六所大学为我国的工业农业医疗国防建
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网