Android引入Ijkplayer

编程入门 行业动态 更新时间:2024-10-28 20:23:47

<a href=https://www.elefans.com/category/jswz/34/1771384.html style=Android引入Ijkplayer"/>

Android引入Ijkplayer

我们先通过gradle的方式进行引入,下一节我们讲一讲如何进行编译。

 implementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'implementation 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8'implementation 'tv.danmaku.ijk.media:ijkplayer-arm64: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-exo:0.8.8'

我们对ijkplayer封装成一个videoview

package com.yuanxuzhen.ijkplayerdemo;import tv.danmaku.ijk.media.player.IMediaPlayer;public abstract class VideoPlayerListener implements IMediaPlayer.OnBufferingUpdateListener, IMediaPlayer.OnCompletionListener, IMediaPlayer.OnPreparedListener, IMediaPlayer.OnInfoListener, IMediaPlayer.OnVideoSizeChangedListener, IMediaPlayer.OnErrorListener, IMediaPlayer.OnSeekCompleteListener {
}
package com.yuanxuzhen.ijkplayerdemo;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;public class VideoPlayerIJK extends FrameLayout {/*** 由ijkplayer提供,用于播放视频,需要给他传入一个surfaceView*/private IMediaPlayer mMediaPlayer = null;/*** 视频文件地址*/private String mPath = "";private SurfaceView surfaceView;private VideoPlayerListener listener;private Context mContext;public VideoPlayerIJK(@NonNull Context context) {super(context);initVideoView(context);}public VideoPlayerIJK(@NonNull Context context, @Nullable AttributeSet attrs) {super(context, attrs);initVideoView(context);}public VideoPlayerIJK(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initVideoView(context);}private void initVideoView(Context context) {mContext = context;//获取焦点,不知道有没有必要~。~setFocusable(true);}/*** 设置视频地址。* 根据是否第一次播放视频,做不同的操作。** @param path the path of the video.*/public void setVideoPath(String path) {if (TextUtils.equals("", mPath)) {//如果是第一次播放视频,那就创建一个新的surfaceViewmPath = path;createSurfaceView();} else {//否则就直接loadmPath = path;load();}}/*** 新建一个surfaceview*/private void createSurfaceView() {//生成一个新的surface viewsurfaceView = new SurfaceView(mContext);surfaceView.getHolder().addCallback(new LmnSurfaceCallback());LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, Gravity.CENTER);surfaceView.setLayoutParams(layoutParams);this.addView(surfaceView);}/*** surfaceView的监听器*/private class LmnSurfaceCallback implements SurfaceHolder.Callback {@Overridepublic void surfaceCreated(SurfaceHolder holder) {}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {//surfaceview创建成功后,加载视频load();}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {}}/*** 加载视频*/private void load() {//每次都要重新创建IMediaPlayercreatePlayer();try {mMediaPlayer.setDataSource(mPath);} catch (IOException e) {e.printStackTrace();}//给mediaPlayer设置视图mMediaPlayer.setDisplay(surfaceView.getHolder());mMediaPlayer.prepareAsync();}/*** 创建一个新的player*/private void createPlayer() {if (mMediaPlayer != null) {mMediaPlayer.stop();mMediaPlayer.setDisplay(null);mMediaPlayer.release();}IjkMediaPlayer ijkMediaPlayer = new IjkMediaPlayer();ijkMediaPlayer.native_setLogLevel(IjkMediaPlayer.IJK_LOG_DEBUG);//开启硬解码        ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 1);mMediaPlayer = ijkMediaPlayer;if (listener != null) {mMediaPlayer.setOnPreparedListener(listener);mMediaPlayer.setOnInfoListener(listener);mMediaPlayer.setOnSeekCompleteListener(listener);mMediaPlayer.setOnBufferingUpdateListener(listener);mMediaPlayer.setOnErrorListener(listener);}}public void setListener(VideoPlayerListener listener) {this.listener = listener;if (mMediaPlayer != null) {mMediaPlayer.setOnPreparedListener(listener);}}/*** -------======--------- 下面封装了一下控制视频的方法*/public void start() {if (mMediaPlayer != null) {mMediaPlayer.start();}}public void release() {if (mMediaPlayer != null) {mMediaPlayer.reset();mMediaPlayer.release();mMediaPlayer = null;}}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 long getDuration() {if (mMediaPlayer != null) {return mMediaPlayer.getDuration();} else {return 0;}}public long getCurrentPosition() {if (mMediaPlayer != null) {return mMediaPlayer.getCurrentPosition();} else {return 0;}}public void seekTo(long l) {if (mMediaPlayer != null) {mMediaPlayer.seekTo(l);}}
}

接下来开始使用

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=""xmlns:app=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:orientation="vertical"><com.yuanxuzhen.ijkplayerdemo.VideoPlayerIJKandroid:id="@+id/video_view"android:layout_width="match_parent"android:layout_height="200dp"/></LinearLayout>
package com.yuanxuzhen.ijkplayerdemo;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.util.Log;import java.io.File;import tv.danmaku.ijk.media.player.IMediaPlayer;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);VideoPlayerIJK videoPlayerIJK = findViewById(R.id.video_view);videoPlayerIJK.setListener(new VideoPlayerListener() {@Overridepublic void onBufferingUpdate(IMediaPlayer iMediaPlayer, int i) {Log.e("yuan", "onBufferingUpdate");}@Overridepublic void onCompletion(IMediaPlayer iMediaPlayer) {Log.e("yuan", "onCompletion");}@Overridepublic boolean onError(IMediaPlayer iMediaPlayer, int i, int i1) {Log.e("yuan", "onError");return false;}@Overridepublic boolean onInfo(IMediaPlayer iMediaPlayer, int i, int i1) {Log.e("yuan", "onInfo");return false;}@Overridepublic void onPrepared(IMediaPlayer iMediaPlayer) {Log.e("yuan", "onPrepared");}@Overridepublic void onSeekComplete(IMediaPlayer iMediaPlayer) {Log.e("yuan", "onSeekComplete");}@Overridepublic void onVideoSizeChanged(IMediaPlayer iMediaPlayer, int i, int i1, int i2, int i3) {Log.e("yuan", "onVideoSizeChanged");}});Log.e("yuan", "path="+DirUtil.getCacheDir(this) + File.separator +  "123.mp4");videoPlayerIJK.setVideoPath(DirUtil.getCacheDir(this) + File.separator + "123.mp4");videoPlayerIJK.start();}}

更多推荐

Android引入Ijkplayer

本文发布于:2023-06-13 07:16:19,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/676615.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Android   Ijkplayer

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!