BREW 应用中的流媒体播放

简介: 版权声明:本文为半吊子子全栈工匠(wireless_com,同公众号)原创文章,未经允许不得转载。 https://blog.csdn.net/wireless_com/article/details/6509012 流式播放的数据源来自ISource 接口对象,可以来自于网络,内存或者文件。
版权声明:本文为半吊子子全栈工匠(wireless_com,同公众号)原创文章,未经允许不得转载。 https://blog.csdn.net/wireless_com/article/details/6509012

流式播放的数据源来自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 的时间后再显示.

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wireless_com/archive/2010/07/21/5751897.aspx

目录
相关文章
|
5月前
|
存储 Cloud Native Linux
音视频 ffmpeg命令视频录制(Windows)
音视频 ffmpeg命令视频录制(Windows)
|
7月前
|
开发工具 Windows
Windows平台RTMP推送|轻量级RTSP服务实现本地摄像头|屏幕|叠加数据预览
大家在做Windows平台RTMP推送或轻量级RTSP服务的时候,不管是采集屏幕还是采集摄像头,亦或屏幕摄像头的叠加模式,总会有这样的诉求,采集到的数据,希望能本地看看具体采集的数据或者图像实际效果,也就是本次介绍的“预览”功能。
190 0
|
7月前
|
编解码 开发工具 Android开发
Android平台RTSP轻量级服务|RTMP推送摄像头或屏幕之音频接口设计
好多开发者在做Android平台录像或者RTSP轻量级服务、RTMP推送相关模块时,对需要设计哪些常用接口会心存疑惑,本文主要以大牛直播SDK(官方)为例,简单介绍下Android平台直播推送SDK所有音频相关的接口,感兴趣的开发者可以看看。
|
7月前
|
监控 开发工具 C++
Windows平台RTMP/RTSP播放器如何实现实时音量调节
RTMP或RTSP直播播放音量调节,主要用于多实例(多窗口)播放场景下,比如同时播放4路RTMP或RTSP流,如果音频全部打开,几路audio同时打开,可能会影响用户体验,我们通用的做法是支持播放端实时静音,更细粒度的做法是可以实时调节每一路RTMP/RTSP流的音量。
170 0
|
C#
WPF之VLC流媒体播放
原文:WPF之VLC流媒体播放 最近在做关于在WPF使用VLC流媒体播放的问题,现在可以在WPF中实现VLC本地播放了,流播放解决了,在下面的代码中注释流媒体播放那两段代码,更多的在乎大家摸索了^^,以供大家相互学习,这里我就先把实现VLC本地播放的代码和过程写给需要的朋友参考。
2513 0
|
3月前
|
C# 数据安全/隐私保护 开发者
Windows平台RTMP推送|轻量级RTSP服务录像模块如何支持中文路径?
Windows平台RTMP推送|轻量级RTSP服务录像模块如何支持中文路径?
|
7月前
|
Linux C# 图形学
Unity3D下Linux平台播放RTSP或RTMP流
尽管Windows平台有诸多优势,Linux平台的发展还是势不可挡,特别实在传统行业,然而Linux生态构建,总是差点意思,特别是有些常用的组件,本文基于已有的Linux平台RTSP、RTMP播放模块,构建Unity下的RTSP和RTMP直播播放。
|
7月前
|
vr&ar 开发工具 图形学
Windows平台Unity3d下如何同时播放多路RTSP或RTMP流
好多开发者在做AR、VR或者教育类产品时,苦于如何在windows平台构建一个稳定且低延迟的RTSP或者RTMP播放器,如果基于Unity3d完全重新开发一个播放器,代价大、而且周期长,不适合快速出产品,我们认为当前最好的方式就是集成现有Native平台上成熟稳定播放器,回调rgb/yuv数据到上层,上层做绘制即可。
|
9月前
|
编解码 监控 开发工具
DirectShow捕获+mencoder+ffmpeg+sox 打造小巧的音视频制作、加工软件
DirectShow捕获+mencoder+ffmpeg+sox 打造小巧的音视频制作、加工软件
60 0
DirectShow捕获+mencoder+ffmpeg+sox 打造小巧的音视频制作、加工软件
|
编解码 开发者 Python
Kivy之Video控件播放远程RTSP流
Kivy之Video控件播放远程RTSP流
368 0
Kivy之Video控件播放远程RTSP流