您的位置:首页 > Web前端

symbian流媒体开发一些有用经验(2009.1.31更新)

2009-03-03 09:31 267 查看
1. 通过CVideoPlayerUtility的OpenUrlL()打开了3gp (证实了使用该接口可以实现RTSP流的接收,而官方文档只是介绍能播放"clip”)

 

   相关链接:如何使用CVideoPlayerUtility来播放视频文件

 

  OpenUrlL()播放rtsp资源时候,大致会做下面3件事情
1.根据提供的文件格式,如果url没有文件格式,需要手动指明mime type;初始化plug-in codec;在MvpuoOpenComplete()回调之前完成
2.通过内置的rtsp协议与服务器通信,建立连接,这部分在MvpuoPrepareComplete()之前完成
  在我的例子中,模拟器和dss建立了rtsp连接,模拟器解析了sdp,这样就得到了文件信息
3.发出rtsp的PLAY请求,模拟器开始接受数据,这时候可以通过MvloLoadingStarted()得到开始缓冲的信息
 
最重要的调用就是这个了
iPlayer->OpenUrlL(aUrl, iap, KNullDesC8, KNullUid);
 
在开始写这行代码之前,要确定
1.aUrl在realplayer上能不能打开,协议是否支持,传输的方式(TCP/UDP)和端口是否支持,文件的格式是否支持
2.iap是否设置正确,如果不正确不能建立连接
3.在模拟器上要加上函数需要的能力,因为我打开了能力检查,没再mmp中加入能力,导致回给我KErrCouldNotConnect

 

    考虑方案是CMdaAudioOutputStream结合Libmad(开源MP3解码库)来实现。有个开源项目S60 Internet Radio很有用,它支持多种音频格式的播放:MP3, AAC, eAAC+, MP4, M4A, WMA, 3GPP, AMR, and WAV。

 

4. Symbian解码AMR的方法

  1、直接使用CMdaAudioOutputStream类
CMdaAudioOutputStream *iOutputStream;

在函数MaoscOpenComplete(TInt aError)中设置解码器为AMR
iOutputStream->SetDataTypeL(KMMFFourCCCodeAMR)

需要包含的头文件
#include <mda/common/audio.h>
#include <MdaAudioOutputStream.h>

需要链接的库
mediaclientaudiostream.lib

然后就可以直接使用iOutputStream->WriteL写入AMR码流。
但这种方法无法实现流式播放,可能是因为每次调用WriteL都会重新初始化解码器,回放出来的声音有问题。

 

2、使用CMMFCodec类解码,然后再使用CMdaAudioOutputStream类回放

CMMFDescriptorBuffer *iPcm16Buffer = CMMFDescriptorBuffer::NewL( OutputSize );

CMMFDescriptorBuffer *iAmrBuffer = CMMFDescriptorBuffer::NewL( InputSize );
CMMFCodec *iOCodec = CMMFCodec::NewL( TUid::Uid(  0x101FAF67 ) );

TDesC8* ConvertAmr2PcmL( const TDesC8& aAmrData )
{

 // amr input data
 iAmrBuffer->Data().Copy( aAmrData );

 // decode
 TCodecProcessResult result = iOCodec->ProcessL( *iAmrBuffer,
*iPcm16Buffer );

 if ( ( result.iStatus == TCodecProcessResult::EProcessComplete ) &&
 ( result.iSrcBytesProcessed == KAmrFrameSize ) &&
 ( result.iDstBytesAdded == KPcmBufferSize ) )
 {
 // return buffer
  return &( iPcm16Buffer->Data() );
 }
 else
  return NULL;
}

需要包含的头文件
#include <mmf/server/mmfcodec.h>

需要链接的库
mmfserverbaseclasses.lib

使用CMdaAudioOutputStream的时候要注意,必须等MaoscBufferCopied被调用以后才能再
次调用WriteL,因为Symbian中没有缓冲队列的。

 

5. 怎么样用C语言实现amr解码为pcm数据

 

3GPP TS 26.073 AMR speech Codec; C-source code
http://www.3gpp.org/FTP/Specs/html-info/26073.htm

3GPP TS 26.104 ANSI-C code for the floating-point Adaptive Multi-Rate (AMR) speech codec
http://www.3gpp.org/FTP/Specs/html-info/26104.htm

试验当中aUrl等于rtsp://192.168.20.43/sample_50kbit.3gp,这个文件采用MPEG4-ES + AMR编码格式

 

  转自仙人板板BLOG

 

2. 无论使用OpenFileL()、OpenDesL()还是OpenUrlL(),传给CVideoPlayerUtility的都只是视频剪辑,所以说它支持播放剪辑式的内容。而开发人员有办法像使用CMdaAudioOutputStream那样把流式的内容连续地传给CVideoPlayerUtility播放吗?没有。所以说它不支持播放流式的内容。 from chenziteng


 

3.基于http的流媒体音乐播放器的开发

   

     原理是这样:从 HTTP 服务器获得 MP3 媒体信息,然后通过网络传输把 MP3 数据以数据流的形式接收到 MP3 流媒体播放器客户端,由客户端通过 libmad 解码 MP3 数据流,得到 PCM 音频数据,写入音频设备,播放音乐。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息