/*******************************************************************
• 此文章解释权归windsome所有,如要转载无须联系本人。
• 转载需要包含此抬头信息,如有疑问,欢迎联系本人。
• QQ: 35327864
• msn: fgwf1@hotmail.com
• mail: agooou@gmail.com
********************************************************************/

本文的目的是为了分析android中的多媒体播放体系,在了解了它的播放体系上,抛弃它原先的基于opencore的架构,重新涉及一套基于ffmpeg的架构。没有时间做详细论述,本文目前先列一个提纲,用来分析android2.1中媒体播放架构,以后得空再进行补充。

1,java部分供java应用程序调用的接口为android.media.MediaPlayer。关于此类的详细描述可以参考android的文档MediaPlayer.html。我将接口列在了下面,
mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setOnPreparedListener(mPreparedListener);
mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener);
mMediaPlayer.setOnCompletionListener(mCompletionListener);
mMediaPlayer.setOnErrorListener(mErrorListener);
mMediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener);
mMediaPlayer.setDataSource(mContext, mUri);
mMediaPlayer.setDisplay(mSurfaceHolder);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setScreenOnWhilePlaying(true);
mMediaPlayer.prepareAsync();
mMediaPlayer.isPlaying()
mMediaPlayer.start();
mMediaPlayer.pause();
mDuration = mMediaPlayer.getDuration();
mMediaPlayer.getCurrentPosition();
mMediaPlayer.seekTo(msec);

2,android.media.MediaPlayer中有2部分,一部分供java上层如VideoView调用,一部分为native方法,调用jni。所有用到的jni的接口可以在frameworks/base/media/jni/android_media_MediaPlayer.cpp中找到。

3,android_media_MediaPlayer.cpp会调用c++层次的mediaplayer,在这里根据不同的扩展名去调用不同的播放器,mp4可能会调用到PVPlayer。mediaplayer由下列文件实现,
frameworks/base/media/libmedia/IMediaPlayer.cpp
frameworks/base/media/libmediaplayerservice/MediaPlayerService.cpp

4,PVPlayer由opencore实现,从以下文件去探寻
frameworks/base/include/media/PVPlayer.h
external/opencore/android/playerdriver.cpp

5,视频显示的实现,使用android-surface进行render,由opencore对surfaceflinger做了封装,在下列文件中,
external/opencore/android/android_surface_output.h
external/opencore/android/android_surface_output.cpp
如果我们使用基于ffmpeg的多媒体播放器,这一块可以参考,并移植过去。

6,音频的实现,使用了AudioOutput,请参考如下文件
frameworks/base/media/libmediaplayerservice/MediaPlayerService.h
frameworks/base/media/libmediaplayerservice/MediaPlayerService.cpp
调用MediaPlayerService::AudioOutput::open,创建AudioTrack mTrack。可以查找一下调用了mTrack的哪些方法。
调用ssize_t ret = mTrack->write(buffer, size);将数据写入AudioTrack。
frameworks/base/include/media/AudioTrack.h
frameworks/base/media/libmedia/AudioTrack.cpp

7,音频这一块太过混杂,libmedia调用了opencore,libaudioflinger调用了libmedia,对于我们封装造成了很大困难。鉴于此,考虑直接调用linux音频设备,不使用android中libmedia,libaudioflinger。

8,欢迎联系 agooou@gmail.com 探讨

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
  6. Android(安卓)解压中文乱码(压缩包内中文乱码)
  7. Android(安卓)自定义标题栏背景
  8. Android与JS之间的互调
  9. Android之Fragment多个页面切换实现

随机推荐

  1. Kickstarter众筹基于Xilinx Artix-7软件
  2. jenkins分布式节点添加
  3. mbr修复、RAID组合方式与性能、文件系统
  4. NSX-T3.0.1安装
  5. 文字编辑器如何从命令行运行宏或脚本
  6. 她她她她她她她她她
  7. SumSwap含着数学金钥匙出生,独创SUM经济
  8. 函数的递归
  9. 浅析集群会话绑定tomcat cluster session
  10. MediaInfo 专业音视频信息提取工具