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
- 目前的錄播、直播介面比較初級,使用者如果有進階需求,可以模擬這兩個介面,使用基礎介面自助實現進階定製功能。
- 可以通過樣本程式觀看效果