wanliyang1990 / Wlmedia
Licence: apache-2.0
Android 音视频播放SDK,几句代码即可实现音视频播放功能(支持:手机、电视盒子等设备。支持:http、https、rtsp、rtp、rtmp、byte[]、加密视频和各种文件格式视频;包含视频截图、音轨选择、字幕选择、循环播放、设置软解或硬解、自定义视频滤镜、透明视频、变速变调、声道切换、无缝切换surface(surfaceview和textureview)、视频比例设置、多路音视频播放等。)~
Stars: ✭ 505
Programming Languages
java
68154 projects - #9 most used programming language
Projects that are alternatives of or similar to Wlmedia
Zftplayer
iOS平台下基于IJKplayer封装的视频播放器,主要适用于视频点播。针对视频格式,前后台切换,内存管理控件的层级分离做了相应优化
Stars: ✭ 273 (-45.94%)
Mutual labels: ffmpeg, player
Sgplayer
A powerful media play framework for iOS, macOS, and tvOS.
Stars: ✭ 1,974 (+290.89%)
Mutual labels: ffmpeg, player
Ffplayer
a video player based on ffmpeg for win32 and android platform.
Stars: ✭ 210 (-58.42%)
Mutual labels: ffmpeg, player
Qtav
A cross-platform multimedia framework based on Qt and FFmpeg(https://github.com/wang-bin/avbuild). High performance. User & developer friendly. Supports Android, iOS, Windows store and desktops. 基于Qt和FFmpeg的跨平台高性能音视频播放框架
Stars: ✭ 2,997 (+493.47%)
Mutual labels: ffmpeg, player
Fijkplayer
ijkplayer for flutter. ijkplayer 的 flutter 封装。 Flutter video/audio player. Flutter media player plugin for android/iOS based on ijkplayer. fijkplayer 是基于 ijkplayer 封装的 flutter 媒体播放器,开箱即用,无需编译 ijkplayer
Stars: ✭ 943 (+86.73%)
Mutual labels: ffmpeg, player
Dkvideoplayer
Android Video Player. 安卓视频播放器,封装MediaPlayer、ExoPlayer、IjkPlayer。模仿抖音并实现预加载,列表播放,悬浮播放,广告播放,弹幕
Stars: ✭ 3,796 (+651.68%)
Mutual labels: ffmpeg, player
Mpc Hc
MPC-HC's main repository. For support use our Trac: https://trac.mpc-hc.org/
Stars: ✭ 3,567 (+606.34%)
Mutual labels: ffmpeg, player
Giraffeplayer2
out of the box android video player(support lazy load, ListView/RecyclerView and hight performance)
Stars: ✭ 344 (-31.88%)
Mutual labels: ffmpeg, player
Fanplayer
A portable video player based on ffmpeg for windows and android platform.
Stars: ✭ 229 (-54.65%)
Mutual labels: ffmpeg, player
Playernx
First homebrew video player for Nintendo Switch! (using ffmpeg libraries)
Stars: ✭ 63 (-87.52%)
Mutual labels: ffmpeg, player
X1Player
iOS端封装的视频播放器.支持直播,录播视频的播放,支持常用的播放界面控制,类似于ijkplayer 优点是体积更小,使用快捷
Stars: ✭ 21 (-95.84%)
Mutual labels: player, ffmpeg
Lossless Cut
The swiss army knife of lossless video/audio editing
Stars: ✭ 8,639 (+1610.69%)
Mutual labels: ffmpeg, player
Ijkplayer
Android/iOS video player based on FFmpeg n3.4, with MediaCodec, VideoToolbox support.
Stars: ✭ 29,752 (+5791.49%)
Mutual labels: ffmpeg, player
Gsyvideoplayer
视频播放器(IJKplayer、ExoPlayer、MediaPlayer),HTTPS,支持弹幕,外挂字幕,支持滤镜、水印、gif截图,片头广告、中间广告,多个同时播放,支持基本的拖动,声音、亮度调节,支持边播边缓存,支持视频自带rotation的旋转(90,270之类),重力旋转与手动旋转的同步支持,支持列表播放 ,列表全屏动画,视频加载速度,列表小窗口支持拖动,动画效果,调整比例,多分辨率切换,支持切换播放器,进度条小窗口预览,列表切换详情页面无缝播放,rtsp、concat、mpeg。
Stars: ✭ 16,948 (+3256.04%)
Mutual labels: ffmpeg, player
wlmedia
Android 音视频播放SDK,几句代码即可实现音视频播放功能~
[email protected]
如有疑问请联系:一、功能特点
- [x] 兼容androidx和support库
- [x] 基本信息获取(音频:采样率、声道数、时长等,视频:宽、高、fps、时长等)
- [x] 支持file、http、https、rtmp、rtp、rtsp、byte[]等
- [x] 可选音频、视频、音视频播放模式
- [x] 软解硬解设置
- [x] 无缝切换surface(也可自定义surfaceview、textureview)
- [x] 支持多实例播放
- [x] 支持媒体自由切换
- [x] 支持播放rtsp/rtp设置udp/tcp模式
- [x] 支持byte[]数据解码
- [x] 支撑音视频变速变调
- [x] 支撑透明视频播放(可实现不错的视觉效果)
- [x] 字幕选择
- [x] 内置循环播放
- [x] 链接超时设置
- [x] 缓存大小设置(按时间、内存和队列设置)
- [x] 音视频加密播放
- [x] 网络流内部断线重连
- [x] 音轨选择
- [x] 音频声道选择
- [x] 音频PCM数据获取
- [x] 音频指定采样率设置
- [x] 视频截屏
- [x] 视频首帧图片或指定时间图片获取
- [x] 视频任意比例设置
- [x] 视频旋转角度设置(0,90,180,270)
- [x] 视频shader自定义视频滤镜(动态设置)
- [x] 视频背景颜色设置(默认黑色)
测试APK《V视-1.0.7》下载)
二、实例展示 (三、集成使用
implementation 'ywl.ywl5320:wlmedia:1.1.5' //(全平台约26M)
implementation 'ywl.ywl5320:wlmedia:1.1.4-small' //(全平台约13M,只包含常用格式)
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();
// or
//播放视频需要在surface创建好回调里面开始播放
wlSurfaceView.setWlMedia(wlMedia);
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();
//透明视频播放
wlSurfaceView.enableTransBg(true); //设置surface背景透明
wlMedia.setVideoClearColor(0, 0, 0, 0); //设置背景颜色为透明
wlMedia.enableTransVideo(WlVideoTransType.VIDEO_TRANS_LEFT_ALPHA); //设置透明视频模式(alpha通道位置)
3.3.3 常用API
public WlMedia() //构造函数(支撑多实例)
public void setSource(String source) //设置数据源
public void setSourceType(WlSourceType sourceType) //设置数据源类型(常规播放、byte[]播放或加密播放)
public boolean isPlaying() //是否在播放中
public void prepared() //异步准备
public void start() //异步准备好后开始播放
public void stop() //停止播放(不会释放全部资源,适用于页面内停止)
public void exit() //退出播放器(会释放所有资源)
public void pause() //暂停
public void resume() //播放(对应暂停)
public void next() //播放下一曲(切歌)
public void setSampleRate(WlSampleRate wlSampleRate) //设置音频重采样采用率
public void setSpeed(float speed) //设置音视频播放速度
public void setPitch(float pitch) //设置音频播放音调
public void setUseSoundTouch(boolean useSoundTouch) //设置是否启用SoundTouch(若不启用变速变调不生效,默认启用)
public void setVolume(int percent) //设置音量大小
public void setMute(WlMute mute) //设置声道
public void scaleVideo(int w, int h, WlVideoRotate videoRotate) //设置视频画面比例和旋转角度
public String[] getAudioChannels() //获取所有音轨
public String[] getSubTitleChannels() //获取所有字幕
public double getDuration() //获取总时长
public void setLoopPlay(boolean loopPlay) //是否开启循环播放
public void setPlayModel(WlPlayModel playModel) //设置播放模式(只播放音频、只播放视频或音频视频都播放)
public double getNowClock() //获取当前播放时间戳
public void seek(double secds) // seek到指定位置
public void setAudioChannel(int index) //切换对应音轨
public void setSubTitleChannel(int index) //切换对应字幕
public void setShowPcm(boolean showPcm) //是否返回PCM数据
public void takePicture() //截屏
public void setfShader(String fShader) //设置滤镜
public void changeFilter() //应用滤镜
public void setTransportModel(WlTransportModel transportModel) //设置rtsp播放模式(UDP或TCP)
public void setSmoothTime(boolean smooth) //是否把每一帧时间戳返回(默认一秒返回一次)
public void setClearLastPicture(boolean clearLastPicture) //播放完后是否清屏(false:将保留视频最后一帧)
public void setTimeOut(int timeOut) //设置超时时间
public void setVideoClearColor(float rgba_r, float rgba_g, float rgba_b, float rgba_a) //设置视频播放背景为指定颜色(默认黑色)
public void setBufferSize(WlBufferType bufferType, double bufferValue) //设置底层缓存模式(队列大小、文件大小或指定时间以内)
public void enableTransVideo(WlVideoTransType transType) //设置透明视频
public WlMediaUtil() //音视频工具类
public WlMediaInfoBean getMediaInfo() //获取音视频基础信息
public WlVideoImgBean getVideoImg(double time, boolean keyFrame) //获取视频指定时间的图片
四、讨论群(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使用了本库,也可以告诉我哦~)
![]() |
![]() |
![]() |
---|
八、相关实例博客
Android获取(网络和本地)视频缩略图
九、参考资料
我的视频课程(基础):《(NDK)FFmpeg打造Android万能音频播放器》
我的视频课程(进阶):《(NDK)FFmpeg打造Android视频播放器》
我的视频课程(编码直播推流):《Android视频编码和直播推流》
我的视频课程(C++ OpenGL):《Android C++ OpenGL》
测试音视频文件地址(提取码:ivbh)
十、核心三方库
Create By:ywl5320 2019-12-16
Note that the project description data, including the texts, logos, images, and/or trademarks,
for each open source project belongs to its rightful owner.
If you wish to add or remove any projects, please contact us at [email protected].