FlashSDK使用说明书

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,
&param->video_param,
&param->audio_param,
&param->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,有点大,未能一起打包上传,请联系我们索取。
 

你可能感兴趣的:(Flash,RTMP,h264,fms,aac)