FlashSDK使用说明书
一.概述
FlashSDK是跨平台的FLASH流媒体发布开发包,可以将编码好的H264视频以及AAC音频发布到指定的FMS(FLASH Media Service)服务器上,利用FMS服务器强大的转发存储能力以及全世界安装量最大的媒体播放器FLASH player,实现PC,手机,平板电脑的跨平台的流媒体播放解决方案。
FlashSDK支持的平台将包括:
* X86 WINDOS
* X86 LINUX
* DAVINCI-ARM-LINUX: 美国德州仪器在安防监控领域性能最强大的处理器平台
* HISI-ARM-LINUX: 海思半导体在安防监控领域性价比和市场占有率最高的处理器平台
* Android平台:Google的智能手机操作系统平台
* iOS平台:Apple的智能手机操作系统平台
* WINCE平台:Microsoft的智能手机操作系统平台
利用FLASHSDK简单的SDK,可以在最短时间内,为您的产品增加FLASH流媒体发布功能,并实现跨平台访问,可广泛应用在网络视频监控,网络会议电视,网络教育,流媒体直播,视频广告发布等各种应用中。
二.FlashSDK发行包的目录结构
Flashsdk
Davinci-linux
Lib
?Flashsdk.a
?Flashsdk.h
Demo
?Makefile
?Demo.c
Hisi-linux
Lib
?Flashsdk.a
?Flashsdk.h
Demo
?Makefile
?Demo.c
X86-linux
Lib
?Flashsdk.a
?Flashsdk.h
Demo
?Makefile
?Demo.c
Doc
?FLASHSDK使用说明书.doc
Flashplayer
?详见目录
三.接口说明
1.数据结构和定义
* 视频参数定义
typedef struct
{
?//int? codec; //must be h264
?int? enable;
?int? width;
?int? height;
?int? datarate;
?int? framerate;
?char pps[256];
?int? pps_len;
?char sps[256];
?int? sps_len;
}VIDEO_PARAM;
?
* 音频参数定义
typedef struct
{
?//int codec; //must be aac
?int enable;
?int datarate;
?int samplerate;
?int samplesize;
?int stero;
?char aac_cfg[256];
?int? aac_cfg_len;
}AUDIO_PARAM;
* 网络参数定义
typedef struct
{
?int nodelay;
?int timeout_seconds;
?int send_buf_size;
?int send_trunk_size;
}NETWORK_PARAM;
Nodelay: 是否启用socket的TCP_NODELAY的选项。
timeout_seconds: socket发送和接收数据超时时间,单位为秒
send_buf_size:socket发送缓冲大小
send_trunk_size: socket每次发送媒体流的块大小
* 网络状态定义
enum
{
?FLASH_STATUS_CONNECTING=0,
?FLASH_STATUS_CONNECT_OK,
?FLASH_STATUS_CONNECT_FAILED,
?FLASH_STATUS_CONNECTING_STREAM,
?FLASH_STATUS_CONNECT_STREAM_OK,
?FLASH_STATUS_CONNECT_STREAM_FAILED,
?
?FLASH_STATUS_WRITE_FAILED,
?FLASH_STATUS_CLOSED,
};
* 网络状态回调函数定义
typedef int NETWORK_CALLBACK(int handle,int status);
* 缓冲状态回调函数定义
typedef int BUFFER_CALLBACK(int handle,int unsent);
2.API说明
* SDK初始化
Int flash_init(void)
参数:
无
返回值:
<0,初始化失败
其他,初始化成功
说明:
在调用所有其他API(flash_version除外)之前,必须调用此API,否则将返回失败。
* SDK注销
Int flash_release(void)
参数:
无
返回值:
<0,注销失败
其他,注销成功
说明:
在调用此API之后,除非重新调用flash_init,否则调用其他API将失败(flash_version除外)。
* 查询SDK版本信息
Char *flash_version(void)
参数:
无
返回值:
版本信息字符串,如:Demo ver 1.0.0 build Oct 10 2011
说明:
无。
* 创建会话实例
int flash_session_create(char *server,unsigned short port,char *application,char *stream,char *username,char *password);
参数:
Server:FMS服务器地址或者域名
Port: FMS服务器RTMP服务端口
Application: RTMP服务实时流的应用名称,默认为”live”
Stream: 当前实例发布实时流的名称
Username: 发布流时如果服务器需要认证,提供的用户名
Password: 发布流时如果服务器需要认证,提供的密码
返回值:
<0,创建实例失败
其他,返回的实例编号
* 设置会话参数
int flash_session_setup(int handle,VIDEO_PARAM *video_param,AUDIO_PARAM *audio_param,NETWORK_PARAM *network_param);
参数:
Handle: flash_session_create返回的实例
video_param:要发布实时流的视频参数
audio_param: 要发布的实时流的音频参数
network_param: 发布该实时流时可选的网络参数
返回值:
<0: 失败
其他:成功
* 启动视频流发布会话
int flash_session_start(int handle,NETWORK_CALLBACK netcb,BUFFER_CALLBACK bufcb);
参数:
Handle: flash_session_create返回的实例
Netcb: 通知网络参数变化时,调用的回调函数
Bufcb:通知缓冲数据时,调用的回调函数
返回值:
<0: 失败
其他:成功
* 发布一帧视频数据
int flash_session_send_video(int handle,unsigned char *data,int len,int iskey,double timestamp);
参数:
Handle: flash_session_create返回的实例
Data: 视频数据缓冲指针
Len: 视频数据长度
Iskey: 视频数据是否是关键帧
Timestamp: 视频数据对应的时间戳
返回值:
<0: 失败
其他:成功
* 发布一帧音频数据
int flash_session_send_audio(int handle,double timestamp);
参数:
Handle: flash_session_create返回的实例
Data: 音频数据缓冲指针
Len: 音频数据长度
Timestamp: 视频数据对应的时间戳
返回值:
<0: 失败
其他:成功
* 停止发布会话
int flash_session_stop(int handle);
参数:
Handle: flash_session_create返回的实例
返回值:
<0: 失败
其他:成功
* 释放会话实例
int flash_session_destroy(int handle);
参数:
Handle: flash_session_create返回的实例
返回值:
<0: 失败
其他:成功
3.调用参考
?调用的伪代码如下:
flash_init();
?
int handle = flash_session_create(param->server,
????????param->port,
????????param->application,
????????param->stream,
????????param->user,
????????param->pass);
??
?flash_session_setup(handle,
¶m->video_param,
¶m->audio_param,
¶m->network_param);?
?flash_session_start(handle,netcb,bufcb);
?
?while(param->running)
?{??
?。。。
???iskey = is_h264_key_frame(frame,len);???
???flash_session_send_video(handle,frame,len,iskey,timestamp);
?。。。
???flash_session_send_audio(handle,timestamp);
?。。。
?}
?flash_session_stop(handle);
?flash_session_destroy(handle);
?flash_release();
四.如何测试和评估
FlashSDK的发行版本中包含有DEMO的源代码,用户可自己编译进行测试,注意需要根据测试的平台修改Makefile和选择对应的flashsdk.a。
Demo程序可将2个H264的录像文件逐帧读出,并同时发布到不同的rtmp地址上,只要能访问文件和网络,就可以进行测试,因此可以方便的在各种不同平台下进行测试和评估。
1.安装并运行FMS服务器
由于发布rtmp实时流需要FMS(FlashMediaService)服务器的支持,因此需要先安装FMS服务器免费开发版本。
请访问Adobe公司网页下载并安装FMS服务器,下载地址为:
https://www.adobe.com/cfusion/tdrc/index.cfm?loc=en%5Fus&product=flashmediaserver
注册帐号即可免费下载。
FMS服务器有WINDOWS和LINUX版本可供选择,用户可选择适合自己的安装。当然用户也可选择安装其他FMS服务器的开源替代产品。
安装完成后需要配置RTMP服务的端口,默认是1935。如果修改了默认端口,在发布流和播放流时,rtmp地址中需要包含实际端口。
2.编译运行demo程序
以PC LINUX为例,假设FLASHSDK解压缩后的目录为:/home/flashsdk
#cd /home/flashsdk/x86-linux/demo
#make clean
#make
#cd release
#./demo &
即可开始发布2路视频流。
注意,需要把h264.avi和h264cif.avi拷贝到/home/flashsdk/x86-linux/demo/release目录下,否则无法打开文件。
3.用测试网页播放FLASH视频
用浏览器打开flashplayer/example/index.hml即可播放发布的实时视频。
注意该网页同时播放两路视频流,用户需要根据自己的需要修改视频流参数,红色字体是用户需要修改的部分:
<script type="text/javascript" src='#'" /script>??????????
<!-- this A tag is where your Flowplayer will be placed. it can be anywhere -->????????
<a href="http://pseudo01.hddn.com/vod/demo.flowplayervod/flowplayer-700.flv"????????????
?style="display:block;width:640px;height:480px"????????????
?id="player">????????
</a>???????????
<!-- this will install flowplayer inside previous A- tag. -->????????
<script>????????????
?flowplayer("player","../flowplayer-3.2.7.swf",
?{
??clip:
??{
???url: 'h264',??
???live: true,???
???provider: 'northalley'
??},????????????????
??allowfullscreen : true,
??plugins:
??{
???northalley:
???{
????url: '../flowplayer.rtmp-3.2.3.swf',
???? ?netConnectionUrl:'rtmp://192.168.1.100:2935/live'
???}????????????????
??}????????????
?});??????????
</script>
<script type="text/javascript" src='#'" /script>??????????
<!-- this A tag is where your Flowplayer will be placed. it can be anywhere -->????????
<a href="http://pseudo01.hddn.com/vod/demo.flowplayervod/flowplayer-700.flv"????????????
?style="display:block;width:320px;height:240px"????????????
?id="player2">????????
</a>???????????
<!-- this will install flowplayer inside previous A- tag. -->????????
<script>????????????
?flowplayer("player2",
?{
??clip:
??{????????????????????
???url: 'h264cif',
???live: true,?????????????????
???provider: 'northalley'???????????????
??},the plugins node????????????????
??plugins:
??{??????????????????
???northalley:
???{????????????????????????
????url: '../flowplayer.rtmp-3.2.3.swf',??????????????????????????????????
????netConnectionUrl:'rtmp://192.168.1.100:2935/live'???????????????????
???}????????????????
??}????????????
?});??????????
</script>
例子中,对应到调用flash_session_create时传入的参数:
Server: 192.168.1.100
Port: 2935
Application: live
Stream: h264或者h264cif
五.注意问题
Demo版本是debug版本,文件较大。Release版本约300k左右。 Demo版本最多只能同时发布两路流。 Demo版本只能连续运行一段时间,时间到了之后将不会发流。 如需正式版本,请和我们联系。 如果在调用flash_session_setup时传输video_param中没有填入正确的pps和sps,那么发送视频流时,请确保至少发送一帧IDR帧,在I帧前面包含pps和sps数据,否则无法播放。 请确保音频和视频的时间戳是统一连续编码的,不要出现后面发送的数据时间戳还比前面发送的时间戳还小的情况。 Demo程序运行所需的h264.avi和h264cif.avi,有点大,未能一起打包上传,请联系我们索取。 ?