すべてのプロダクト
Search
ドキュメントセンター

:HLS基本インターフェイス

最終更新日:Dec 22, 2023

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を介して直接ビデオを視聴できます。