转载请标明出处:
http://blog.csdn.net/AnalyzeSystem/article/details/78489729
本文出自Analyzesystem的博客
做android端音视频项目开发有几个月了,来做个小结
android手机有很多自带播放器不支持流媒体播放、音频格式等因素,为此开发需要采用成熟开源框架或自己修改FFmpeg,长为人熟知的开源框架有一下几款:
ijkplayer
…………………….
vitamio 要收费,七牛PLDroidPlayer 修改底层源码不方便(由于项目是视频监控行业,很多定制需求,要求能高度定制底层源码),最后采取bilibili开源的ijkplayer,GSYVideoPlayer虽然封装的很好,但是不适合手里项目。
关于ijkplayer so库编译,最好别再window下进行,容易出现符号占位符等问题。编译好后分别在 对应目录生成三个so库和一个.aar文件,依赖如果出现.aar 相关的类找不到(aar没有更新),而自己又确定有的情况下,可参考tip
gradle.properties
/***true:启用 build cache,反之禁用。如果这个参数未设置,默认是禁用 build cache.***/
android.enableBuildCache=
当你遇到视频播放出来了但没声音,多数是音频格式支持问题,默认脚本没有添加太多的格式支持,需要自己修改,具体操作可参考issues
ijkplayer demo提供的仅TextureView渲染的才能截图,产品要求视频仿萤石云,能手势缩放拖拽、截图、、录像、语音对讲等功能,没办法视频播放器控件只能自己想办法,所幸找到了一个开源库ScaleVideoView
https://github.com/yushiwo/ScaleVideoView
视频相关功能博主这儿有专业人员修改ijkplayer源码,在IMediaPlayer为博主提供可调用函数以及相关接口监听器,修改ScaleVideoView源码以及so库依赖,添加相应函数调用即可。
Tip: 未播放过的视频也可以通过修改ijkplayer底层实现获取第一帧图(用于设置封面CoverView)
关于视频相关的控制统一称为控制器,控制器相关自动隐藏显示动画相关代码块如下
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
/**
* Created by idea on 2017/10/23.
*/
public class TranslateAnimationHelper {
private static void translateX(View view, int translateStartX,int translateEndX){
Animation animation = new TranslateAnimation(translateStartX*view.getMeasuredWidth(), translateEndX*view.getMeasuredWidth(), 0, 0);
animation.setDuration(500);
animation.setRepeatCount(0);//动画的重复次数
animation.setFillAfter(true);//设置为true,动画转化结束后被应用
view.startAnimation(animation);//开始动画
}
private static void translateY(View view,int translateStartY,int translateEndY){
Animation animation = new TranslateAnimation(0, 0,translateStartY*view.getMeasuredHeight(),translateEndY*view.getMeasuredHeight());
animation.setDuration(500);
animation.setRepeatCount(0);//动画的重复次数
animation.setFillAfter(true);//设置为true,动画转化结束后被应用
view.startAnimation(animation);//开始动画
}
public static void hideTopView(View view){
TranslateAnimationHelper.translateY(view,0,-1);
}
public static void showTopView(View view){
TranslateAnimationHelper.translateY(view,-1,0);
}
public static void hideBottomView(View view){
TranslateAnimationHelper.translateY(view,0,1);
}
public static void showBottomView(View view){
TranslateAnimationHelper.translateY(view,1,0);
}
public static void hideLeftView(View view){
TranslateAnimationHelper.translateX(view,0,-1);
}
public static void showLeftView(View view){
TranslateAnimationHelper.translateX(view,-1,0);
}
public static void hideRightView(View view){
TranslateAnimationHelper.translateX(view,0,1);
}
public static void showRightView(View view){
TranslateAnimationHelper.translateX(view,1,0);
}
public static void toggleVisibility(View left,View top,View right,View bottom,boolean isHide){
if(isHide){
hideView(left,top,right,bottom);
}else{
showView(left,top,right,bottom);
}
}
private static void showView(View left, View top, View right, View bottom) {
if(left!=null){
hideLeftView(left);
}
if(top!=null){
hideTopView(top);
}
if(right!=null){
hideRightView(right);
}
if(bottom!=null){
hideBottomView(bottom);
}
}
private static void hideView(View left, View top, View right, View bottom) {
if(left!=null){
showLeftView(left);
}
if(top!=null){
showTopView(top);
}
if(right!=null){
showRightView(right);
}
if(bottom!=null){
showBottomView(bottom);
}
}
}
录像回放关联的时间轴控件,采用开源控件TimeRule,不过源码需要二次修改
// https://github.com/dingyongxiang/TimeRulers
最终实现效果图
本篇仅为概述,如有雷同请忽略,下一篇博客进入主题..