关键词: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. 视频技术的初步分析 #

  1. 接入模块基于网络协议从视频流中提取真正的视频数据,并存放到下载缓冲区中;
  2. 解复用模块将音频和视频内容分离开;
  3. 解码模块分别对音频和视频内容进行解码,把压缩的数据还原成原始音视频数据,类似一张张位图格式的图像,并存入解码缓冲区;
  4. 输出模块,从解码缓冲区读取数据并完成渲染实现视频的播放;
  5. 控制器模块,通过与其它模块的交互,完成同步音视频流,进行控制播放速度以及暂停快进等操作,获取视频流的媒体信息,调整视频亮度等功能;

3. 关于 ijkplayer #

  1. 准备软硬件。准备 PC 机,JDK,Android SDK,Android NDK,git,yasm 编译器环境;
  2. 下载项目代码。git clone ijkplayer 源代码和 ffmpeg 源代码;
  3. 编译播放器内核。编译 ffmpeg 生成库(libijkffmpeg.so 用于解码,libijksdl.so 用于播放和显示,其它平台库用于 ijkplayer 编译);
  4. 编译播放器工程。编译 ijkplayer 生成库(libijkplayer.so 支持播放器主要的功能实现);
  5. 基于 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. 播放器技术能力了解的重点 #

  1. 如何定制化视频框架;
  2. 实时码率是否可以获取;
  3. 视频分片的统计信息(分片下载时延,分片大小等)是否可以获取;
  4. 播放器缓冲区模型和机制是否了解,是否可以限定初始缓冲量的大小(缓冲区作为重点调研下,如“播放器到底有几个缓冲区,怎么分,完全开源的应该怎么设置,解码缓冲区用来设置已经解码的还是待解码的”等问题);
  5. 是否可以直接在播放内部通过缓存区填充情况计算流量和速率;
  6. 是否支持 HTTP + Range 的播放方式(当前多数主流视频网站已更新为当前这种机制);
  7. 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.

# 对视频播放器的研究相关推荐

  1. VR 视频播放器研究

    最近关注VR视频播放器: 无意间看到了jwplayer 提供的demo. https://developer.jwplayer.com/jw-player/demos/innovation/360-v ...

  2. 字节跳动bytedance西瓜视频播放器研究

    西瓜视频播放器插件API文档http://h5player.bytedance.com/ 1.视频播放器示例: <!DOCTYPE html> <html><head&g ...

  3. python开发视频播放器_python视频播放器

    广告关闭 100GB直播流量包仅需9.9元,10TB点播流量包仅需999元,参与活动还赠移动直播SDK,短视频SDK,小程序插件等,大促100%中奖率 最近研究了python的两个gui包,tkint ...

  4. 让我为你介绍一个神器:Chimee,一套可扩展的 H5 视频播放器解决方案

    Chimee(读"奇米", [tʃɪ'mɪ:])是由奇舞团开源的一套 H5 视频播放器解决方案,由奇舞团视频云前端团队结合在业务和视频编解码方向的沉淀积累倾心打造. Chimee ...

  5. FFmpeg再学习 -- FFmpeg+SDL+MFC实现图形界面视频播放器

    继续看雷霄骅的 课程资料 - 基于FFmpeg+SDL的视频播放器的制作 最后一篇,主要是想学一下 MFC 创建和配置. 一.创建 MFC 工程 文件->新建->项目->Visual ...

  6. 最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)

    ===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...

  7. python制作视频播放器_Python应用03 使用PyQT制作视频播放器

    最近研究了Python的两个GUI包,Tkinter和PyQT.这两个GUI包的底层分别是Tcl/Tk和QT.相比之下,我觉得PyQT使用起来更加方便,功能也相对丰富.这一篇用PyQT实现一个视频播放 ...

  8. python开发视频播放器_Python应用03 使用PyQT制作视频播放器实例

    最近研究了Python的两个GUI包,Tkinter和PyQT.这两个GUI包的底层分别是Tcl/Tk和QT.相比之下,我觉得PyQT使用起来更加方便,功能也相对丰富.这一篇用PyQT实现一个视频播放 ...

  9. Python使用PyQT制作视频播放器

    最近研究了Python的两个GUI包,Tkinter和PyQT.这两个GUI包的底层分别是Tcl/Tk和QT.相比之下,我觉得PyQT使用起来更加方便,功能也相对丰富.这一篇用PyQT实现一个视频播放 ...

最新文章

  1. Host Only、NAT和Bridge三种网络连接
  2. 模拟打字机,文字逐个出现
  3. Java笔记(持续更新中)
  4. php glod,基于PHP的黄金价格示例代码-六派数据
  5. JAVA-MyBatis ORM
  6. 华为鸿蒙OS 2.0正式发布!明年华为手机将全面支持!
  7. .NET Core 3.0 Preview 7 已经发布
  8. 场景化支付的关键技术
  9. 深入理解空指针(C++)
  10. 刘知远:NLP研究入门之道(二)走近NLP学术界
  11. 哈理工oj1003 Tiles of Tetris, NOT!
  12. 核心网upf作用_5G核心网关键技术研究
  13. 通用流量办什么卡划算?告诉你三大运营商该如何选择?
  14. mina自定义编解码
  15. JSP知识点1——什么是JSP?
  16. 计算机助理职称考试成绩查询,初级成绩可以查询了!
  17. 常见的关系型数据库与非关系型数据库对比详解。
  18. 虚幻引擎5 C++编程学习
  19. 计算机应用计算题(88)10,2018一级结构工程师《计算机应用基础》题库及答案(十)...
  20. LINUX下常见搜索文件方法

热门文章

  1. python 测试用例管理工具_好用又免费的测试用例管理工具有哪些?
  2. Spark GraphX图计算框架原理概述
  3. [196]. 删除重复的电子邮箱
  4. 外贸盒子 X96 线刷固件包
  5. 【Protobuf速成指南】.proto文件的编写与编译
  6. python定义一个空变量_Python 学习笔记 - Python 变量
  7. 很好用的java http请求工具:http-request的使用
  8. 2.串口通信的基本概念
  9. B站新顶流多恐怖? 8位千粉UP主缔造1000万播放
  10. KITTI数据集(概念版)