mediaplayer是android中的一种多媒体播放类,上层应用调用mediaplayer接口可以实现音视频的播放。mediaplayer最终是通过MediaPlayerFactory类的getPlayerType方法来选择具体的player。google默认的player是NU_PLAYER,该player最终会跑到mediacodec中去。很多公司在开发时会添加自己的player类型,如:ffmpeg

由于存在多个player类型,因此需要在getPlayerType这个接口中去进行选择。一般的文件都带有自己的后缀名,例如MP3、MP4、WAV等,这些文件名直接包含后缀的文件选择播放器十分简单,如下:

    if(strstr(url,".ogg")){return NU_PLAYER;} 

但是往往会碰到那种根据后缀名无法判断媒体类型的文件,例如打包进apk里面的raw文件,它通过setDataSource传到下面的路径往往是像下面这样的情况

setDataSource(fileurl =/system/app/webview/webview.apk)

此时我们无法直接得到媒体文件的封装格式,无法确定里面包含的媒体文件具体类型。

假如有这样的需求:上层传下的apk文件如果只包含音频,选择NU_PLAYER,此时该如何操作呢?实现代码如下:

bool MediaPlayerFactory::isFileOnlyContainAudio(int fd,int64_t offset,int64_t length){bool hasAudio = false;bool hasVideo = false;sp<DataSource> checksource;sp<IBinder> binder =defaultServiceManager()->getService(String16("media.extractor"));if (binder != nullptr) {sp<IMediaExtractorService> mediaExService(interface_cast<IMediaExtractorService>(binder));sp<IDataSource> source =mediaExService->makeIDataSource(fd, offset, length);if (source.get() != nullptr) {checksource = DataSource::CreateFromIDataSource(source);} else {ALOGW("extractor service cannot make data source");}} else {ALOGW("extractor service not running");}sp<IMediaExtractor> extractor = MediaExtractor::Create(checksource);size_t n = extractor->countTracks();for(size_t i = 0; i < n; ++i){sp<MetaData> trackMeta = extractor->getTrackMetaData(i);const char *mime;if (trackMeta->findCString(kKeyMIMEType, &mime)) {if(!hasVideo && !strncasecmp("video/", mime, 6)){hasVideo = true;}else if(!hasAudio && !strncasecmp("audio/", mime, 6)){hasAudio = true;ALOGD("%s",mime);}}}if(extractor != NULL) extractor->release();if(checksource != NULL) checksource.clear();if(hasAudio && !hasVideo){return true;}return false;
}

定义一个接口isFileOnlyContainAudio,通过binder调用IMediaExtractorService的接口提取文件中的所有track。通过这个接口来判断文件中是否只包含音频,最后在getPlayerType中添加:

    if(strstr(filePath.string(),".apk") && isFileOnlyContainAudio(fd, offset, length)){                                                           return NU_PLAYER;}

修改位置:frameworks/av/media/libmediaplayerservice/MediaPlayerFactory.cpp

这里主要是抛砖引玉,有类似的需求可以参考这样的改法

Android mediaplayer native层判断文件中码流的具体格式相关推荐

  1. Android使用lame将PCM文件转码为MP3文件

    Android使用lame将PCM文件转码为MP3文件 1. 软件版本 Android Studio版本:4.2 lame版本:3.100 编译参考:centos7使用ndk编译lame 2. 项目配 ...

  2. android游戏基址,Android上可执行ELF文件中的段不能有基址

    Android上可执行ELF文件中的段不能有基址 @(Android研究)[android] [TOC] 场景 我使用Android NDK的编译工具交叉编译qemu项目(编译可在Android上运行 ...

  3. android xml获取指定,android:如何从xml文件中获取信息?

    我得到一个程序,从一个链接的服务器获取天气.我已经做了一些将字符串结合到URL的字符串.我现在需要从XML文件中获取信息.android:如何从xml文件中获取信息? 这是我的代码:(我更换了,为了安 ...

  4. H.264码流结构及JM8.6中码流的产生步骤

    整理自:http://www.cnblogs.com/xkfz007/archive/2012/08/12/2612931.html H.264中的码流结构 H.264码流结构示意图: NALU第一字 ...

  5. 录像机中码流类型中定时、事件、网传代表什么意思?

    .Q:录像机中码流类型中定时.事件.网传代表什么意思? A:定时(主流):定时计划录像编码参数 事件(主流):运动检测,报警输入等事件发生时的编码参数 网传(辅流):只能网络传输的低分辨率编码参数

  6. ffmpeg使用bsf后码流从avcc格式变成annex-b造成硬解异常

    ffmpeg使用bsf后码流从avcc格式变成annex-b造成硬解异常 问题的产生 第一个ffmpeg拷贝(copy)第三方的流到源站,第二个ffmpeg进程的源流为第一个ffmpeg的输出,并使用 ...

  7. <整理总结>H264/265码流数据包格式分析(带mp4v2封装H264/265为MP4的源码示例)

    H264/265码流数据包格式分析 前言: 一.H.264码流解析 I帧P帧B帧说明: 二.H.265码流解析 三.主要源码 前言: 最近在学习使用MP4v2将H264/H265码流以及AAC音频封装 ...

  8. php+打开图片二进制文件,php图片文件、二进制流、base64格式相互转化

    1,php 图片文件.二进制流.base64格式相互转化$image = 'E:/www/logo.png';  //图片文件地址 $type = getimagesize($image)['mime ...

  9. android oat如何提取dex文件字节码,Android: 使用oatdump反编译oat文件

    网上经常看到有通过apktool将apk中的dex反编译成smali格式的文件,以便分析功能实现与破-解,确没怎么看到oat文件反通过oatdump反编译的,所以就写了一篇这样的文档.声明一下oat文 ...

最新文章

  1. Effective C# 原则1:尽可能的使用属性(property),而不是数据成员(field)
  2. nginx上传文件大小
  3. Delphi中点击DBGrid某一行获得其详细数据方法
  4. MathType可以编辑省略号吗
  5. 浏览器解析JavaScript的原理
  6. 二维数组子数组矩形和
  7. 【hue】 hue+sentry界面没有添加角色的按钮
  8. neo4j禁用服务器身份验证,bulls/Neo4j:创建图形对象时发生身份验证错误
  9. Linux——Django 开发环境部署(二)python版本控制器pyenv
  10. wlop一张多少钱_求解实木家具沙发垫多少钱一张
  11. 如何在Mac视频中添加表情符号
  12. JAVA多线程是什么
  13. 猿辅导揭秘听课小窍门,掌握这些技巧让你的学习事半功倍
  14. 2011的总结(感谢自己,感恩他人)【转自我的新浪博客】
  15. Android项目实战之高仿网易云音乐项目介绍
  16. 跟随器为何要加反馈电阻?
  17. WebRTC 实现P2P音视频通话——搭建信令服务器
  18. 京东2018年校园招聘笔试代码环节答案分享
  19. Python数据分析 第一章 数据分析的概述
  20. 如何实现“轻高精地图”的城市NOH?毫末自动驾驶的8大亮点

热门文章

  1. linux下剪切文件怎么恢复,linux下文件夹的创建、复制、剪切、重命名、清空和删除命令...
  2. 自旋锁 - 搬运自维基百科
  3. 一文快速实现微信公众号支付功能(详细版,建议收藏备用)
  4. 计算机专业可以考航空航天专业研究生吗,我是信息与计算科学专业的大二学生,想考北京航空航天计算机专业方向的研究生,那么从现在起我该做些什么...
  5. Enable VT-x in your BIOS security settings (refer to documentation for your computer)
  6. 虚拟服务器的弊端,解决虚拟化弊端的六大诀窍
  7. java后台代码校验手机号和身份证工具类
  8. jq 用val()获取input的值无效
  9. Google Guava常用工具类入门使用介绍及样例说明
  10. 关于机械臂逆运动学 jacobian矩阵