自定义视频播放器 自定义解析视频格式
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(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于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最大的设计失误
· 单元测试从入门到精通