关键词:ijkplayer / 播放器 / 视频技术
本次笔记主要梳理了几家主流视频播放器的调研和对视频技术的初步分析。
1. 对几家视频播放器的调研对比 #
(1)ijkplayer
- 支持 Android 和 iOS 平台;
- API 易于集成;
- 编译配置可裁剪,方便控制安装包大小;
- 支持硬件加速解码;
- 移除了 ffmpeg 视频内核中不常用的特性以减小体积;
- 使用各种平台原生的渲染方式进行优化,修复一些在线视频播放的 BUG;
- 开源;
(2)Vitamio
- 支持 Android 和 iOS 平台;
- 支持硬件解码与 GPU 渲染,API 接口简洁易用;
- 目前,全球已经有超过一万种应用在使用 vitamio,覆盖用户超过 5 亿;
- 可播放 720P 甚至 1080P 高清 MKV / FLV / MP4 / MOV / TS / RMVB等常见格式的视频
- 支持 MMS / RTSP / RTSP / HLS(m3u8) 等常见协议,包括点播与直播;
- 高级功能收费;
(3)VLC
- 全名是 Video Lan Client,是一个开源的、跨平台的视频播放器,支持大量的音视频传输、封装和编码格式
- 几乎支持所有的视频格式,也很注重版权方面的问题,程序结构的扩展性好;
- 开源;
- 项目庞大;
(4)优酷
- 优酷公司开放的播放器框架,支持 Android / iOS / Web 平台,用于播放优酷视频网站的视频;
- 呵呵,比较封闭;
- 接口不够丰富,不支持 1080P;
- 不开源;
对我个人而言,更喜欢 ijkplayer,有以下几个原因:
1. 它开源,便于掌握关键机制和定制功能;
2. 项目代码比较精简,相对于 VLC 来说,研究难度小一些;
3. 功能强大,主流视频格式和协议都支持;
2. 视频技术的初步分析 #
- 接入模块基于网络协议从视频流中提取真正的视频数据,并存放到下载缓冲区中;
- 解复用模块将音频和视频内容分离开;
- 解码模块分别对音频和视频内容进行解码,把压缩的数据还原成原始音视频数据,类似一张张位图格式的图像,并存入解码缓冲区;
- 输出模块,从解码缓冲区读取数据并完成渲染实现视频的播放;
- 控制器模块,通过与其它模块的交互,完成同步音视频流,进行控制播放速度以及暂停快进等操作,获取视频流的媒体信息,调整视频亮度等功能;
3. 关于 ijkplayer #
- 准备软硬件。准备 PC 机,JDK,Android SDK,Android NDK,git,yasm 编译器环境;
- 下载项目代码。git clone ijkplayer 源代码和 ffmpeg 源代码;
- 编译播放器内核。编译 ffmpeg 生成库(libijkffmpeg.so 用于解码,libijksdl.so 用于播放和显示,其它平台库用于 ijkplayer 编译);
- 编译播放器工程。编译 ijkplayer 生成库(libijkplayer.so 支持播放器主要的功能实现);
- 基于 Android 开发环境,导入 3 和 4 中的库文件,并基于 ijkplayer 源码中的内容,构建项目工程完成播放器应用的开发;
ffmpeg 编译之后主要是用于生成 libijksdl.so,ibijkffmpeg.so
两个分别主宰不同的方向:libijksdl.so 用于绘图显示(视频播放线程等和键鼠操控);libijkffmpeg.so用于数据解码等处理;
整体解码内核使用了 3 个第三方库:
1. ffmpeg 生成 libijkffmpeg.so
2. sdl 生成 libijksdl.so
3. libyuv 被静态链接进 sdl 中
作者的播放器库:
libijkplayer.so
基于 ffplay,增加了不少东西,是 player 级别的关键代码
作者自主功能主要在 libijkplayer.so 这块
4. 播放器技术能力了解的重点 #
- 如何定制化视频框架;
- 实时码率是否可以获取;
- 视频分片的统计信息(分片下载时延,分片大小等)是否可以获取;
- 播放器缓冲区模型和机制是否了解,是否可以限定初始缓冲量的大小(缓冲区作为重点调研下,如“播放器到底有几个缓冲区,怎么分,完全开源的应该怎么设置,解码缓冲区用来设置已经解码的还是待解码的”等问题);
- 是否可以直接在播放内部通过缓存区填充情况计算流量和速率;
- 是否支持 HTTP + Range 的播放方式(当前多数主流视频网站已更新为当前这种机制);
- VR 产品和应用发展迅速,后续在现场会议,演唱会,游戏等行业会大行其道,对于 VR 视频的播放,如何解决同传统视频播放有什么差别;
5. 其它 #
http://dranger.com/ffmpeg/
这应该是目前网络上大多数教程的参考源。
http://blog.csdn.net/leixiaohua1020/article/details/15811977
这是一个总结性的文章,作者对 FFmpeg 的底层做了很多的研究,Android 端太少,但是源码分析的很不错,唯一可惜的是作者没有敢去分析 ffplay 的源码,要不我们的工作量或者我们对播放的原理理解就会进入一个新的高度
http://dande618.github.io/blog/2013/10/29/FFMepg/
这个博客的代码对音频进行了较好的处理(虽然不大懂,但确实可以工作)
http://www.cnblogs.com/tanlon/p/3966130.html
这个博客的作者对很多音视频相关的内容进行了多个平台的实践,值得参考
https://github.com/dxjia/ffmpeg-jni-sample
这位作者使用 FFmpeg 将本地视频转成 gif 图片播放,源码由于环境的缘故还没有测试,但好歹是一个突破。
http://blog.csdn.net/jwzhangjie/article/details/9111547
本地视频播放器开发–SDL 编译编译中编译出 sdl 的支持库,只可惜是本地的
End.
Note by HF.