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, unsigned char *data, int len, 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, frame, len, 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", "../flowplayer-3.2.7.swf",
{
clip:
{
url: 'h264cif',
live: true,
provider: 'northalley'
},
allowfullscreen : true, 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,有点大,未能一起打包上传,请联系我们索取。