android全格式多媒体播放器(二:opencore媒体系统解析)
16lz
2021-01-25
/*******************************************************************
• 此文章解释权归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 探讨
• 此文章解释权归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 探讨
更多相关文章
- 一款常用的 Squid 日志分析工具
- GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
- RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
- Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
- Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
- Android(安卓)解压中文乱码(压缩包内中文乱码)
- Android(安卓)自定义标题栏背景
- Android与JS之间的互调
- Android之Fragment多个页面切换实现