Androidx学习笔记(78)--- 视频播放器(MediaPlayer+SurfaceView)

本文是Androidx学习笔记的一部分,主要探讨SurfaceView在视频播放中的应用,包括其双缓冲技术和资源管理特性。同时,介绍了开源的音视频编解码库FFMPEG以及基于FFMPEG的Vitamio播放框架,它提供了Java API方便使用。SurfaceView对于实时画面更新有高要求,适合视频播放,并通过SurfaceHolder回调监听其状态,确保播放的无缝衔接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SurfaceView

  • 双缓冲技术
  • 该组件是重量级组件:占用资源比较多
    • 只要不可见,就不会创建,可见时,才会创建
    • 只要不可见,就会销毁

FFMPEG

  • 开源免费的音视频编解码器

Vitamio

  • 封装了FFMPEG的视频播放框架
  • 对外提供的api全部都是javaApi

SurfaceView

  • 对画面的实时更新要求较高
  • 双缓冲技术:内存中有两个画布,A画布显示至屏幕,B画布在内存中绘制下一帧画面,绘制完毕后B显示至屏幕,A在内存中继续绘制下一帧画面
  • 播放视频也是用MediaPlayer,不过跟音频不同,要设置显示在哪个SurfaceView

    SurfaceView sv = (SurfaceView) findViewById(R.id.sv);
    SurfaceHolder sh = sv.getHolder();
    
    MediaPlayer player = new MediaPlayer();
    player.reset();
    try {
        player.setDataSource("sdcard/2.3gp");
        player.setDisplay(sh);
        player.prepare();
    } catch (Exception e) {
        e.printStackTrace();
    }
    player.start();
    
  • SurfaceView是重量级组件,可见时才会创建
  • 给SurfaceHolder设置CallBack,类似于侦听,可以知道SurfaceView的状态

    sh.addCallback(new Callback() {
        //SurfaceView销毁时调用
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            // TODO Auto-generated method stub
    
        }
        //SurfaceView创建时调用
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
            // TODO Auto-generated method stub
    
        }
    });
    
  • SurfaceView一旦不可见,就会被销毁,一旦可见,就会被创建,销毁时停止播放,再次创建时再开始播放

布局文件
   
   
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
 
<SurfaceView
android:id="@+id/sv"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值