android音视频点/直播模块开发
来源:互联网 发布:河南卫视直播网络直播 编辑:程序博客网 时间:2024/04/29 22:31
转载地址:http://blog.csdn.net/u011570979/article/details/51205401
目录(?)[-]
- 前言
- 一 音视频的基础知识
- 1 基本概念
- 2 多媒体的格式分类
- 3 流媒体协议RTP RTCP RTSP RTMP HLS
- 二 android音视频的开发
- 三 ijkplayer的引入介绍使用
- 1 调研过程
- 2 ijkplayer的导入编译使用
- 四 ijkplayer的java层源码分析
- 五 项目中ijkplayer的封装以及mediaview的封装以及使用
- 六 ijkplayer底层学习
- 七 开源项目
- 七 常见问题以及解决方案
- 八 参考
前言
随着音视频领域的火热,在很多领域(教育,游戏,娱乐,体育,跑步,餐饮,音乐等)尝试做音视频直播/点播功能,那么作为开发一个小白,如何快速学习音视频基础知识,了解音视频编解码的传输协议,编解码方式,以及如何技术选型,如何解决遇到的坑,本文抛砖引玉,欢迎大咖交流。
一. 音视频的基础知识
1.1 基本概念
视频是什么
- 1
- 2
- 3
- 1
- 2
- 3
流媒体
- 1
- 2
- 1
- 2
分辨率
- 1
- 2
- 1
- 2
码流
- 1
- 2
- 1
- 2
帧率
- 1
- 2
- 1
- 2
1.2 多媒体的格式分类
封装格式(专业上讲叫容器,通俗的叫文件格式),视频编解码,音频编解码####1.1常见的封装格式* MPEG : 编码采用的容器,具有流的特性。里面又分为 PS,TS 等,PS 主要用于 DVD 存储,TS 主要用于 HDTV.* MPEG Audio Layer 3 :大名鼎鼎的 MP3,已经成为网络音频的主流格式,能在 128kbps 的码率接近 CD 音质* MPEG-4(Mp4) : 编码采用的容器,基于 QuickTime MOV 开发,具有许多先进特性;实际上是对Apple公司开发的MOV格式(也称Quicktime格式)的一种改进.* MKV: 它能把 Windows Media Video,RealVideo,MPEG-4 等视频音频融为一个文件,而且支持多音轨,支持章节字幕等;开源的容器格式* 3GP : 3GPP视频采用的格式, 主要用于流媒体传送;3GP其实是MP4格式的一种简化版本,是手机视频格式的绝对主流.* MOV : QuickTime 的容器,恐怕也是现今最强大的容器,甚至支持虚拟现实技术,Java等,它的变种 MP4,3GP都没有这么厉害;广泛应用于Mac OS操作系统,在Windows操作系统上也可兼容,但是远比不上AVI格式流行* AVI : 最常见的音频视频容器,音频视频交错(Audio Video Interleaved)允许视频和音频交错在一起同步播放.* WAV : 一种音频容器,大家常说的 WAV 就是没有压缩的 PCM 编码,其实 WAV 里面还可以包括 MP3 等其他 ACM 压缩编码等等
1.3 流媒体协议(RTP RTCP RTSP RTMP HLS)
- RTP RTCP RTSP
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- RTMP
- 1
- 1
- HLS
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
二. android音视频的开发
播放流程: 获取流–>解码–>播放
录制播放路程: 录制音频视频–>剪辑–>编码–>上传服务器 别人播放.
直播过程 : 录制音视频–>编码–>流媒体传输–>服务器—>流媒体传输到其他app–>解码–>播放
几个重要的环节
- 录制音视频 AudioRecord/MediaRecord
- 视频剪辑 mp4parser 或ffmpeg
- 音视频编码 aac&h264
- 上传大文件 网络框架,进度监听,断点续传
- 流媒体传输 流媒体传输协议rtmp rtsp hls
- 音视频解码 aac&h264
- 渲染播放 MediaPlayer
问题
Android本身有提供MediaPlayer,那么mediaplayer支持哪些格式的流媒体协议呐?又支持哪些解码器呐?兼容性如何,性功能如何?
Supported Media Formats
Media Playback
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
从上图我们也看到,android平台自身支持的音视频解码是有限的 一般的mp3 mp4….3gp 等等 其他的只能自己解码了。。。
那么如何解码呐?
经过一番调研对比,选择乐ijkplayer.
三. ijkplayer的引入&介绍&使用
正如上文所说,android本事对音视频流媒体传输协议,以及音视频编解码支持有限.所以对于直播类应用,要自己解码
3.1 调研过程
vitamio
webRTC
ffmpeg
vlc
ijkplayer
先说下 vitamio这个是功能很强大,但是企业收费版的,个人用户可以玩玩.
目前WebRtc只适合小范围(8人以内)音视频会议,不适合做直播可以用WebRTC来做视频直播吗?
接下来介绍下 ffmpeg vlc ijkplayer以及选择方案
ffmpeg是一个非常强大的音视频编解码开源库,目前市场上流行的播放器,大部分都是基于此开发的,包括暴风,腾讯,等等以及上面提到的vitamio,vlc,ijkplayer
关于ffmpeg源码分析,有兴趣的请看雷霄骅(leixiaohua1020)的专栏
vlc 支持android开发 ,ijkplayer也支持. 通过反编译网易云音乐,以及YY等音视频app.发现网易云音乐,斗鱼用的ijkplayer,YY用的VLC.
那么vlc&ijkplayer相比较各有什么优缺点呐,该如何选择呐?[待深入使用,或者用过的可以交流下]
其实这个没有深入分析,ijkplayer是bilibili开源的音视频编解码库,对android,ios进行和很好的抽取封装,易于编译使用.vlc尝试过,稍微复杂些.
3.2 ijkplayer的导入&编译&使用
如果不需要对源码进行修改,在app的build.gradle中加入如下依赖即可
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
当然如何你想对其源码进行修改,采用如下方式
1. 需要
下载配置 NDK r10e
配置androidsdk
# add these lines to your ~/.bash_profile or ~/.profile
# export ANDROID_SDK=
# export ANDROID_NDK=
2.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
可以根据需要对音视频编解码库进行裁剪.编译出最小的满足需要的库
bilibili提供三种裁剪方式
If you prefer more codec/format
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
If you prefer less codec/format for smaller binary size (include hevc function)
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
If you prefer less codec/format for smaller binary size (by default)
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
当然也可以根据需要自己裁剪.
我们来看下ijkplayer/config/module-lite.sh 即default裁剪模式支持哪些编解码方式
我们可以看到
export COMMON_FF_CFG_FLAGS=”
export COMMON_FF_CFG_FLAGS=”
export COMMON_FF_CFG_FLAGS=”$COMMON_FF_CFG_FLAGS –enable-protocol=rtmp”
四. ijkplayer的java层源码分析
【先占坑,接下来详解】
五. 项目中ijkplayer的封装以及mediaview的封装以及使用
【先占坑,接下来详解】
六. ijkplayer底层学习
【先占坑,接下来重点学习】
七. 开源项目
【接下来仿网易云音乐,写一个开源项目,欢迎多多关注】
七. 常见问题以及解决方案
- ijkplayer播放rtmp直播流,延迟明显
- 全屏播放
- 有时候会开始直播时出现黑屏
- 有时候会出现花屏
- 解码方式设置
- 如何区分点播直播
- 是否需要开启硬件加速
- How to set up only listen to the sound does not show video?
- 如何设置后台播放
- 视频加载速度慢
The traffic speed is mostly depending on the quality of video CDN, not player itself. - 怎么静音 和非静音
mute/unmute system volume.There is no mute/unmute API in ijkplayer. - 视频黑屏,但是有声音
确定下视频源的编码方式,ijk默认只带了h264解码code - 适配问题,对于不同的cpu架构,需要编译不同的so库
- 播放视频有的设备声画不同步
- 如何查看m3u8时长
cat game05.m3u8 | grep EXTINF | wc -l 32 - how to change the video quality?
Video quality is determined when being encoded.I don’t think it can be changed by player. - 倍速播放
Not until Android 6.0 - 为什么往前拖动进度条后,还会往后退几秒
seek只支持关键帧,出现这个情况就是原始的视频文件中i 帧比较少,播放器会在拖动的位置找最近的关键帧。 - how to change URL when ijkplayer is playing RTMP video
Create new player. - 怎样添加字幕呢?
如果希望字幕时间精确,可以在native层做解析和时间同步,到了时间后回调给java层,一般字幕文件加载都是在java层做的,解析文件格式,然后按照时间区间来显示。 - 如何设置硬解?
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, “mediacodec”, 1);
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
八. 参考
视频基础知识
多媒体编解码基础知识
流媒体中用到的几个协议简介
流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls)
android-developer
No RTSP keep-alive packets in 2.3 causing streaming server to close the connection
H264解码器源码(Android 1.6 版)
Android VLC播放器二次开发1——程序结构分析
可以用WebRTC来做视频直播吗?
WebRTC音视频开发总结
雷霄骅(leixiaohua1020)的专栏
MediaPlayer
github
微博
目录(?)[-]
- 前言
- 一 音视频的基础知识
- 1 基本概念
- 2 多媒体的格式分类
- 3 流媒体协议RTP RTCP RTSP RTMP HLS
- 二 android音视频的开发
- 三 ijkplayer的引入介绍使用
- 1 调研过程
- 2 ijkplayer的导入编译使用
- 四 ijkplayer的java层源码分析
- 五 项目中ijkplayer的封装以及mediaview的封装以及使用
- 六 ijkplayer底层学习
- 七 开源项目
- 七 常见问题以及解决方案
- 八 参考
前言
随着音视频领域的火热,在很多领域(教育,游戏,娱乐,体育,跑步,餐饮,音乐等)尝试做音视频直播/点播功能,那么作为开发一个小白,如何快速学习音视频基础知识,了解音视频编解码的传输协议,编解码方式,以及如何技术选型,如何解决遇到的坑,本文抛砖引玉,欢迎大咖交流。
一. 音视频的基础知识
1.1 基本概念
视频是什么
- 1
- 2
- 3
- 1
- 2
- 3
流媒体
- 1
- 2
- 1
- 2
分辨率
- 1
- 2
- 1
- 2
码流
- 1
- 2
- 1
- 2
帧率
- 1
- 2
- 1
- 2
1.2 多媒体的格式分类
封装格式(专业上讲叫容器,通俗的叫文件格式),视频编解码,音频编解码####1.1常见的封装格式* MPEG : 编码采用的容器,具有流的特性。里面又分为 PS,TS 等,PS 主要用于 DVD 存储,TS 主要用于 HDTV.* MPEG Audio Layer 3 :大名鼎鼎的 MP3,已经成为网络音频的主流格式,能在 128kbps 的码率接近 CD 音质* MPEG-4(Mp4) : 编码采用的容器,基于 QuickTime MOV 开发,具有许多先进特性;实际上是对Apple公司开发的MOV格式(也称Quicktime格式)的一种改进.* MKV: 它能把 Windows Media Video,RealVideo,MPEG-4 等视频音频融为一个文件,而且支持多音轨,支持章节字幕等;开源的容器格式* 3GP : 3GPP视频采用的格式, 主要用于流媒体传送;3GP其实是MP4格式的一种简化版本,是手机视频格式的绝对主流.* MOV : QuickTime 的容器,恐怕也是现今最强大的容器,甚至支持虚拟现实技术,Java等,它的变种 MP4,3GP都没有这么厉害;广泛应用于Mac OS操作系统,在Windows操作系统上也可兼容,但是远比不上AVI格式流行* AVI : 最常见的音频视频容器,音频视频交错(Audio Video Interleaved)允许视频和音频交错在一起同步播放.* WAV : 一种音频容器,大家常说的 WAV 就是没有压缩的 PCM 编码,其实 WAV 里面还可以包括 MP3 等其他 ACM 压缩编码等等
1.3 流媒体协议(RTP RTCP RTSP RTMP HLS)
- RTP RTCP RTSP
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- RTMP
- 1
- 1
- HLS
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
二. android音视频的开发
播放流程: 获取流–>解码–>播放
录制播放路程: 录制音频视频–>剪辑–>编码–>上传服务器 别人播放.
直播过程 : 录制音视频–>编码–>流媒体传输–>服务器—>流媒体传输到其他app–>解码–>播放
几个重要的环节
- 录制音视频 AudioRecord/MediaRecord
- 视频剪辑 mp4parser 或ffmpeg
- 音视频编码 aac&h264
- 上传大文件 网络框架,进度监听,断点续传
- 流媒体传输 流媒体传输协议rtmp rtsp hls
- 音视频解码 aac&h264
- 渲染播放 MediaPlayer
问题
Android本身有提供MediaPlayer,那么mediaplayer支持哪些格式的流媒体协议呐?又支持哪些解码器呐?兼容性如何,性功能如何?
Supported Media Formats
Media Playback
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
从上图我们也看到,android平台自身支持的音视频解码是有限的 一般的mp3 mp4….3gp 等等 其他的只能自己解码了。。。
那么如何解码呐?
经过一番调研对比,选择乐ijkplayer.
三. ijkplayer的引入&介绍&使用
正如上文所说,android本事对音视频流媒体传输协议,以及音视频编解码支持有限.所以对于直播类应用,要自己解码
3.1 调研过程
vitamio
webRTC
ffmpeg
vlc
ijkplayer
先说下 vitamio这个是功能很强大,但是企业收费版的,个人用户可以玩玩.
目前WebRtc只适合小范围(8人以内)音视频会议,不适合做直播可以用WebRTC来做视频直播吗?
接下来介绍下 ffmpeg vlc ijkplayer以及选择方案
ffmpeg是一个非常强大的音视频编解码开源库,目前市场上流行的播放器,大部分都是基于此开发的,包括暴风,腾讯,等等以及上面提到的vitamio,vlc,ijkplayer
关于ffmpeg源码分析,有兴趣的请看雷霄骅(leixiaohua1020)的专栏
vlc 支持android开发 ,ijkplayer也支持. 通过反编译网易云音乐,以及YY等音视频app.发现网易云音乐,斗鱼用的ijkplayer,YY用的VLC.
那么vlc&ijkplayer相比较各有什么优缺点呐,该如何选择呐?[待深入使用,或者用过的可以交流下]
其实这个没有深入分析,ijkplayer是bilibili开源的音视频编解码库,对android,ios进行和很好的抽取封装,易于编译使用.vlc尝试过,稍微复杂些.
3.2 ijkplayer的导入&编译&使用
如果不需要对源码进行修改,在app的build.gradle中加入如下依赖即可
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
当然如何你想对其源码进行修改,采用如下方式
1. 需要
下载配置 NDK r10e
配置androidsdk
# add these lines to your ~/.bash_profile or ~/.profile
# export ANDROID_SDK=
# export ANDROID_NDK=
2.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
可以根据需要对音视频编解码库进行裁剪.编译出最小的满足需要的库
bilibili提供三种裁剪方式
If you prefer more codec/format
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
If you prefer less codec/format for smaller binary size (include hevc function)
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
If you prefer less codec/format for smaller binary size (by default)
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
当然也可以根据需要自己裁剪.
我们来看下ijkplayer/config/module-lite.sh 即default裁剪模式支持哪些编解码方式
我们可以看到
export COMMON_FF_CFG_FLAGS=”
export COMMON_FF_CFG_FLAGS=”
export COMMON_FF_CFG_FLAGS=”$COMMON_FF_CFG_FLAGS –enable-protocol=rtmp”
四. ijkplayer的java层源码分析
【先占坑,接下来详解】
五. 项目中ijkplayer的封装以及mediaview的封装以及使用
【先占坑,接下来详解】
六. ijkplayer底层学习
【先占坑,接下来重点学习】
七. 开源项目
【接下来仿网易云音乐,写一个开源项目,欢迎多多关注】
七. 常见问题以及解决方案
- ijkplayer播放rtmp直播流,延迟明显
- 全屏播放
- 有时候会开始直播时出现黑屏
- 有时候会出现花屏
- 解码方式设置
- 如何区分点播直播
- 是否需要开启硬件加速
- How to set up only listen to the sound does not show video?
- 如何设置后台播放
- 视频加载速度慢
The traffic speed is mostly depending on the quality of video CDN, not player itself. - 怎么静音 和非静音
mute/unmute system volume.There is no mute/unmute API in ijkplayer. - 视频黑屏,但是有声音
确定下视频源的编码方式,ijk默认只带了h264解码code - 适配问题,对于不同的cpu架构,需要编译不同的so库
- 播放视频有的设备声画不同步
- 如何查看m3u8时长
cat game05.m3u8 | grep EXTINF | wc -l 32 - how to change the video quality?
Video quality is determined when being encoded.I don’t think it can be changed by player. - 倍速播放
Not until Android 6.0 - 为什么往前拖动进度条后,还会往后退几秒
seek只支持关键帧,出现这个情况就是原始的视频文件中i 帧比较少,播放器会在拖动的位置找最近的关键帧。 - how to change URL when ijkplayer is playing RTMP video
Create new player. - 怎样添加字幕呢?
如果希望字幕时间精确,可以在native层做解析和时间同步,到了时间后回调给java层,一般字幕文件加载都是在java层做的,解析文件格式,然后按照时间区间来显示。 - 如何设置硬解?
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, “mediacodec”, 1);
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
八. 参考
视频基础知识
多媒体编解码基础知识
流媒体中用到的几个协议简介
流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls)
android-developer
No RTSP keep-alive packets in 2.3 causing streaming server to close the connection
H264解码器源码(Android 1.6 版)
Android VLC播放器二次开发1——程序结构分析
可以用WebRTC来做视频直播吗?
WebRTC音视频开发总结
雷霄骅(leixiaohua1020)的专栏
MediaPlayer
github
微博
- android音视频点/直播模块开发
- android音视频点/直播模块开发
- android音视频点/直播模块开发
- android音视频点/直播模块开发
- android音视频点/直播模块开发
- android音视频点/直播模块开发
- Android音视频点/直播模块开发
- android音视频点/直播模块开发
- Android音视频点/直播模块开发
- Android之音视频点、直播模块开发
- Android音视频点/直播模块开发实践总结
- Android音视频点/直播模块开发知识总结-1
- Android音视频点/直播模块开发实践总结
- Android音视频点/直播模块开发实践总结
- Android 视频直播开发
- android 音视频直播
- Android直播,音视频播放
- 音视频直播--Android视频采集(Camera2)
- CMS模板引擎:XHtmlAction
- FFmpeg For Android (二) Ubuntu下编译FFmpeg源码
- ASP.NET MVC 多语言方案
- 最近花了几个夜晚帮师妹整了一个企业网站
- DBImport v3.3 中文版发布:数据库数据互导及文档生成工具(IT人员必备)
- android音视频点/直播模块开发
- 如何识别一个字符串是否Json格式
- Excel导入导出组件的设计
- 回忆录:30岁那年,你成长了吗?(上篇)
- Excel导入导出的业务进化场景及组件化的设计方案(上)
- 自定义可视化调试工具(Microsoft.VisualStudio.DebuggerVisualizers)
- 浅说秋色园域名被国家互联网应急中心封与解的过程
- 开源:秋式广告杀手源码
- IT人生知识分享:概率与运气