wlmedia
Android 音视频播放SDK,几句代码即可实现音视频播放功能~
功能丰富,支持手机、电视盒子等设备。
一、功能特点
三、集成使用
3.1 Gradle:
implementation 'ywl.ywl5320:wlmedia:1.1.0'
3.2 权限
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>//(可选)
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
3.2 配置NDK编译平台
defaultConfig {
...
ndk {
abiFilter("arm64-v8a")
abiFilter("armeabi-v7a")
abiFilter("x86")
abiFilter("x86_64")
}
...
}
3.3 API
3.3.1 视频Surface
// WlSurfaceView 一般播放使用
<com.ywl5320.wlmedia.surface.WlSurfaceView
android:layout_width="match_parent"
android:layout_height="match_parent" />
// WlTextureView 需要做透明、移动、旋转等使用
<com.ywl5320.wlmedia.surface.WlTextureView
android:layout_width="match_parent"
android:layout_height="match_parent" />
3.3.2 基础调用代码(更多功能见Demo)
WlMedia wlMedia = new WlMedia();//创建播放器实例(支持多实例)
wlMedia.setSource(url);//设置媒体源
wlMedia.setSourceType(WlSourceType.NORMAL);//设置数据源类型(常规、加密、bute[])
//wlMedia.setCodecType(WlCodecType.CODEC_MEDIACODEC);//设置解码模式(默认硬解码)
//wlMedia.setPlayModel(WlPlayModel.PLAYMODEL_AUDIO_VIDEO);//设置播放模式(默认音视频都播放)
//wlMedia.setClearLastPicture(false);//设置结束后释放显示最后一帧视频
//常用回调
//准备好后回调
wlMedia.setOnPreparedListener(new WlOnPreparedListener() {
@Override
public void onPrepared() {
wlMedia.start();
}
});
//加载回调
wlMedia.setOnLoadListener(new WlOnLoadListener() {
@Override
public void onLoad(boolean load) {
}
});
//暂停回调
wlMedia.setOnPauseListener(new WlOnPauseListener() {
@Override
public void onPause(boolean pause) {
}
});
//播放时间回调
wlMedia.setOnTimeInfoListener(new WlOnTimeInfoListener() {
@Override
public void onTimeInfo(double currentTime, double bufferTime) {
}
});
//播放完成回调
wlMedia.setOnCompleteListener(new WlOnCompleteListener() {
@Override
public void onComplete(WlComplete type) {
if(type == WlComplete.WL_COMPLETE_NEXT)
{
//切歌时回调
}
else if(type == WlComplete.WL_COMPLETE_TIMEOUT)
{
//超时回调
}
else if(type == WlComplete.WL_COMPLETE_ERROR)
{
//错误回调
}
else if(type == WlComplete.WL_COMPLETE_EOF)
{
//播放到文件结尾回调
}
else if(type == WlComplete.WL_COMPLETE_HANDLE)
{
//手动触发停止回调
}
else if(type == WlComplete.WL_COMPLETE_LOOP)
{
//循环播放回调
}
}
});
//错误回调
wlMedia.setOnErrorListener(new WlOnErrorListener() {
@Override
public void onError(int code, String msg) {
}
});
//如果单独播放音频直接调用
wlMedia.prepared();//wlMedia.next();
//播放视频需要在surface创建好回调里面开始播放
wlSurfaceView.setOnVideoViewListener(new WlOnVideoViewListener() {
@Override
public void initSuccess() {
wlMedia.prepared();//此时surface创建好了
}
@Override
public void moveX(double value, int move_type) {
//横向滑动surface回调,可用于seek
}
@Override
public void onSingleClick() {
//surface点击事件
}
@Override
public void onDoubleClick() {
//surface双击事件
}
@Override
public void moveLeft(double value, int move_type) {
//surface左侧滑动(可改变屏幕亮度)
}
@Override
public void moveRight(double value, int move_type) {
//surface右侧滑动(可改变播放器音量)
}
});
//退出并回收资源
wlMedia.exit();
//获取媒体基本信息(耗时操作)
WlMediaUtil wlMediaUtil = new WlMediaUtil();
wlMediaUtil.setSource(url);
if(wlMediaUtil.init() == 0)
{
WlMediaInfoBean wlMediaInfoBean = wlMediaUtil.getMediaInfo();
}
else{
}
wlMediaUtil.release();
//获取视频指定帧数据(耗时操作)
WlMediaUtil wlMediaUtilImg = new WlMediaUtil();
wlMediaUtilImg.setSource(url);
wlMediaUtilImg.init();
wlMediaUtilImg.openCodec();
WlVideoImgBean wlVideoImgBean = wlMediaUtilImg.getVideoImg(1000, false);
if(wlVideoImgBean != null)
{
WlLog.d("java width:" + wlVideoImgBean.getWidth() + ",height:" + wlVideoImgBean.getHeight() + ",time:" + wlVideoImgBean.getTime());
}
wlMediaUtil.release();
//自定义滤镜(以黑白滤镜为例)
String fs = "precision mediump float;" +
"varying vec2 ft_Position;" +
"uniform sampler2D sTexture; " +
"void main() " +
"{ " +
"vec4 v=texture2D(sTexture, ft_Position); " +
"float average = (v.r + v.g + v.b) / 3.0;" +
"gl_FragColor = vec4(average, average, average, v.a);" +
"}";
wlMedia.setfShader(fs);
wlMedia.changeFilter();
四、讨论群(1085618246)
五、混淆
-keep class com.ywl5320.wlmedia.* {*;}
六、注意事项
6.1 播放器activity配置:
android:configChanges="orientation|keyboardHidden|screenSize"
6.2 播放器生命周期逻辑
6.2.1、对于视频播放,new一个对象就对应播放一路视频,在退出播放页面时,调用exit停止并销毁资源。
6.2.2、对于音频,new一个对象就对应播放一个音频,PlayModel设置为:WlPlayModel.PLAYMODEL_ONLY_AUDIO 即可。在退出播放页面时,调用exit停止并销毁资源。
6.3.3、常规播放流程(具体可看demo):
如:APP启动->startactivity->new WlMedia()->播放中各种操作->关闭播放页面(exit())
6.3 高版本系统后台播放音频卡顿问题
建议在新的进程中播放音频,比如:
<service android:name=".AudioService"
android:process=":wlmedia"/>
绑定服务
bindService(intent,serviceConnection,BIND_WAIVE_PRIORITY);//注意第三个参数BIND_WAIVE_PRIORITY
七、使用本库APP(如果你的APP使用了本库,也可以告诉我哦~)
|
|
…… |
八、参考资料
九、核心三方库
FFmpeg
OpenSSL
SoundTouch
Create By:ywl5320 2019-12-16