临汾山东漯河饰品美体美文
投稿投诉
美文创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品
漯河衢州
兴义眉山
桂林阳泉
玉溪简阳
山东遂宁
永城新余
梧州洛阳
泸州温州
临汾清远
营口常熟
浙江大连
桐乡宜昌

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

8月16日 颜如初投稿
  本文代码示例采用的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。时间戳会影响合成后效果,需要注意计算
  如果你对音视频开发感兴趣,觉得文章对您有帮助,别忘了点赞、收藏哦!或者对本文的一些阐述有自己的看法,有任何问题,欢迎在下方评论区讨论!
投诉 评论

冠军违规!苦等10年32岁中国名将奥运铜牌变金牌放牧女孩终圆十年前,22岁的她终于踏上了奥运赛场,她成为中国历史上首位参加奥运会的藏族选手,一枚宝贵的铜牌,在她的运动生涯上写下浓墨重彩的一笔。六年前,因为获得银牌的运动员被查出服用……白色吊带背心真是不错,搭短裤就很漂亮,居家穿既舒服又好看白色吊带背心真是不错,搭短裤就很漂亮,居家穿既舒服又好看白色吊带背心真是不错,搭短裤就很漂亮,居家穿既舒服又好看白色吊带背心真是不错,搭短裤就很漂亮,居家穿既舒服又……华为Mate50Pro新机曝光,一亿像素后置三摄,王者归来华为Mate50Pro的发布时间一直没有确定,最近华为高管余承东给我们带来了好消息,即芯片供应有所缓解。目前,华为Mate50Pro是花粉最关心的。既然芯片已经缓解,这是否意味……MediaCodecAPI,完成音频AAC硬编,5。0异步处本文代码示例采用的Kotlin语法,但是没什么高级特性MediaExtractor:视频文件的提取器,能将视频和音频分离MediaMuxer:音视频文件合成器,能将……量子力学与人类思维的进化遇事不决,量子力学,这个不知道什么时候开始流行的口头禅,成为了现代社会焦虑的缩影。那么量子力学到底是个什么样的世界?这个领域一直为人津津乐道。而我们中国在量子物理学领域里最近这……超简单的卤味配方0失败卤味食材:鸭货550g、啤酒330ml一瓶、冰糖20粒、料酒2勺、生抽6勺、老抽2勺、盐、姜根据量定、喜欢的素菜(海带、莲藕、鹌鹑蛋、鸡蛋)。羲香料:干辣椒2……浙江队官宣!签下CBA休赛期第1个外援,为冲击总冠军做准备上赛季,信心满满的浙江队,在季后赛8进4的比赛中,以大比分02输给了卫冕冠军广东队,从而无缘晋级CBA四强。出现这样的结果,浙江队上下也是十分不甘心,球队主教练刘维伟在赛后更是……尘埃落定!NBA季后赛首轮晋级的球队全部出炉,有意外也有惊喜随着今天灰熊114:106战胜森林狼,灰熊大比分4:2晋级西部半决赛,首轮战罢,东西部均未出现以下克上出线的球队,让大部份认为常规赛战绩无用论的叫嚣啪啪打脸。首轮最令人失……国产又一款新车,哪吒S现身了,比A7帅气,内饰成最大亮点在当下国内汽车市场上,新能源汽车的市场前景特别不错。尤其是比亚迪品牌旗下的车型受到众多国人的喜爱。不过,今天我们说的不是比亚迪品牌旗下的车型,而是这款国产新车,它现身之后受到了……美国卡车模拟蒙大拿州DLC8月4日上线《美国卡车模拟》Steam页面更新新一期博客蒙大拿州DLC推出日期公布。根据官方,该DLC将于8月4日上线。DLC发售预告:优酷视频云蒙大拿州是继加州、内华达、亚利……焦虑内耗恬淡接纳,历经才懂人生两大境界,一个知道,一个知足久未露面的天后王菲因为被狗仔拍下的生图,瞬间登顶热搜,治愈内耗的效果比二舅毫不逊色,两个连续登上热搜的消息,一方面暴露了焦虑内耗的年轻人群体庞大,毕竟现代快节奏的生活让人精神紧……95后出任百亿上市公司首席执行长!27岁的他,四大战略曝光95后新掌门的突然上任,让外界对中国生物制药未来的发展充满期待与好奇。7月28日,港股上市公司中国生物制药任命了新一任首席执行长,年轻的95后青年谢承润宣布走马上任。他是……
婚后沈梦辰有多甜?连衣裙好俏听说南方的姐妹们已经开始承受30度的高温了!是时候穿上小裙子了!随着四月的到来,女明星的日常都被小裙子包揽。婚后的沈梦辰少女状态满分,穿着碎花裙跳跃在蓝天、草地之间……有情有义!北京国安派人亲赴大连,悼念功勋老将王涛头条创作挑战赛在11月4日,咱们国内足坛传来了一个坏消息,职业生涯曾效力大连万达和北京国安的传奇名将王涛因为突发疾病英年早逝,享年52岁!王涛身高1米94,当年是咱……43岁章子怡穿白色包臀裙惊艳亮相,华丽致极头条创作挑战赛11月4日,章子怡高调出席品牌活动。那一天,她一袭白色包臀裙惊艳亮相,可以说是华丽至极。不管她有多漂亮,或者长得怎么样,她都很在线。看来章子怡这几年放慢工作节奏,……一战成名的甘肃泾川文汇即将拥有自己的主场央广网兰州11月21日消息(见习记者李红军)近日,在足协杯第二轮淘汰中超劲旅北京国安的中冠球队甘肃泾川文汇一战成名,在引发全国球迷及网友热议的同时,球队可谓好消息不断。11月2……年底被迫清库存,红米K50风光不再,3款性价比首选,用5年都头条创作挑战赛我们在购买手机的时候,性价比往往是大家考虑的首要指标。尤其是到了年底,各家厂商的发布新机周期已经差不多,随着红米K50热度跌落神坛,后起一批新秀机型更是主打……iOS16。2正式版发布,新变化整理!今天凌晨苹果正式推送了iOS16。2正式版,版本号为20C65距离上一次版本更新时隔5天,除了带来全新的功能以外还修复不少系统问题,下面将给大家总结一下本次更新的所有新变化。……突破认知误区你可能对自己最无情,可惜你没有认识到这一点!如果有人对你说:你对你自己很无情!你同意不同意他的说法?我估计你也不会同意:什么,我对自己很无情,你胡说什么呀?滚!这个人继续问你:如果你对自己有情,那你对自己有情表现在……处境不佳还乱说话,内马尔公开赞美别人或惹恼姆巴佩,遭清洗正常内马尔作为曾经的足坛第三人,如今已经沦落到了惨遭俱乐部清洗的地步。面对如此不佳的局面,内马尔还不知收敛,一直作。乱说话,夜店狂嗨,看起来丝毫不担心俱乐部高层对他的态度。近日巴西……vivoX90评测标准版,但十项全能十年寒窗十年九不遇十年磨一剑十年树木,百年树人十年,这个时间单位在我们的文化里,一直就是阶段性的、具纪念意义的、里程碑式的。在绝对公平的时间面前,个人还……华为65英寸智慧屏,大内存鸿鹄画质,终于降至良心价现在的液晶面板国产化稳步提升,带动液晶电视行业全面降价,比如以前我们不敢想的86英寸巨屏电视已经降到了5000元出头,普及率非常高的65英寸电视则降到了2000元左右。这……孩子长高有秘诀,多吃这4类食物,少生病还能多长5cm上周末,带娃在小区玩,同楼栋的一位妈妈也带着孩子来玩,同为遛娃妈,自然少不了聊聊天。同为老母亲,很能理解这位妈妈的焦虑:还有什么事,能比一边搬砖一边照顾一个年幼又多……ColorOS13。0首发FindX5系列一加10Pro等三文手机技巧库不负万众期待,Android13正式版终于来了,国产品牌首批适配推送更新。最近,ColorOS官宣OPPOFindX5、FindX5Pro、以及一加10Pro……
友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找