当前位置: 首页 > news >正文

《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之66---BREW 应用中的流媒体播放...

流式播放的数据源来自ISource 接口对象,可以来自于网络,内存或者文件。流式媒体有两种内容:一种是格式化的媒体,该媒体包含了头,编码规范和原始数据的起始位置,例如.mp3 或者 .wav 的文件;另一种是原始数据,其编解码方法由使用者单独提供。流式播放需要一个ISource的具体实现,由应用创建 ISource 接口, 并保持在IMedia 接口的整个生命周期内有效。下面是一个简单的例子,对一个wav文件实现流式播放。

static void MyApp_SetupSource(MyApp * pme){

AEEMediaDataEx md;

IFileMgr *pfm; ISourceUtil *psu;

// 步骤#1: 创建IMedia PCM 对象,处于 IDLE 状态

ISHELL_CreateInstance(pme->e.m_pIShell,AEECLSID_MEDIAPCM,(void**)&pme->m_pIMedia);

// 步骤#2: 创建具体ISource对象

ISHELL_CreateInstance(pme->e.m_pIShell, AEECLSID_FILEMGR, (void **)&pfm))

pme->m_pFile = IFILEMGR_OpenFile(pfm, "sample.wav", _OFM_READ);

IFILEMGR_Release(pfm);

ISHELL_CreateInstance(pme->e.m_pIShell, AEECLSID_SOURCEUTIL, (void **)&psu))

ISOURCEUTIL_SourceFromAStream(psu, (IAStream*)pme->m_pFile, &pme->m_pISource);

ISOURCEUTIL_Release(psu);

// 步骤 #3: ISource 初始化AEEMediaDataEx

md.clsData = MMD_ISOURCE;

md.pData = (void *)pme->m_pISource;

md.dwSize = 0;

md.dwStructSize = sizeof(md); // AEEMediaDataEx 数据结构的大小

md.dwCaps = 0;.

md.bRaw = FALSE; // 是否是原始数据? FALSE代表不是

md.dwBufferSize = 0; // 内部的缓存大小, 0 代表使用默认值.

md.pSpec = NULL; // 只对原始数据格式有限

md.dwSpecSize = 0; //只对原始数据格式有限

// 步骤#4: 设置媒体数据,IMedia 对象处于 READY状态

IMEDIA_SetMediaDataEx(pme->m_pIMedia, &md, 1);

}

对于原始数据的流式播放,由于没有媒体播放的终止符,需要在播放中准确的调用IMEDIA_Stop()。在AEEMediaDataEx 数据结构中,需要将bRaw 设为TRUE,将pSpec 设为指定的编解码方法。

流媒体播放就是数据源来自网络的流式播放,采用流式传输的方式,不需要用户将多媒体数据全部下载,而是采取边下载边播放的方式, 仅仅将最初的一些数据先下载到本地缓冲区,只要数据积累到可以连续播放的要求后就开始播放,后面的数据会根据请求不断进入本地缓冲区,从而使播放片断形成一个完整的数据流,如最常用的网络电视PPLIVE 就是采用这种技术。由于无线网络的限制,移动流媒体一般采用单播的播放方式,每个接收端与流媒体服务器建立起一对一的连接关系,每个用户单独向服务器发出数据请求,并由服务器向该用户发送单独的数据拷贝。

由于目前的API不支持对H. 264 或者MPEG- 4/ H. 263 格式的接口,因此需要移植相应的解码器到BREW平台上。移植主要使用BREW的接口来替代解码器中的C 语言函数,并用整数计算或定点计算代替浮点运算,尤其需要解决的是H.264 Xvid 参考源程序所使用的栈空间超过BREW手机的限制问题(如将数组改为动态分配内存,将全局的数组改为函数域中),最终将视频帧解码为位图显示在手机屏幕上。手机播放视频流的一个重要问题是解决音视频的同步。服务器端传送的数据包中包含了音频和视频的播放持续时间,这样可以采取以音频播放时间为基准,校正视频播放. 假设ha 是当前音频的播放时间, hv是当前视频帧的播放时间. 如果hv < ha ,表示视频滞后于音频,则丢弃此帧,立刻转向下一帧的解码;如果hv > ha ,表示视频超前于音频,则此帧暂时不显示,等待音频播放hv - ha 的时间后再显示.

相关文章:

  • JAVA的树形操作
  • 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之67---BREW 应用中的SVG技术...
  • cjdbc入门配置oracle
  • java大数据处理-千万级数据写xml
  • 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之68---BREW 应用中的3维图像技术...
  • 三种常见中文内码的转换方法
  • Windows Phone 7 开发技术在线学习【2】 -- WP7 多任务之道
  • TUP:分享产品背后的技术和用户体验
  • sample_code
  • OGC标准介绍 18
  • PHP的基本常识(2)
  • 「Apple iOS 模仿者」华丽转身为「Apple iOS 挑战者」
  • Windows Phone 7 模拟器外观下载——Nokia Lumia 800
  • inotify文件系统事件驱动机制
  • RNC/SGSN/PDP/IUPS概念
  • [LeetCode] Wiggle Sort
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • hadoop集群管理系统搭建规划说明
  • Spark学习笔记之相关记录
  • SpiderData 2019年2月25日 DApp数据排行榜
  • yii2中session跨域名的问题
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 半理解系列--Promise的进化史
  • 老板让我十分钟上手nx-admin
  • 如何优雅地使用 Sublime Text
  • 数据科学 第 3 章 11 字符串处理
  • 新版博客前端前瞻
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​渐进式Web应用PWA的未来
  • #HarmonyOS:基础语法
  • #Z0458. 树的中心2
  • (20050108)又读《平凡的世界》
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (算法)N皇后问题
  • (算法)Travel Information Center
  • (五)Python 垃圾回收机制
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)jQuery 基础
  • (转)linux 命令大全
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .net FrameWork简介,数组,枚举
  • .net 调用php,php 调用.net com组件 --
  • .NET建议使用的大小写命名原则
  • .NET连接数据库方式
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .NET性能优化(文摘)
  • .Net中的集合
  • @javax.ws.rs Webservice注解
  • [ 第一章] JavaScript 简史