打赏

自定义视频播放器 自定义解析视频格式

   implementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
    implementation 'tv.danmaku.ijk.media:ijkplayer-exo:0.8.8'
    implementation 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8'
    implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'
    implementation 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.8'
    implementation 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.8'
    implementation 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8'
复制代码
package com.rhkj.myapplication;

import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.FrameLayout;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.io.IOException;

import tv.danmaku.ijk.media.player.IMediaPlayer;
import tv.danmaku.ijk.media.player.IjkMediaPlayer;

/**
* @ClassName IjkVideoView
* @Description TODO
* @Author ZhangXueTao
* @Date 2021/2/7 16:30
* @Version 1.0 模板
*/
public class IjkVideoView extends FrameLayout {
private Context mContext;//上下文
private IMediaPlayer mMediaPlayer = null;//视频控制类
private VideoPlayerListener mVideoPlayerListener;//自定义监听器
private SurfaceView mSurfaceView;//播放视图
private String mPath = "";//视频文件地址

public IjkVideoView(@NonNull Context context) {
super(context);
initVideoView(context);
}

public IjkVideoView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
initVideoView(context);
}

public IjkVideoView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initVideoView(context);
}

public IjkVideoView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}

public abstract static class VideoPlayerListener implements IMediaPlayer.OnPreparedListener,
IMediaPlayer.OnCompletionListener,
IMediaPlayer.OnErrorListener {
}

private void initVideoView(Context context) {
mContext = context;
setFocusable(true);
}

public void setPath(String path) {
if (TextUtils.equals("", mPath)) {
mPath = path;
initSurfaceView();
} else {
mPath = path;
loadVideo();
}
}

private void initSurfaceView() {
mSurfaceView = new SurfaceView(mContext);
mSurfaceView.getHolder().addCallback(new LmnSurfaceCallback());
LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, Gravity.CENTER);
mSurfaceView.setLayoutParams(layoutParams);
this.addView(mSurfaceView);
}

//surfaceView的监听器
private class LmnSurfaceCallback implements SurfaceHolder.Callback {
@Override
public void surfaceCreated(SurfaceHolder holder) {
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
loadVideo();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}

//加载视频
private void loadVideo() {
if (mMediaPlayer != null) {
mMediaPlayer.stop();
mMediaPlayer.release();
}

IjkMediaPlayer ijkMediaPlayer = new IjkMediaPlayer();
mMediaPlayer = ijkMediaPlayer;

if (mVideoPlayerListener != null) {
mMediaPlayer.setOnPreparedListener(mVideoPlayerListener);
mMediaPlayer.setOnErrorListener(mVideoPlayerListener);
}
try {
mMediaPlayer.setDataSource(mPath);
} catch (IOException e) {
e.printStackTrace();
}
mMediaPlayer.setDisplay(mSurfaceView.getHolder());
mMediaPlayer.prepareAsync();
}

public void setListener(VideoPlayerListener listener) {
this.mVideoPlayerListener = listener;
if (mMediaPlayer != null) {
mMediaPlayer.setOnPreparedListener(listener);
}
}

public boolean isPlaying() {
if (mMediaPlayer != null) {
return mMediaPlayer.isPlaying();
}
return false;
}

public void start() {
if (mMediaPlayer != null) {
mMediaPlayer.start();
}
}

public void pause() {
if (mMediaPlayer != null) {
mMediaPlayer.pause();
}
}

public void stop() {
if (mMediaPlayer != null) {
mMediaPlayer.stop();
}
}

public void reset() {
if (mMediaPlayer != null) {
mMediaPlayer.reset();
}
}

public void release() {
if (mMediaPlayer != null) {
mMediaPlayer.reset();
mMediaPlayer.release();
mMediaPlayer = null;
}
}
}
复制代码
复制代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
<com.rhkj.myapplication.IjkVideoView
    android:id="@+id/videoview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

</androidx.appcompat.widget.LinearLayoutCompat>
复制代码
复制代码
package com.rhkj.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import tv.danmaku.ijk.media.player.IMediaPlayer;
import tv.danmaku.ijk.media.player.IjkMediaPlayer;

public class MainActivity extends AppCompatActivity {

    IjkVideoView mVideoView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mVideoView=findViewById(R.id.videoview);
        //初始化
        IjkMediaPlayer.loadLibrariesOnce(null);
        IjkMediaPlayer.native_profileBegin("libijkplayer.so");
        //监听
        mVideoView.setListener(new IjkVideoView.VideoPlayerListener() {
            @Override
            public void onPrepared(IMediaPlayer mp) {
                //播放成功处理
                mp.start();
            }

            @Override
            public void onCompletion(IMediaPlayer iMediaPlayer) {

            }

            @Override
            public boolean onError(IMediaPlayer mp, int what, int extra) {
                return true;
            }
        });
        //路径
        mVideoView.setPath("http://200024424.vod.myqcloud.com/200024424_709ae516bdf811e6ad39991f76a4df69.f20.mp4");
        mVideoView.start();
    }
}
复制代码

 

posted @   YY2000  阅读(606)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示