使用IJKPlayer播放视频实现了一些播放视频的基本操作

Iijkplayer目前是很流行的音视频框架,集成我这里就不多说了,网上很多,大概就是编译ijkplayer的源码得到里边的so文件,添加到自己项目的libs文件夹中,gradlle依赖下资源。我这里是在IjkVideoView基础上开发的,自己实现了播放、暂停、旋转全屏播放、音量和亮度调节、进度条、拖动进度条播放功能,可以满足普通的播放视频的需求;Demo下载

友情提示我播放的是本地视频需要自己在sd卡目录下放一个视频文件,6.0以上是需要动态申请读写sd卡权限的,我代码里边没有加入,我在手机设置里自己手动开启的。

看下动态效果图:

先看下布局layout,IjkVideoView的高度必须要是>0否则不会创建view就不会创建MediaPalyer对象了。我建议不居中的IjkVideoView高度和宽度填充处理,之后IjkVideoView再根据视频的宽高按比例设置达到自适应的效果。如果想在video上实现滑动控制音量和亮度,我建议再加一层布局就可以自定义它实现手势滑动功能;

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="wrap_content"><com.yangqiang.ijkplayertest.media.IjkVideoViewandroid:layout_gravity="center"android:visibility="visible"android:id="@+id/video_view"android:layout_width="match_parent"android:layout_height="match_parent" /><SeekBarandroid:id="@+id/progress"android:layout_width="match_parent"android:layout_height="20dp" /><RelativeLayoutandroid:layout_centerVertical="true"android:layout_below="@+id/video_view"android:layout_width="wrap_content"android:layout_height="wrap_content"><Buttonandroid:layout_marginLeft="30dp"android:text="start"android:id="@+id/start"android:layout_width="wrap_content"android:layout_height="wrap_content" /><Buttonandroid:layout_toRightOf="@id/start"android:layout_marginLeft="10dp"android:text="pause"android:id="@+id/pause"android:layout_width="wrap_content"android:layout_height="wrap_content" /></RelativeLayout><LinearLayoutandroid:layout_gravity="center_vertical"android:layout_marginTop="20dp"android:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:text="音量调节"android:layout_width="wrap_content"android:layout_height="wrap_content" /><SeekBarandroid:id="@+id/volumeprogress"android:layout_width="match_parent"android:layout_height="20dp" /></LinearLayout><LinearLayoutandroid:layout_gravity="center_vertical"android:layout_marginTop="30dp"android:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:text="亮度调节"android:layout_width="wrap_content"android:layout_height="wrap_content" /><SeekBarandroid:id="@+id/lightrogress"android:layout_width="match_parent"android:layout_height="20dp" /></LinearLayout></LinearLayout>
</LinearLayout>

以屏幕宽为标准来动态设置view的宽高:

 IMediaPlayer.OnVideoSizeChangedListener mSizeChangedListener =new IMediaPlayer.OnVideoSizeChangedListener() {public void onVideoSizeChanged(IMediaPlayer mp, int width, int height, int sarNum, int sarDen) {mVideoWidth = mp.getVideoWidth();mVideoHeight = mp.getVideoHeight();Log.e("hhhhhh","h:"+mVideoWidth);mVideoSarNum = mp.getVideoSarNum();mVideoSarDen = mp.getVideoSarDen();if (mVideoWidth != 0 && mVideoHeight != 0) {if (mRenderView != null) {//这两句没什么用,是针对sufaceview的mRenderView.setVideoSize(mVideoWidth, mVideoHeight);mRenderView.setVideoSampleAspectRatio(mVideoSarNum, mVideoSarDen);//根据video的大小进行自适应设置double frameLayoutHeight = 0;if(screenWidth>mVideoWidth){double s = (double)screenWidth/(double)mVideoWidth;frameLayoutHeight = s*mVideoHeight;Log.e("hhhhhhscreenWidth","h:"+frameLayoutHeight);}else{double s = (double)mVideoWidth/(double)screenWidth;frameLayoutHeight = s*mVideoHeight;Log.e("hhhhhhscreenWidth","h:"+frameLayoutHeight);}LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,(int)frameLayoutHeight);setLayoutParams(layoutParams);}requestLayout();}}};

播放和暂停功能:

//开始播放start.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if(!mVideoView.isPlaying()){Log.e("start","调用了start...");mVideoView.start();}if(!isPFlag){videoLength = mVideoView.getDuration();progress.setMax(videoLength);Log.e("length","pp:"+videoLength);seekThread.start();isPFlag = true;progress.setEnabled(true);}}});//暂停播放pause.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if(mVideoView.isPlaying()){Log.e("pause","pause...");mVideoView.pause();}}});

滑动seekbar更新视频进度,如何你自己做的时候发现seekTo方法报控制空指针错误,你需要if(mHudViewHolder!=null){
mHudViewHolder.updateSeekCost(ti);}因为mHudViewHolder是针对surfaceview的:

 //进度条播放监听progress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int i, boolean b) {seekPosition = i;}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {//停止滑动的时候才更新视频进度,提高用户体验if(mVideoView!=null&&mVideoView.isPlaying()){if(seekPosition>videoLength||seekPosition<0){return;}mVideoView.seekTo(seekPosition);}}});
private IMediaPlayer.OnSeekCompleteListener mSeekCompleteListener = new IMediaPlayer.OnSeekCompleteListener() {@Overridepublic void onSeekComplete(IMediaPlayer mp) {mSeekEndTime = System.currentTimeMillis();long ti = mSeekEndTime - mSeekStartTime;Log.e("titititi","tititi:"+ti);if(mHudViewHolder!=null){mHudViewHolder.updateSeekCost(ti);}}};

播放进度条线程:

//播放进度条线程public class SeekThread implements Runnable{@Overridepublic void run() {while(true){if(mVideoView!=null&&mVideoView.isPlaying()){progress.setProgress(mVideoView.getCurrentPosition());try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}}}

横屏时候全屏播放:

//横竖屏监听@Overridepublic void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {//切换为横屏LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mVideoView.getLayoutParams();//这地方一定要把屏幕宽度给lp的高度lp.height = screenWidth;lp.width = screenHeight;mVideoView.setLayoutParams(lp);}else{LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mVideoView.getLayoutParams();lp.height = screenWidth * 9 / 16;lp.width = screenWidth;mVideoView.setLayoutParams(lp);}}

调整音量和亮度:

//调节声音和亮度相关public void intVolumeAndLightService(){volumeprogress = (SeekBar) findViewById(R.id.volumeprogress);volumeprogress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int i, boolean b) {volumeSlide(i);}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}});lightrogress = (SeekBar) findViewById(R.id.lightrogress);lightrogress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int i, boolean b) {BrightnessUtils.changeAppBrightness(MainActivity.this,i);}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}});mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);mMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);mVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);//设置最大值volumeprogress.setMax(mMaxVolume);//设置当前音量volumeprogress.setProgress(mVolume);//设置当前亮度最大值lightrogress.setMax(255);//设置当前亮度int mLight = BrightnessUtils.getSystemBrightness(this);lightrogress.setProgress(mLight);}变更声音private void volumeSlide(int current) {mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, current, 0);}

在activity销毁时释放资源:

@Overrideprotected void onDestroy() {super.onDestroy();mVideoView.stopPlayback();}

这样一些基本操作就可以满足了,有些代码没有优化,但逻辑还是清晰的,IjkVideoView里边的代码看似多实际上好多都会针对surfaceview的,忽略就好;

没积分的给我发邮件965949332@qq.com我给你发过去。Demo下载地址

使用IJKPlayer播放视频实现了一些播放视频的基本操作相关推荐

  1. ijkplayer播放器剖析(六)视频同步与渲染机制分析

    一.引言: 在前面的博客中,将音频解码播放及视频解码都分析了,这篇博客将单独针对视频同步及渲染来分析,看下ijkplayer是如何做的.本博客分析的同步方式为以音频为主,视频去同步音频. 二.同步前提 ...

  2. 使用MediaCodec硬解码h.265视频及音频进行播放

    h.265这个视频是很多播放器不支持的,就算是bilibili开源的ijkplayer也不能直接播放,需要自己去重新编译 才可以支持. 这里通过这个demo来演示一下如何硬解码视频,播放h.265视频 ...

  3. Android仿优酷视频的悬浮窗播放

    Android仿优酷视频的悬浮窗播放 之前接了需求要让视频播放时可以像优酷视频那样在悬浮窗里播放,并且悬浮窗和主播放页面之间要实现无缝切换,项目中使用的是自封装的ijkplayer 这个要求就代表不能 ...

  4. android 优酷 自动全屏播放,Android如何实现仿优酷视频的悬浮窗播放效果

    Android如何实现仿优酷视频的悬浮窗播放效果 发布时间:2020-07-11 10:24:43 来源:亿速云 阅读:228 作者:清晨 这篇文章主要介绍Android如何实现仿优酷视频的悬浮窗播放 ...

  5. android浮窗播放器,Android仿优酷视频的悬浮窗播放效果

    之前接了需求要让视频播放时可以像优酷视频那样在悬浮窗里播放,并且悬浮窗和主播放页面之间要实现无缝切换,项目中使用的是自封装的ijkplayer 这个要求就代表不能在悬浮窗中新建视频控件,所以需要在悬浮 ...

  6. 安卓开发,拼接屏幕、大屏幕、户外广告无人值守循环播放视频,图片。开机自动播放,断电后自动播放,重起后自动播放功能

    安卓开发,拼接屏幕.大屏幕.户外广告无人值守循环播放视频,图片.开机自动播放,断电后自动播放,重起后自动播放功能 因客户要求,开机自动播放视频,不需要电脑控制,通电自动循环播放视频. 电脑成本太高,最 ...

  7. php倒放,神奇创意怎么让视频倒着播放 还有减速或加速播放

    不知道大家有没有试过把一个视频倒着播放,就是把开始和结束的时间对调,如果你没试过,那么你肯定体会不到其中的乐趣,即使是一个很普通的视频,倒着播放之后也会有你意想不到的效果哦,不信你就跟小编一起见证这奇 ...

  8. html javascript 音频、视频、 mp3 、mp4 的播放、暂停、重新播放、获取音频时长、视频自动全屏播放

    html javascript 音频.视频. mp3 .mp4 的播放.暂停.重新播放.获取音频时长 视频 https://www.bilibili.com/video/BV1WE411o7Ft?fr ...

  9. 视频云:点播播放器和直播播放器冲突如何解决?

    1.问题 开发者有点播和直播都需要用,既有播放网络视频的需求也有直播播放视频流的需求,这个时候如果用户先集成了点播播放器再去集成直播播放器的时候会出现冲突报错. 2.解决方案 开发者仅仅使用直播播放器 ...

最新文章

  1. Python-HTML CSS题目
  2. GPU与CPU对比测试
  3. 93. 复原 IP 地址(回溯算法)
  4. 打开高效文本编辑之门_Linux awk之关联数组
  5. java如何创建一个两个数的队列_java线程池 如何构建一个线程立即到拉到MAX数量跑业务,线程到MAX了,额外的队列可以存储任务的线程池...
  6. 漫画:如何做一款比吃鸡还厉害的游戏
  7. 《大屏可视化数据》该怎么设计?
  8. 使用 .NET 平台,如何玩转 Universal Windows 应用? 1
  9. LIve Writer图片自动水印,自动居中,自动为原始大小的设置方法.
  10. mac win7 计算机,详解mac如何安装win7
  11. Win server 2008 R2激活工具使用图文教程(SK Patch v1 R2 Final OEM)
  12. K-means对地震数据进行处理
  13. 消费评价网 | 线上保险消费调查报告 虚假宣传多 捆绑销售坑人
  14. 三阶魔方层先法自动复原_Python
  15. 模拟摄影测量和数字摄影测量
  16. 理财入门《解读基金-我的投资观与实践》阅读总结
  17. 关于计算机网络的英语演讲稿,幽默英语演讲稿
  18. Uc_client与ucenter通信原理
  19. Ymir平台部署安装
  20. ubuntu服务器配置ruby环境(国内傻瓜版)

热门文章

  1. Python获取win7下的CPU温度
  2. 阿里云的认证有效期是多久?到期后怎么办呢?
  3. 信号采样基本概念 —— 1. 冲激函数
  4. 硬实时RTLinux安装配置详解 (一):准备工作
  5. C# 网络编程之网页简单下载实现
  6. 自动驾驶地图数据传输协议ADASISv3介绍
  7. 创造与魔法java语言_创造与魔法基础魔法大全 超实用基础魔法推荐
  8. 小布助手在百度飞桨实体链指比赛中的实践应用
  9. Java 下载压缩文件
  10. CM 安装及部署操作