使用IjkMediaPlayer结合surface

使用IjkMediaPlayer集合surfaceView播放视频,自己写的播放和暂停按钮

导入依赖

/*ijkPlayer*/
    // required, enough for most devices.
    compile 'tv.danmaku.ijk.media:ijkplayer-java:0.7.8.1'
    compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.7.8.1'
    // Other ABIs: optional
    compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.7.8.1'
    compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.7.8.1'
    // ExoPlayer as IMediaPlayer: optional, experimental
    compile 'tv.danmaku.ijk.media:ijkplayer-exo:0.7.8.1'

清单文件中加入权限

<uses-permission android:name="android.permission.INTERNET" />
布局文件中

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="3">
    <SurfaceView
        android:id="@+id/viedo_surface"
        android:layout_width="match_parent"
        android:layout_height="300dp" />

    <Button
        android:id="@+id/start"
        android:layout_alignBottom="@+id/viedo_surface"
        android:text="播放"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <Button
        android:layout_alignParentRight="true"
        android:id="@+id/pause"
        android:layout_alignBottom="@+id/viedo_surface"
        android:text=""
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</RelativeLayout>
代码

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {

    @BindView(R.id.viedo_surface)
    SurfaceView mSurfaceView;
    @BindView(R.id.start)
    Button start;
    @BindView(R.id.pause)
    Button pause;
    private IjkMediaPlayer mPlayer;

    boolean isPlay;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        isPlay = false;
        pause.setEnabled(false);
        mSurfaceView.getHolder().addCallback(this);
        initPlayer();
    }

    private void initPlayer() {
        IjkMediaPlayer.loadLibrariesOnce(null);
        IjkMediaPlayer.native_profileBegin("libijkplayer.so");

        mPlayer = new IjkMediaPlayer();
      /*  try {
            //http://ips.ifeng.com/video19.ifeng.com/video09/2014/06/16/1989823-102-086-0009.mp4
            mPlayer.setDataSource("http://ips.ifeng.com/video19.ifeng.com/video09/2014/06/16/1989823-102-086-0009.mp4");
        } catch (IOException e) {
            e.printStackTrace();
        }
        mPlayer.prepareAsync();
        mPlayer.start();*/
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mPlayer.setDisplay(holder);
    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {

    }

    @OnClick({R.id.start, R.id.pause})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.start:
                mPlayer.reset();
                try {
                    mPlayer.setDataSource("http://ips.ifeng.com/video19.ifeng.com/video09/2014/06/16/1989823-102-086-0009.mp4");//读取视频文件地址
                    mPlayer.prepareAsync();                             //预加载视频
                    mPlayer.setDisplay(mSurfaceView.getHolder());  //将视频画面输出到surface上
                    mPlayer.start();                                //开始播放
                    pause.setText("暂停");                        //pause此时为暂停
                    pause.setEnabled(true);                       //pause按钮此时可用
                    isPlay = true;
                }catch (IOException e){
                    Toast.makeText(MainActivity.this,"发生错误",Toast.LENGTH_LONG).show();
                }
                break;
            case R.id.pause://点击暂停时候 如果正在播放 就显示继续按钮

                if (isPlay == true) {
                    pause.setText("继续");
                    mPlayer.pause();
                    isPlay = false;
                } else {
                    mPlayer.start();
                    pause.setText("暂停");
                    isPlay = true;
            }
                break;
        }
    }
}





<think>好的,我现在需要帮助用户了解如何使用ijkMediaPlayer开发视频播放器,并提供教程和示例代码。首先,我得回顾一下用户提供的引用内容,看看有哪些相关的信息可以利用。 用户提到了四个引用,都是关于ijkplayer在不同平台上的应用,比如鸿蒙HarmonyOS、Android,以及涉及到的配置选项和编译方法。特别是引用1中提到了设置倍数播放的代码,引用4提到了soundtouch的配置和编译步骤。这些信息对回答用户的问题应该有帮助。 接下来,我需要整理出一个清晰的步骤教程。首先,可能需要指导用户如何集成ijkplayer到他们的项目中。不同的平台可能有不同的集成方式,比如在Android中可能使用Gradle,而鸿蒙可能需要其他方法。根据引用3,ci-ijk-ffmpeg-android是一个持续集成项目,可能涉及到Android的集成步骤,但用户的问题可能更偏向于具体的使用而不是编译过程。 然后,示例代码部分需要展示如何初始化ijkMediaPlayer,设置数据源,准备播放,以及控制播放。引用1中的设置倍数播放的代码可以作为示例的一部分,比如setOption和setSpeed方法。此外,界面布局可能需要一个SurfaceView或TextureView来显示视频,这部分需要包含在示例中。 同时,需要注意用户提到的配置选项,比如soundtouch的启用,这在引用1和4中都有提到。需要指导用户在初始化时设置这些选项,以确保倍速播放等功能正常工作。 另外,用户可能遇到的常见问题,比如编译错误或播放失败,需要给出排查建议,比如检查依赖项、日志查看等。引用4中提到soundtouch的编译脚本,如果在编译过程中遇到问题,可能需要参考相关文档。 最后,生成的相关问题需要围绕用户可能进一步想了解的内容,比如倍速播放的实现、不同平台的区别、性能优化等,这些都可以从提供的引用中找到线索,比如引用2提到鸿蒙环境下的使用,引用3和4涉及编译和配置。 总结一下,回答的结构应该是:先介绍ijkMediaPlayer,然后分步骤讲解集成、初始化、界面设置、播放控制,提供示例代码,并给出常见问题解决方法,最后列出相关问题。需要确保所有代码部分符合格式要求,数学公式正确,使用中文回答,并正确添加引用标识。</think>以下是使用ijkMediaPlayer开发视频播放器的分步教程及示例代码: --- ### 一、ijkMediaPlayer集成步骤 1. **添加依赖** - Android项目:在`build.gradle`中添加依赖 ```gradle implementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8' implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8' // 根据CPU架构选择 ``` - OpenHarmony/HarmonyOS:需手动编译ijkplayer库,参考引用[4]的soundtouch编译脚本[^4] 2. **初始化配置** ```java // 初始化IjkMediaPlayer IjkMediaPlayer.loadLibrariesOnce(null); IjkMediaPlayer.native_profileBegin("libijkplayer.so"); ``` --- ### 二、基础播放器实现 #### 1. 布局文件(XML) ```xml <SurfaceView android:id="@+id/surface_view" android:layout_width="match_parent" android:layout_height="200dp"/> ``` #### 2. Java核心代码 ```java IjkMediaPlayer mIjkMediaPlayer = new IjkMediaPlayer(); SurfaceHolder surfaceHolder = surfaceView.getHolder(); // 设置播放选项(如开启倍速支持) mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "soundtouch", "1"); // 引用[1] mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 60); // 绑定Surface surfaceHolder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { mIjkMediaPlayer.setDisplay(holder); } // ...其他回调方法 }); // 设置数据源并准备 try { mIjkMediaPlayer.setDataSource("http://example.com/video.mp4"); mIjkMediaPlayer.prepareAsync(); mIjkMediaPlayer.setOnPreparedListener(MediaPlayer::start); } catch (IOException e) { e.printStackTrace(); } ``` --- ### 三、关键功能实现 #### 倍速播放控制 ```java // 设置2倍速(需先开启soundtouch) mIjkMediaPlayer.setSpeed(2.0f); // 引用[1] ``` #### 播放状态监听 ```java mIjkMediaPlayer.setOnInfoListener((mp, what, extra) -> { if (what == IMediaPlayer.MEDIA_INFO_BUFFERING_START) { showLoading(); } else if (what == IMediaPlayer.MEDIA_INFO_BUFFERING_END) { hideLoading(); } return true; }); ``` --- ### 四、常见问题解决 1. **编译问题** - 若遇到NDK编译错误,参考引用[4]检查soundtouch库的CMake配置 2. **播放失败** - 添加网络权限:`<uses-permission android:name="android.permission.INTERNET"/>` - 日志过滤:`IjkMediaPlayer.native_setLogLevel(IjkMediaPlayer.IJK_LOG_DEBUG);` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值