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;
    说明
    • 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);
    说明 示例代码请参考 GitHub
  • 关闭HLS stream文件
    /**
     *  @brief  关闭HLS stream文件
     */
    int oss_media_hls_stream_close(oss_media_hls_stream_t *stream);
    说明 示例代码请参考 GitHub
  • 写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");
    }
    说明
    • 目前的录播、直播接口都支持只有视频、只有音频或同时有音视频等。您可以通过示例程序观看效果。
    • 示例代码请参考GitHub
    • 目前仅提供初级的录播、直播接口。如果您有高级需求,建议模拟这两个接口,并使用基础接口自助实现高级定制功能。