OSS MEDIA C SDKクライアントは、受信したH.264またはAAC形式のデータをTSまたはM3U8形式にパッキングし、データをOSSに書き込むことをサポートしています。 ビデオを表示し、対応するM3U8アドレスからオーディオを聴くことができます。
インターフェイス
HLS関連の基本インターフェイスはすべてoss_media_hls.hにあります。 現在提供されるインターフェイスは次のとおりです。
- oss_media_hls_open
- oss_media_hls_write_frame
- oss_media_hls_begin_m3u8
- oss_media_hls_write_m3u8
- oss_media_hls_end_m3u8
- oss_media_hls_flush
- oss_media_hls_close
さまざまなインターフェイスの使用に関する機能と注意事項は次のとおりです。
- 基本構造体
/** * OSS MEDIA HLSフレームメタデータ * / typedef struct oss_media_hls_frame_s { stream_type_t stream_type; frame_type_t frame_type; uint64_t pts; uint64_t dts; uint32_t continuity_counter; uint8_tキー: 1; uint8_t * pos; uint8_t * end; } oss_media_hls_frame_t; /** * OSS MEDIA HLSの説明情報 * / typedef struct oss_media_hls_options_s { uint16_t video_pid; uint16_t audio_pid; uint32_t hls_delay_ms; uint8_t暗号化: 1; char key[OSS_MEDIA_HLS_ENCRYPT_KEY_SIZE]; file_handler_fn_t handler_func; uint16_t pat_interval_frame_count; } oss_media_hls_options_t; /** * OSSメディアHLSファイルの説明情報 * / typedef struct oss_media_hls_file_s { oss_media_file_t * ファイル; oss_media_hls_buf_t * バッファ; oss_media_hls_options_tオプション; int64_t frame_count; } oss_media_hls_file_t;
説明- stream_type: ストリームタイプ。 現在、st_h264およびst_aac型がサポートされています。
- frame_type: フレームタイプ。 現在、ft_non_idr、ft_idr、ft_sei、ft_sps、ft_pps、ft_audがサポートされています。
- pts: 表示タイムスタンプ。
- dts: デコードタイムスタンプ。
- continuity_counter: 増分カウンタ。 値は0〜15の範囲ですが、開始値は必ずしも0ではありません。 値は連続している必要があります。
- key: キーフレームかどうか。
- pos: 現在のフレームデータの開始位置 (両端を含む) 。
- end: 現在のフレームデータの終了位置 (排他) 。
- video_pid: ビデオPID。
- audio_pid: オーディオPID。
- hls_delay_ms: 表示レイテンシ (ミリ秒) 。
- encrypt: AES-128暗号化を使用するかどうか。 現在、AES-128暗号化はサポートされていません。
- key: 暗号化が有効になっているときのキー。 現在、この機能はサポートされていません。
- handler_func: オブジェクト操作のコールバック関数。
- pat_interval_frame_count: 2つの挿入PATまたは2つの挿入MATテーブル間のフレーム数。
- HLSファイル
を開く /** * @ brief OSS HLSファイルを開く * @ param[in] bucket_name ossにオブジェクトを格納するバケットの名前 * @ param[in] object_key oss内のオブジェクトの名前 * @ param[in] auth_func access_key_id/access_key_secretを設定する権限付与関数 * @return * NULLが返された場合は、成功を示します。 それ以外の場合は、失敗を示します。 * / oss_media_hls_file_t * oss_media_hls_open(char * bucket_name, char * object_key, auth_fn_t auth_func);
説明 完全なコードについては、『GitHub』をご参照ください。 - HLSファイル
を閉じる /** * @ brief OSS HLSファイルを閉じる * / int oss_media_hls_close(oss_media_hls_file_t * ファイル);
説明 完全なコードについては、『GitHub』をご参照ください。 - HLSファイル
の書き込み /** * @ brief H.264またはAAC形式のデータのフレームをOSSに書き込む * @ param[in] フレームH.264またはAAC形式のデータのフレーム * @ param[out] ファイルhlsファイル * @ return: * 0が返された場合は、操作が成功したことを示します。 * それ以外の場合は、エラーが発生したことを示します。 * / int oss_media_hls_write_frame(oss_media_hls_frame_t * frame, oss_media_hls_file_t * file);
プロジェクトの例:
static void write_frame(oss_media_hls_file_t * file) { oss_media_hls_frame_tフレーム; FILE * file_h264; uint8_t * buf_h264; int len_h264, i; int cur_pos = -1; int last_pos = -1; int video_frame_rate = 30; int max_size = 10*1024*1024; char * h264_file_name = "/path/to/example.h264"; /* H.264ファイルを読み取る * / buf_h264 = calloc(max_size, 1); file_h264 = fopen(h264_file_name, "r"); len_h264 = fread(buf_h264, 1, max_size, file_h264); /* フレーム構造を初期化する * / frame.stream_type = st_h264; frame.pt s = 0; frame.continuity_counter = 1; frame.key = 1; /* H.264データを変換し、すべてのフレームのデータを抽出してから、データをOSSに書き込みます * / for (i = 0; i < len_h264; i ++) { /* 現在の位置が次のフレームのデータの開始点、つまり現在のフレームの終わりであるかどうかを判断する * / if ((buf_h264[i] & 0x0F)==0x00 && buf_h264[i + 1]==0x00 && buf_h264[i + 2]==0x00 && buf_h264[i + 3]==0x01) { cur_pos = i; } /* 完全なフレームのデータを取得できる場合は、インターフェイスを呼び出してデータをHLS形式に変換し、データをOSSに書き込みます * / if (last_pos != -1 && cur_pos > last_pos) { frame.pt s += 90000 / video_frame_rate; frame.dts = frame.pt s; frame.pos = buf_h264 + last_pos; frame.end = buf_h264 + cur_pos; oss_media_hls_write_frame(&frame, file); } last_pos = cur_pos; } /* オブジェクトを閉じてリソースを解放する * / fclose(file_h264); フリー (buf_h264); }
説明- 完全なコードについては、『GitHub』をご参照ください。
- Access Unit Delimiter NAL (00 00 00 01 09 xx) がH.264データにない場合、このNALが必要です。 それ以外の場合、オーディオまたはビデオはiPad、iPhone、またはSafariで再生できません。
- H.264フレームは、0xX0、0x00、0x00、および0x01によって分離される。 AACフレームは0xFFと0x0Xで分離されます。
- 現在のフレームがキーフレームである場合、フレーム。 キーは1に設定する必要があります。
- M3U8オブジェクト
の書き込み /** * @ brief M3U8オブジェクトのヘッダーデータを書き込む * @ param[in] max_duration TSオブジェクトの最大期間 * @ param[in] sequence TSオブジェクトの開始番号 * @ param[out] ファイルM3U8ファイル * @ return: * 0が返された場合は、操作が成功したことを示します。 * それ以外の場合、「-1」が返された場合は、エラーが発生したことを示します。 * / void oss_media_hls_begin_m3u8(int32_t max_duration、 int32_tシーケンス、 oss_media_hls_file_t * ファイル); /** * @ brief M3U8オブジェクトのデータを書き込む * @ param[in] サイズM3U8アイテムの数 * @ param[in] m3u8 M3U8アイテムの詳細 * @ param[out] ファイルM3U8ファイル * @ return: * 0が返された場合は、操作が成功したことを示します。 * それ以外の場合、「-1」が返された場合は、エラーが発生したことを示します。 * / int oss_media_hls_write_m3u8(intサイズ、 oss_media_hls_m3u8_info_t m3u8[], oss_media_hls_file_t * ファイル); /** * @ brief M3U8オブジェクトターミネータなどのデータの書き込み * @ param[out] ファイルM3U8ファイル * / void oss_media_hls_end_m3u8(oss_media_hls_file_t * ファイル);
プロジェクトの例:
static void write_m3u8() { char * bucket_name; char * key; oss_media_hls_file_t * ファイル; bucket_name = "<バケット名>"; key = "<あなたのm3u8ファイル名>"; /* HLSオブジェクトを開いてM3U8-formatデータを書き込みます。 オブジェクト名は ".m3u8" * /で終わる必要があります。 file = oss_media_hls_open(bucket_name, key, auth_func); if (file == NULL) { printf("open m3u8 file[% s] failed.", key); return; } /* 3つのTSオブジェクトの情報を構築する * / oss_media_hls_m3u8_info_t m3u8[3]; m3u8[0].duration = 9; memcpy(m3u8[0].url、"video-0.ts" 、strlen("video-0.ts")); m3u8[1].duration = 10; memcpy(m3u8[1].url、"video-1.ts" 、strlen("video-1.ts")); /* M3U8オブジェクトへの書き込み oss_media_hls_begin_m3u8(10, 0, ファイル); oss_media_hls_write_m3u8(2, m3u8, ファイル); oss_media_hls_end_m3u8 (ファイル); /* HLSオブジェクトを閉じる * / oss_media_hls_close (ファイル); printf (「m3u8をossファイルに書き込む」); }
説明- M3U8 V3は現在使用されています。
- 記録シナリオでは、ターミネータを書き込むために、記録の最後にoss_media_hls_end_m3u8 (ファイル) インターフェイスが呼び出されます。 さもなければ、ビデオは再生できない。 ライブビデオのシナリオでは、このインターフェイスを呼び出すことはできません。
- 完全なコード例については、『GitHub』をご参照ください。
- サンプルプロジェクトで効果を表示できます。
- VLC Playerを介して、iPhone、iPad、およびMacデバイスでSafariを介して直接ビデオを視聴できます。