当前位置:文档之家› android音视频的播放与录制

android音视频的播放与录制

3G(3rd-generation第三代移动通信技术)支持高速数据传输提供移动快带多媒体业务移动多媒体业务包括:视频电话视频会议音/视频娱乐点播移动实时监控Android系统提供了视频录制、存储、播放、传输等功能。

Android系统支持3gp和mp4格式的视频文件Android多媒体框架是基于第三方PacketVideo公司的OpenCore这个平台实现的支持所有通用的音频、视频、静态图片格式Android多媒体框架的核心其实就是Open Core框架按当日的提供了上层的Media API给开发人员使用如:MediaPlayer 可以实现音视频的播放和控制MediaRecorder 可以实现音视频的录制代码功能:在ListView行点击事件中启动播放视频的Activity(SystemMediaplayerActivity)//给ListView设置行点击事件监听器getListview().setOnItemjclicklistener(new Onitemclicklistener()){public void onItemclick(AdapterView<?> parent,View view, int position, long id){//通过行索引position获取当前的Videoinfo对象Videoinfo video = videos.get(position);Ingtent intent = new Intent(videoListActivity.this, SystemMediaPlayerActivity.class);//传递视频路径Intent.putExtra(“path”, video.path);Startactivity(intent);}});//在SystemMediaPlayerActivity中调用系统播放器Public class SystemMediaPlayerActivity extends Activity{Protected void onCreate(Bundle savedInstanceState)Super.onCreate(savedInstanceState);//获取启动该Activity的IntentIntent intent = getIntent();//获取Intent中传递的视频路径String path = intent.getStringExtra(“path”);//创建新的意图Intent pIntent = new Intent();//将Activity设置为栈顶运行的ActivitypIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//设置动作是显示数据pIntent.setAction(android.content.Intent.ACTION_VIEW); //设置Intent的动作//设置显示的数据及类型pIntent.setDataAndType(Uri.fromFile(new File(path)), “video/*”);//第一个参数是要打开的数据,第二个参数是以什么类型打开statActivity(pIntent);}video/*以视频方式打开audio/*以音频方式打开Image/*以图片方式打开自定义视频播放器1、SurfaceView继承自View2、如何使用SurfaceViewa.在xml中使用:<SurfaceViewAndroid:id=”@+id/sv_main_screen”Android:layout_width=”fill_parent”Android:layout_height=”fill_parent”</SurfaceView>b.在程序中使用SurfaceView:1、创建一个Activity继承自Activity并实现SurfaceHolder.Callback接口*SurfaceHolder是一个接口,可以把他看做是SurfaceView的控制器,可以用来控制什么时候进行界面创建,什么时候销毁,界面绘制位置等。

2、重新SurfaceHolder的Callback的三个方法:surfaceCreated()SurfaceView创建时调用surfaceChanged()改变时调用surfaceDestroyed()销毁时调用c.如何获取SurfaceView及如何对界面设置具体代码public class MainActivity extends Activity implements SurfaceHolder.Callback{ private SurfacdeView surfaceView;private SurfaceHolder surfaceHolder;protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(yout_main);//获取xml布局中的SurfaceView视图surfaceView = (SurfaceView)findViewById(R.id.sv_main_screen);//通过surfaceView的getHolder()方法获取SurfaceHoldersurfaceHolder = surfaceView.getHolder();//要使用SurfaceHolder的回调方法需通过addCallback()方法添加Callback接口surfaceHolder.addCallback(this);//通过setType()方法设置Surface的类型surfaceHolder.setTy[e(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);public void surfaceCreated(SurfaceHolder holder){//创建时调用}public void surfaceChanged(SurfaceHolder holder , int format , intwidth, int height){//改变时调用}public void surfaceDestroyed(SurfaceHolder holder){//销毁时调用}}}注:setType()方法:是原生数据是不需设置参数,非原生数据需设置SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS为参数d.如何通过MediaPlayer进行视频播放:1.MediaPlayer的创建是用new关键字实例化它的一个对象MediaPlayer mediaPlayer = new MediaPlayer();2.MediaPlayer的常用方法mediaPlayer.setDataSource(videoPath); //设置播放文件的路径mediaPlayer.setDisplay(surfaceHolder);//设置显示视图mediaPlayer.prepare();//准备工作:数据读取界面设置等初始化工作mediaPlayer.start();//开始播放mediaPlayer.isPlaying();//判断是否正在播放mediaPlayer.getCurrentPosition();//获取当前播放位置mediaPlayer.seekTo(position);//设置播放位置:该参数是一个整型值设置了位置再通过Start()方法视频就会从设置的位置开始播放mediaPlayer.reset();//重置:用来重置MediaPlayer到初始状态mediaPlayer.stop(); //停止mediaPlayer.pause(); //暂停e.如何让视频播放1.写一个视频播放的方法:private void playVideo(){try{mediaPlayer.reset();mediaPlayer.setDataSource(videoPath);mediaPlayer.setDisplay(surfaceHolder);mediaPlayer.prepare();mediaPlayer.start();}catch(Exception e){Log.i(“MainActivity”,”视频播放异常”);}}2.在SurfaceHolder.Callback中的surfaceCreated()中调用该视频播放方法playVideo()public void surfaceCreated(SurfaceHolder holder){playVideo(); //当surface创建好后开始播放视频/**自定义播放器*/public class MainActivity extends Activity implements SurfaceHolder.Callback{private static final String TAG = "MainActivity";private SurfaceView surfaceView;private SurfaceHolder surfaceHolder;private MediaPlayer mediaPlayer;private String path = "";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//不显示TitlerequestWindowFeature(Window.FEATURE_NO_TITLE);//全屏显示getWindow().setFlags(youtParams.FLAG_FULLSCREEN, youtParams.FLAG_FULLSCREEN);setContentView(yout_main);mediaPlayer = new MediaPlayer();surfaceView = (SurfaceView)this.findViewById(R.id.sv_main_screen);surfaceHolder = surfaceView.getHolder();surfaceHolder.setKeepScreenOn(true);surfaceHolder.addCallback(this);//非原生数据,不从缓冲区取数据surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);path = getIntent().getStringExtra("path");}/**播放视频*/private void playVideo(){try{mediaPlayer.reset();mediaPlayer.setDataSource(path);mediaPlayer.setDisplay(surfaceHolder);mediaPlayer.prepare();mediaPlayer.start();}catch(Exception e){Log.i(TAG,e.getMessage());}}@Overridepublic void surfaceCreated(SurfaceHolder holder) {playVideo();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {}}}f. 控制视频播放//获取按钮并添加点击事件playBtn = (ImageButton) this.findViewById(R.id.ib_main_play);stopBtn = (ImageButton) this.findViewById(R.id.ib_main_stop);listBtn = (ImageButton)this.findViewById(R.id.ib_main_openlist);playBtn.setOnClickListener(playButtonListener);stopBtn.setOnClickListener(stopButtonListener);listBtn.setOnClickListener(listButtonListener);}/**播放按钮监听事件*/private OnClickListener playButtonListener = new OnClickListener(){@Overridepublic void onClick(View v) {if(mediaPlayer.isPlaying()){return ;}else{playVideo();}}};/**停止按钮监听事件*/private OnClickListener stopButtonListener = new OnClickListener(){@Overridepublic void onClick(View v) {if(mediaPlayer.isPlaying()){mediaPlayer.stop();}else{return;}}};/**播放列表按钮监听事件*/private OnClickListener listButtonListener = new OnClickListener(){ @Overridepublic void onClick(View v) {Intent intent = newIntent(MainActivity.this,VideoListActivity.class);startActivity(intent);finish();}};g.视频的快进退h.视频播放特殊事件处理:例如来电事件1、在播放视频时会首先执行Activity的onCreate()方法,再执行onStart()方法,视频就处于播放状态了,若此时电话了,来电界面将处于屏幕的最前端会完全覆盖播放视频的Activity,此时播放视频的Activity会自动调用Onpause()方法然后去执行电话事件,当挂断电话后会返回到视频播放界面,此时播放视频的Activity又处于屏幕最前端系统会自动调用onResume()方法,onPuse()方法与onResume()是这个特俗事件的处理边界2、如何处理来电特殊事件:*当来电时系统调用onPuser()时,保存当前播放位置并停止视频播放**当挂断电话后系统调用onResume()方法时,从保存的位置继续播放视频3、具体代码实现:a、在播放视频的Activity中定义一个整型变量positionb、判断MediaPlayer是否在播放,如果正在播放通过MediaPlayer的getCurrentPosition()方法来获取当前播放的位置并赋值给变量position然后调用stop()方法停止视频C、当电话挂断后判断position是否大于0,若大于0则调用seekTo()方法将position作为参数给MediaPlayer指定播放位置,然后调用Start()方法继续播放视频,最后将position清零。

相关主题