Android之Media播放器源码分析(framework——native)

一、概述:      

      声明:下面我们看的是Android 4.0版本下的Media播放器的框架,我们首先从一个简单的media播放器apk源码入手,从Java->JNI->C/C++一步步研究Android是如何通过Java一个MediaPlayer实现解码到屏幕的输出。

     通常在Android中播放视频用到的是MediaPlayer类,展示视频使用的是SurfaceView控件。

二、apk实现:

     我们首先在main.xml布局文件中添加用于视频画面绘制的SurfaceView控件:

 

<SurfaceView android:layout_width="fill_parent"android:layout_height="240dip"android:id="@+id/surfaceView"/>


 

     例如我们编写一个简单的视频播放器调用的常用方法如下。       

SurfaceView surfaceView = (SurfaceView)this.findViewById(R.id.surfaceView);  
surfaceView.getHolder().setFixedSize(720, 576);  //设置分辨率   
/*下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前*/  
surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
/* new 一个播放器 mediaPlayer */
MediaPlayer mediaPlayer = new MediaPlayer();  
mediaPlayer.reset();	//重置为初始状态   
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  
/* 设置Video影片以SurfaceHolder播放 */  
mediaPlayer.setDisplay(surfaceView.getHolder());  
mediaPlayer.setDataSource("/mnt/sdcard/test.ts");  
mediaPlayer.prepare();		//缓冲    
mediaPlayer.start();		//播放   

mediaPlayer.pause();		//暂停播放   
mediaPlayer.start();		//恢复播放   
mediaPlayer.stop();			//停止播放   
mediaPlayer.release();		//释放资源 

 

三、源码分析       

       我们首先来看MediaPlayer类,Java层的MediaPlayer.java位于frameworks/base/media/java/android/media/目录下:

 

public class MediaPlayer
{
	...
	static {
		System.loadLibrary("media_jni");
		native_init();
	}
	
	private int mNativeContext;
	private int mNativeSurfaceTexture;
	private int mListenerContext;
	
	private SurfaceHolder mSurfaceHolder;
	private EventHandler mEventHandler;
	
	
	public MediaPlayer() {
		Looper loop;
		if((loop = Looper.myLooper()) != null) {
			mEventHandler = new EventHandler(this, looper);
		} else if((looper = Looper.getMainLooper()) != null) {
			mEventHandler = new EventHandler(this. looper);
		} else {
			mEventHandler = null;
		}
		native_setup(new WeakReference<MediaPlayer>(this));
	}
	....
}

(一) static代码块

      首先会加载libmedia_jni.so库,调用native_init()方法,对应JNI接口为

 

android_media_MediaPlayer_native_init(JNIEnv* env)
{
	jclass clazz;
	
	class = env->FindClass("android/media/MediaPlayer");
	
	fields.context = env->GetFieldID(clazz, "mNativeContext");	// Java类中保存JNI层的mediaplayer对象
	
	/* JNI 事件通知Java,static 函数 */
	fields.post_event = env->GetStaticMethodID(clazz, "postEventFromNative", "(Ljava/lang/Object;IIILjava/lang/Object;)V");

	fields.surface_texture = env->GetFieldID(clazz, "mNativeSurfaceTexture", "I");
	
	jclass surface = env->FindClass("android/view/Surface");
	
	fields.bitmapClazz = env->FindClass("android/graphics/Bitmap");
	
	fields.bitmapContstructor = env->GetMethodID(fields.bitmapClazz, "<
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
unreal media capture 是一款用于捕获和编码视频和音频的工具,其源码分析主要涉及到软件的基本架构、核心功能和关键算法等方面。 首先,unreal media capture 的基本架构包括三个主要模块:媒体捕获模块、媒体编码模块和媒体传输模块。媒体捕获模块负责从摄像头或屏幕等设备中获取原始音视频数据;媒体编码模块将原始数据进行压缩编码,以提高数据传输效率和减少带宽占用;媒体传输模块负责将编码后的数据传输到目标设备或网络。 其次,unreal media capture 的核心功能包括音视频流的捕获、编码和传输等。捕获功能通过与音视频设备的交互,获取原始的音视频数据流;编码功能将原始数据进行压缩编码,以减小数据体积和提高传输效率;传输功能将编码后的数据流传输到指定设备或网络。 另外,unreal media capture 的源码分析还需深入理解其中的关键算法。例如,音视频的编码算法主要采用诸如H.264、AAC等标准的编码算法,需要了解其原理和应用;传输模块中的网络传输算法需要熟悉网络协议和数据传输机制,如UDP或TCP等;另外,还需要分析源码中的数据流处理算法,以及视频帧率、分辨率和音频采样率等参数的处理方式。 总之,unreal media capture 源码分析需要对软件的基本架构、核心功能和关键算法等方面有深入的理解。只有通过深入分析源码,我们才能全面了解该工具的原理和功能,进而进行二次开发或优化工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值