概要
OpenHarmony v5.0以降、メディアサービス層からGStreamerエンジンが除外され、再生や録画などのメディアデータパイプライン処理にはHistreamerエンジンが本格的に採用されている。Histreamerが利用するプラグインやフィルターはすべてAVCodecモジュールに配置されているため、マルチメディアシステムにおける同モジュールの重要性がさらに高まっている。本稿では、OpenHarmony v5.0-Beta1におけるAVCodecモジュールの主なアップデート内容と、アプリケーション側の実装フローについて解説する。
v5.0-Beta1 主な更新一覧
- APEオーディオのデコードおよびデマルチプレクス対応
- MP3オーディオのエンコードおよびマルチプレクス対応
- SRT形式の字幕解析対応
- H.264/H.265ハードウェアエンコード時の長期参照フレーム設定対応(フレーム単位、ハードウェア依存)
- H.264/H.265ハードウェアエンコード時のQP(量子化パラメータ)設定対応(フレーム単位、ハードウェア依存)
- H.264/H.265ハードウェアエンコーダ/デコーダの低遅延フレーム出力(One-in-One-out)対応(ハードウェア依存)
- H.264/H.265ハードウェアエンコード時の動的ビットレート・フレームレート変更対応(ハードウェア依存)
- H.264/H.265ハードウェアエンコード時の階層的Pフレーム(Temporal Scalability)対応(ハードウェア依存)
- fMP4コンテナの解析対応
- Surfaceモードにおけるハードウェアデコード中のSurface動的切替対応
各機能の詳細と実装
1. APEデコードとデマルチプレクス
Monkey's Audioによるロスレス圧縮フォーマットであるAPEのデコードおよび分離機能が追加された。システムサービス層ではFFmpegを利用して実装されている。
定義済みのMIMEタイプおよびデコーダ名は以下の通り。
const char* APE_AUDIO_MIME = "audio/x-ape";
const char* APE_AUDIO_DECODER_ID = "OH.Media.Codec.Decoder.Audio.Ape";
デコーダの生成例:
// MIMEタイプを指定して生成
auto decoderHandle = OH_AudioCodec_CreateByMime(APE_AUDIO_MIME, false);
// またはデコーダ名を指定して生成
auto decoderHandle = OH_AudioCodec_CreateByName(APE_AUDIO_DECODER_ID);
デコード制限事項として、インスタンス作成後にサンプリングレート、チャンネル数、サンプリングフォーマットを設定する必要がある。対応チャンネル数はモノラルおよびステレオ(1〜2)のみである。
2. MP3エンコードとマルチプレクス
MP3オーディオのエンコード機能とコンテナへの多重化機能がサポートされた。エンコードにはLAMEエンコーダが、マルチプレクスにはFFmpegが使用されている。
定義済みのMIMEタイプおよびエンコーダ名:
const char* MPEG_AUDIO_MIME = "audio/mpeg";
const char* MP3_AUDIO_ENCODER_ID = "OH.Media.Codec.Encoder.Audio.Mp3";
エンコーダの生成例:
auto encoderHandle = OH_AudioCodec_CreateByMime(MPEG_AUDIO_MIME, true);
// または
auto encoderHandle = OH_AudioCodec_CreateByName(MP3_AUDIO_ENCODER_ID);
エンコード時の制限事項として、サンプリングレート、チャンネル数、サンプリングフォーマット、ビットレートの設定が必須。チャンネル数は1〜2、サンプリングフォーマットはS16LEのみサポートされる。また、ビットレートとサンプリングレートは以下の許容リスト内の値である必要がある。
const int32_t VALID_BITRATES[] = {8000, 16000, 32000, 40000, 48000, 56000,
64000, 80000, 96000, 112000, 128000, 160000,
192000, 224000, 256000, 320000};
const int32_t VALID_SAMPLE_RATES[] = {8000, 11025, 12000, 16000, 22050,
24000, 32000, 44100, 48000};
マルチプレクスの生成例:
OH_AVMuxer* avMuxer = OH_AVMuxer_Create(targetFd, AV_OUTPUT_FORMAT_MP3);
マルチプレクス作成後、MP3オーディオトラックのみを追加可能であり、以降の通常フローでデータをコンテナに書き込む。
3. SRT形式の外掛字幕
SRT字幕はテキストベースのフォーマットであり、字幕番号、表示開始・終了時間、字幕テキスト、空白行の4要素で構成される。
1
00:00:01,000 --> 00:00:03,500
Hello World
2
00:00:04,000 --> 00:00:06,000
OpenHarmony
デマルチプレクスを用いた解析例:
int32_t srtFileDescriptor = open("subtitles.srt", O_RDONLY);
OH_AVSource* avSource = OH_AVSource_CreateWithFD(srtFileDescriptor, 0, fileSize);
OH_AVDemuxer* srtDemuxer = OH_AVDemuxer_CreateWithSource(avSource);
現在のBeta1では外部公開ヘッダの定義が不十分なため、ネイティブインターフェース経由で字幕データを正常に取得できない可能性がある。将来的には、AVPlayerの`addSubtitleFdSrc`を通じて外掛字幕を設定し、Histreamerエンジンがパースした字幕データを`subtitleTextUpdate`コールバック経由でアプリケーションに通知する仕組みが提供される予定である。
4. 長期参照フレーム設定
H.264/H.265のハードウェアエンコードにおいて、長期参照フレーム(Long-Term Reference Frame)をフレーム単位で指定できるようになった。これにより、エンコード効率とエラー耐性の向上が期待できる。
5. QP(量子化パラメータ)設定
エンコード時のQP最大値・最小値の動的設定が可能になった。この設定は全体設定としてだけでなく、フレーム単位での即時反映もサポートする。
動的設定の実装例:
OH_AVFormat* qpConfig = OH_AVFormat_Create();
OH_AVFormat_SetIntValue(qpConfig, OH_MD_KEY_VIDEO_ENCODER_QP_MAX, maxQpValue);
OH_AVFormat_SetIntValue(qpConfig, OH_MD_KEY_VIDEO_ENCODER_QP_MIN, minQpValue);
OH_VideoEncoder_SetParameter(videoEncoder, qpConfig);
6. フレーム単位の属性設定
長期参照フレームやQPといったパラメータをフレーム単位で設定するための新しいAPIが追加された。Surface入力モードにおいて、入力バッファ生成時にコールバックを呼び出し、そのフレーム特有のパラメータを設定できる。
void OnFrameParameterRequired(OH_AVCodec* codecCtx, uint32_t bufferIdx, OH_AVFormat* frameParam, void* appData) {
// フレーム固有のパラメータを設定
OH_AVFormat_SetIntValue(frameParam, OH_MD_KEY_VIDEO_ENCODER_QP_MAX, targetMaxQp);
OH_AVFormat_SetIntValue(frameParam, OH_MD_KEY_VIDEO_ENCODER_QP_MIN, targetMinQp);
// エンコーダにパラメータ設定完了を通知
OH_VideoEncoder_PushInputParameter(codecCtx, bufferIdx);
}
// コールバックの登録
OH_VideoEncoder_RegisterParameterCallback(videoEncoder, OnFrameParameterRequired, nullptr);
アーキテクチャ上の動作としては、Surfaceから入力フレームを取得した際にアプリケーションへコールバックが発生し、`PushInputParameter`の呼び出し後にプロパティがカプセル化されてOMXに渡される。OMXレイヤーでは、`OMX_EmptyThisBuffer`呼び出し時にバッファヘッダのプライベート領域へパラメータが設定される。
7. 低遅延フレーム出力
ハードウェアエンコード/デコードにおいて、1フレーム入力ごとに1フレームを出力する低遅延モード(One-in-One-out)がサポートされた。この設定は初期化時のみ有効である。
OH_AVFormat* lowLatencyFormat = OH_AVFormat_Create();
OH_AVFormat_SetIntValue(lowLatencyFormat, OH_MD_KEY_VIDEO_ENABLE_LOW_LATENCY, 1);
OH_VideoDecoder_Configure(videoDecoder, lowLatencyFormat);
チップセット側の実装としては、`OMX_SetParameter`を通じて拡張インデックス`OMX_IndexParamLowLatency`を設定することで実現される。
8. 動的ビットレートとフレームレートのリセット
エンコード処理の実行中に、動的にビットレートとフレームレートを変更できるようになった。
OH_AVFormat* dynamicFormat = OH_AVFormat_Create();
OH_AVFormat_SetLongValue(dynamicFormat, OH_MD_KEY_BITRATE, updatedBitrate);
OH_AVFormat_SetDoubleValue(dynamicFormat, OH_MD_KEY_FRAME_RATE, updatedFramerate);
OH_VideoEncoder_SetParameter(videoEncoder, dynamicFormat);
9. 階層的Pフレームエンコード
グローバル時域スケーラビリティ(Temporal Scalability)に基づく階層的Pフレームエンコードがサポートされた。これはシンプルで安定した時間階層構造を構築する際に有効である。
10. fMP4コンテナの解析
Fragmented MPEG-4(fMP4)の解析機能が追加された。システムサービス層ではFFmpegを用いて実装されている。この機能は、将来的なDASHプロトコルによるストリーミング再生拡張への布石となる。
11. デコード中のSurface動的切替
ハードウェアデコードの実行中であっても、`OH_VideoDecoder_SetSurface`を呼び出すことで出力先のSurfaceを動的に切り替えることが可能になった。切り替え後も描画は継続して正常に行われる。