热门标签 | 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


推荐阅读
  • Framework7:构建跨平台移动应用的高效框架
    Framework7 是一个开源免费的框架,适用于开发混合移动应用(原生与HTML混合)或iOS&Android风格的Web应用。此外,它还可以作为原型开发工具,帮助开发者快速创建应用原型。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 优化Vite 1.0至2.0升级过程中遇到的某些代码块过大问题解决方案
    本文详细探讨了在将项目从 Vite 1.0 升级到 2.0 的过程中,如何解决某些代码块过大的问题。通过具体的编码示例,文章提供了全面的解决方案,帮助开发者有效优化打包性能。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • Git命令基础应用指南
    本指南详细介绍了Git命令的基础应用,包括如何使用`git clone`从远程服务器克隆仓库(例如:`git clone [url/path/repository]`)以及如何克隆本地仓库(例如:`git clone [local/path/repository]`)。此外,还提供了常见的Git操作技巧,帮助开发者高效管理代码版本。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • Python 3 Scrapy 框架执行流程详解
    本文详细介绍了如何在 Python 3 环境下安装和使用 Scrapy 框架,包括常用命令和执行流程。Scrapy 是一个强大的 Web 抓取框架,适用于数据挖掘、监控和自动化测试等多种场景。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 如何查询计算机的显卡型号及性能参数? ... [详细]
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社区 版权所有