热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android视频播放技术

1.HTTP渐进下载流媒体播放2.RTSPRTP流媒体协议3.HTTPLiveStreaming协议4.常用的视频播放框架什么是流媒体技术?简单的说,就是边下载,边播放。也就是说,

1.HTTP渐进下载流媒体播放
2.RTSP/RTP流媒体协议
3.HTTP Live Streaming协议
4.常用的视频播放框架

《Android 视频播放技术》

什么是流媒体技术?

简单的说,就是边下载,边播放
也就是说,客户端在播放前,无需下载整个媒体文件,而是在播放缓存区已下载的媒体数据同时,持续不断的接收媒体流的剩余部分。

更专业一点的定义是:
流媒体技术的主要特点是以“流(Streaming)”的形式在基于IP协议的互联网中进行多媒体数据的实时、连续传播。

常用的流媒体协议有哪些?

流媒体协议有很多,常见的例如:

MMS
RTSP (RTP, SDP), RTMP
HTTP progressive streaming
HLS - HTTP live streaming (M3U8)

本文会介绍下面三种常见的流媒体协议,主要是比较三种协议的优缺点和适用范围:

《Android 视频播放技术》

HTTP渐进下载流媒体播放(HTTP progressive streaming)

什么是HTTP progressive streaming
  • 基于HTTP的渐进下载,是在下载完成后再播放的模式基础上做了一些小的改进。
  • 客户端在开始播放前仅需等待一段较短的时间用于下载和缓冲该媒体文件最前面一部分的数据,之后便可以一边下载一边播放。开始播放前的缓冲通常需要几十秒甚至上百秒的时间。
  • 只有满足特定封装条件的媒体文件格式才支持渐进下载播放,例如编码参数必须放在文件的起始部位,音视频文件完全按照时间顺序交织等。
HTTP progressive streaming的缺点
  • 仅能支持点播,不能支持直播。
  • 媒体流数据到达客户端的速率无法精确控制。
  • 客户端需维持一个与服务器上媒体文件同样大小的缓冲存储空间。
  • 在开始播放之前需要等待一段较长的缓冲时间从而导致实时性较差。
  • 播放过程中,由于网络带宽的波动,可能导致画面卡顿。
  • 不支持全时间范围的搜索、快进、快退等操作。
这些缺点的来源是什么?
  • 渐进下载采用标准HTTP协议传递数据,而HTTP基于TCP之上。
  • TCP最初是为非实时性数据传输而设计的,它通过重传丢失的分组来达到可靠传输的目的。
  • 对于流媒体数据,TCP无法保证所有重传的数据能在它们预定的播放时间之前到达客户端,这种情况下,客户端不能跳过这些数据,必须停下来等待,导致播放器画面卡顿。

RTSP/RTP流媒体协议

什么是RTSP/RTP流媒体协议

RTSP/RTP是目前最流行、使用最广泛的实时流媒体协议,它实际上由一组标准化协议构成:

《Android 视频播放技术》

其中,RTSP是
Real Time Streaming Protocol(实时流媒体协议),RTP是
Real Time Transport Protocol(实时传输协议)

RTSP/RTP流媒体协议栈需要专门的流媒体服务器参与。

媒体数据以匹配音视频码率的速率主动、智能地发送。

在数据递送过程中,服务器和客户端紧密联系,并能对客户端的反馈信息作出响应。

RTSP/RTP的优点
  • RTP是真正的实时传输协议,客户端仅需维持一个很小的解码缓冲区用于缓存视频解码所需的少量参考帧数据,从而大大减少播放时延,通常可控制在1秒内。
  • 使用UDP承载RTP数据包,可提高媒体数据的实时性和吞吐量。当丢包时,服务器可以根据媒体编码特性智能选择性重传,故意丢弃不重要的数据包。
  • 客户端不必等待未按时到达的数据,继续向前播放,保证媒体播放的流程性。

HTTP Live Streaming协议

什么是HTTP Live Streaming

最初是苹果公司针对其移动设备开发的流媒体协议。
让内容提供者通过普通Web服务器向客户端提供接近实时的音视频流媒体服务,包括直播和点播。
支持将同一节目编码为不同码率的多个替换流,客户端可以根据带宽变化在替换流之间智能切换。

一个典型的HTTP Live Streaming流媒体系统由内容准备、内容分发和客户端软件三部分组成:

《Android 视频播放技术》

HTTP Live Streaming解决的问题
  • 放弃专门的流媒体服务器,使用标准的Web服务器递送媒体数据,相比RTSP/RTP降低部署难度。
  • 使用HTTP协议,相比RTSP/RTP降低开发难度。
  • 将大媒体数据分隔为众多小文件来传输,并采用一个不断更新的轻量级索引文件来控制分隔后的小媒体文件的下载和播放,使得流间切换,运维和数据加密变得更方便。

但是,HTTP Live Streaming的最大缺点在于它并非一个真正的实时流媒体系统,在服务器和客户端都存在一定的起始延迟,对于更高码率特别是高清视频的支持程度尚需进一步的探究和验证。

结论

HTTP渐进下载系统部署起来最为简单,但仅适用于较小规模的短视频点播应用;
基于RTSP/RTP的协议栈适合于大规模可扩展的交互式实时流媒体应用,但需要专门流媒体服务 器的支持,安装和维护起来都较为复杂;

HTTP Live Streaming可直接部署于目前拥有广泛运营基础的Web服务器网络环境,不需要对网络基础设施进行升级改造,特别适合对实时性要求不是太高的消费级移动互联网流媒体应用。

《Android 视频播放技术》

常用Android视频播放技术:

  • android SDK: MediaPlayer + SurfaceView
  • android SDK: VideoView
  • Google开源库:Exoplayer
  • Vitamio
  • VLC
  • FFmpeg
  • 其它开源播放器,如ijkplayer

FFmpeg

谈到视频播放,就绕不开FFmpeg。它是一个功能非常强大的音视频录制和编解码库。大部分Android开源视频播放技术,例如上面提到的Vitamio,VLC,ijkplayer,底层都是以FFmpeg作为编解码引擎。

但是,FFmpeg以C来开发,在Android中使用jni调用,还涉及到专业的视频编解码技术,开发和集成难度非常高,需要专业团队来做。做Android应用开发的,一般不太可能直接在项目中使用它。

VLC多媒体播放器

VLC多媒体播放器是VideoLAN计划的多媒体播放器,它融合了FFmpeg计划的解码器与libdvdcss程序库使其有播放多媒体文件及加密DVD影碟的功能。

在Android上有一个开源的播放器vlc for android,它基于VLC开发,具备所有播放控制特性,是很好的参考资料。

使用VLC比直接使用FFmpeg要简单得多,但相比Android原生sdk,它要处理的事情还是非常多,集成比较费时间。

Vitamio

Vitamio是中国团队开发的,基于FFmpeg的视频播放框架,支持的音视频格式和流媒体协议非常全面。它的api基本和Android原生sdk一样,集成难度最小。

但是,Vitamio分成标准版和至尊版,标准版免费限个人开发者使用,部分多媒体播放功能只有付费版才能使用。这在公司开发中是一个比重很大的影响因素。

参考链接

Android 多媒体视频播放一 (多媒体理解与经验分享)
FFmpeg vs Vitamio — Stack Overflow
Exoplayer vs Vitamio — Stack Overflow


推荐阅读
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 集成电路企业在进行跨隔离网数据交换时面临着安全性问题,传统的数据交换方式存在安全性堪忧、效率低下等问题。本文以《Ftrans跨网文件安全交换系统》为例,介绍了如何通过丰富的审批流程来满足企业的合规要求,保障数据交换的安全性。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • 本文介绍了在交换型网络环境下使用嗅探器ARPSniffer的方法,包括检测嗅探环境、设置嗅探的网卡和启动自动路由功能等步骤。同时指出ARPSniffer也可以在非交换型网络环境下使用来嗅探各种网络信息。 ... [详细]
author-avatar
落地有声800_491_431
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有