开发者社区> 问答> 正文

Media-C-SDK之如何实现HLS封装接口?

OSS MEDIA C SDK 客户端部分支持将接收到的H.264、AAC封装为TS、M3U8格式后写入OSS,除了基础接口外,还提供封装好的录播、直播接口。

接口


HLS相关封装接口都位于oss_media_hls_stream.h中,目前提供的接口有:

  • oss_media_hls_stream_open
  • oss_media_hls_stream_write
  • oss_media_hls_stream_close

下面详细介绍各个接口的功能和注意事项

基础结构体介绍/**
*  OSS MEDIA HLS STREAM OPTIONS的描述信息
*/
typedef struct oss_media_hls_stream_options_s {
    int8_t is_live;
    char *bucket_name;
    char *ts_name_prefix;
    char *m3u8_name;
    int32_t video_frame_rate;
    int32_t audio_sample_rate;
    int32_t hls_time;
    int32_t hls_list_size;
} oss_media_hls_stream_options_t;
/**
*  OSS MEDIA HLS STREAM的描述信息
*/
typedef struct oss_media_hls_stream_s {
    const oss_media_hls_stream_options_t *options;
    oss_media_hls_file_t *ts_file;
    oss_media_hls_file_t *m3u8_file;
    oss_media_hls_frame_t *video_frame;
    oss_media_hls_frame_t *audio_frame;
    oss_media_hls_m3u8_info_t *m3u8_infos;
    int32_t ts_file_index;
    int64_t current_file_begin_pts;
    int32_t has_aud;
    aos_pool_t *pool;
} oss_media_hls_stream_t;




[backcolor=transparent]注:
  • is_live,是否是直播模式,直播模式的时候M3U8文件里面只最新的几个ts文件信息
  • bucket_name,存储HLS文件的存储空间名称
  • ts_name_prefix,TS文件名称的前缀
  • m3u8_name,M3U8文件名称
  • video_frame_rate,视频数据的帧率
  • audio_sample_rate,音频数据的采样率
  • hls_time,每个ts文件最大持续时间
  • hls_list_size,直播模式时在M3U8文件中最多保留的ts文件个数


打开HLS stream文件/**
*  @brief  打开一个oss hls文件
*  @param[in]  auth_func   授权函数,设置access_key_id/access_key_secret等
*  @param[in]  options     配置信息
*  @return:
*      返回非NULL时成功,否则失败
*/
oss_media_hls_stream_t* oss_media_hls_stream_open(auth_fn_t auth_func,
                        const oss_media_hls_stream_options_t *options);




[backcolor=transparent]注:


关闭HLS stream文件/**
*  @brief  关闭HLS stream文件
*/
int oss_media_hls_stream_close(oss_media_hls_stream_t *stream);




[backcolor=transparent]注:


写HLS stream文件/**
*  @brief  写入视频和音频数据
*  @param[in]  video_buf 视频数据
*  @param[in]  video_len 视频数据的长度,可以为0
*  @param[in]  audio_buf 音频数据
*  @param[in]  audio_len 音频数据的长度,可以为0
*  @param[in]  stream    HLS stream
*  @return:
*      返回0时表示成功
*      否则, 表示出现了错误
*/
int oss_media_hls_stream_write(uint8_t *video_buf,
                               uint64_t video_len,
                               uint8_t *audio_buf,
                               uint64_t audio_len,
                               oss_media_hls_stream_t *stream);




示例程序: static void write_video_audio_vod() {
    int ret;
    int max_size = 10 * 1024 * 1024;
    FILE *h264_file, *aac_file;
    uint8_t *h264_buf, *aac_buf;
    int h264_len, aac_len;
    oss_media_hls_stream_options_t options;
    oss_media_hls_stream_t *stream;
    /* 设置HLS stream的参数值 */
    options.is_live = 0;
    options.bucket_name = "<your buckete name>";
    options.ts_name_prefix = "vod/video_audio/test";
    options.m3u8_name = "vod/video_audio/vod.m3u8";
    options.video_frame_rate = 30;
    options.audio_sample_rate = 24000;
    options.hls_time = 5;
    /* 打开HLS stream */
    stream = oss_media_hls_stream_open(auth_func, &options);
    if (stream == NULL) {
        printf("open hls stream failed.\n");
        return;
    }
    /* 创建两个buffer用来存储音频和视频数据 */
    h264_buf = malloc(max_size);
    aac_buf = malloc(max_size);
    /* 读取一段视频数据和音频数据,然后调用接口写入OSS */
    {
        h264_file = fopen("/path/to/video/1.h264", "r");
        h264_len = fread(h264_buf, 1, max_size, h264_file);
        fclose(h264_file);
        aac_file = fopen("/path/to/audio/1.aac", "r");
        aac_len = fread(aac_buf, 1, max_size, aac_file);
        fclose(aac_file);
        ret = oss_media_hls_stream_write(h264_buf, h264_len,
                aac_buf, aac_len, stream);
        if (ret != 0) {
            printf("write vod stream failed.\n");
            return;
        }
    }
    /* 再读取一段视频数据和音频数据,然后调用接口写入OSS */
    {
        h264_file = fopen("/path/to/video/2.h264", "r");
        h264_len = fread(h264_buf, 1, max_size, h264_file);
        fclose(h264_file);
        aac_file = fopen("/path/to/audio/1.aac", "r");
        aac_len = fread(aac_buf, 1, max_size, aac_file);
        fclose(aac_file);
        ret = oss_media_hls_stream_write(h264_buf, h264_len,
                aac_buf, aac_len, stream);
        if (ret != 0) {
            printf("write vod stream failed.\n");
            return;
        }
    }  
    /* 写完数据后,关闭HLS stream */
    ret = oss_media_hls_stream_close(stream);
    if (ret != 0) {
        printf("close vod stream failed.\n");
        return;
    }
    /* 释放资源 */
    free(h264_buf);
    free(aac_buf);
    printf("convert H.264 and aac to HLS vod succeeded\n");
}


[backcolor=transparent]注:
  • 目前的录播、直播接口都支持只有视频,只有音频,同时有音视频等。
  • 示例代码参考:GitHub
  • 目前的录播、直播接口比较初级,用户如果有高级需求,可以模拟这两个接口,使用基础接口自助实现高级定制功能。
  • 可以通过示例程序观看效果

展开
收起
青衫无名 2017-10-19 14:57:33 1971 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
从 SDK 到编解码:视频直播架构解析 立即下载
跨平台的云服务SDK需要什么 立即下载
一个跨平台的云服务SDK需要什么 立即下载