Android システムのオーディオおよびビデオ コーデックに関する深い理解: MediaCodec

メディア カーネルのソース コード

メディア カーネルは、オーディオとビデオの収集、コーデック、送信、再生などの機能を含む、Android システムでのオーディオとビデオの処理を担当するコア モジュールです。メディア カーネル ソース コードは、Android ソース ツリーの /frameworks/av ディレクトリにあり、主に次のモジュールが含まれています。

  • media/libstagefright: メディア フレームワークのコア コードが含まれており、さまざまなメディア ファイル形式のデコード、再生、およびエンコードのサポートを提供します。
  • media/libmedia: オーディオおよびビデオの収集、コーデック、送信など、オーディオおよびビデオ処理の基本機能を提供します。
  • media/libaudioclient: オーディオの録音および再生用のインターフェイスを含む、オーディオ サービス用のクライアント API を提供します。
  • media/libaudiohal: オーディオ デバイスの接続と制御を管理する、オーディオ ハードウェア抽象化レイヤーの実装を提供します。
  • media/libcamera: プレビュー、写真、ビデオ、その他の機能を含むカメラ サポートを提供します。
  • media/libstagefright-plugins: MP3、AAC、H.264 など、さまざまなメディア形式のサポート プラグインを提供します。
  • media/libstagefright-rtsp: ストリーミング メディア再生用の RTSP プロトコルのサポートを提供します。
  • media/libstagefright-wifi-display: ワイヤレス ディスプレイ用の Miracast プロトコルのサポートを提供します。
  • media/libmedia-scanner: メディア ファイルのスキャン機能を提供します。これは、デバイス上のメディア ファイルを自動的にスキャンし、メディア ライブラリに追加するために使用されます。

MediaCodec ソース コードの仕組み

MediaCodec は、Android システムでオーディオとビデオのエンコードとデコードを担当するコア クラスの 1 つで、オーディオとビデオ データのエンコードとデコードを実現できます。MediaCodec の基本的な実装には、多くの詳細とメカニズムが含まれます. MediaCodec ソース コードの主なメカニズムは次のとおりです。

  • データの入力と出力: MediaCodec は、ByteBuffer を入力および出力データのキャリアとして使用し、configure() メソッドを介して入力および出力形式を構成し、次に queueInputBuffer() メソッドを介して入力データをキューに入れます。出力データは出力キューに入れられ、その中で dequeueOutputBuffer() メソッドによって取り出されます。
  • コーデックの選択: MediaCodec は複数のコーデックをサポートしており、デバイスとシステムのバージョンによってサポートされるコーデックが異なる場合があるため、特定のデバイスとシステムのバージョンに応じてコーデックを選択する必要があります。
  • 状態制御: MediaCodec には、未初期化、構成済み、開始済み、停止済みなどの複数の状態があり、コーデックを開始するには start() メソッドを呼び出し、停止するには stop() メソッドを呼び出すなど、状態の切り替えと制御が必要です。コーデック待機。
  • コールバック通知: MediaCodec は、コーデックのステータス変化、入出力データのステータスなどを監視し、対応する処理を実行できるコールバック インターフェイスを提供します。
  • スレッド管理: MediaCodec はマルチスレッドを使用してデータのエンコードとデコードを行うため、スレッドのデッドロックの回避やスレッド切り替えの削減など、スレッドの管理と最適化が必要です。
  • 同時処理: MediaCodec は、複数の入力データと出力データの同時処理をサポートします。これには、入力バッファーと出力バッファーの数を設定し、入力データと出力データの間の競合を回避するなど、同時実行制御が必要です。
  • 構成パラメーター: MediaCodec は、より効率的なコーデック処理を実現するために、コード レート、解像度、フレーム レートなどの設定など、特定のコーデック要件に従ってパラメーターを構成する必要があります。

MediaCodec ソース メカニズム コードの実装と分析

以下は、単純な MediaCodec エンコーダーのコード例です。これにより、MediaCodec の基本的な使用法と基本的な実装原則を理解できます。

javaCopy codeMediaCodec mediaCodec = MediaCodec.createEncoderByType("video/avc");
MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", width, height);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitRate);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, frameRate);
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, iFrameInterval);
​
mediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
Surface inputSurface = mediaCodec.createInputSurface();
mediaCodec.start();
​
while (!eos) {
    int inputBufferIndex = mediaCodec.dequeueInputBuffer(-1);
    if (inputBufferIndex >= 0) {
        ByteBuffer inputBuffer = mediaCodec.getInputBuffer(inputBufferIndex);
        inputBuffer.clear();
        inputBuffer.put(data);
        mediaCodec.queueInputBuffer(inputBufferIndex, 0, data.length, 0, 0);
    }
​
    MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
    int outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, 0);
    if (outputBufferIndex >= 0) {
        ByteBuffer outputBuffer = mediaCodec.getOutputBuffer(outputBufferIndex);
        //处理编码后的输出数据
        mediaCodec.releaseOutputBuffer(outputBufferIndex, false);
    }
}
mediaCodec.stop();
mediaCodec.release();

この例では、最初に MediaCodec.createEncoderByType() メソッドを使用してビデオ エンコーダーを作成し、エンコード タイプを「video/avc」として指定します。次に、MediaFormat オブジェクトを作成して、ビデオの幅と高さ、ビット レート、フレーム レート、I フレーム間隔などの入出力データ形式とパラメーターを構成します。

次に、MediaCodec.configure() メソッドを使用して、エンコーダーをエンコード モードとして構成し、入力データの形式とパラメーターを設定して、入力データのキャリアとして Surface オブジェクトを作成します。次に、MediaCodec.start() メソッドを呼び出してエンコーダーを開始します。

while ループでは、入力データ キューからアイドル状態の入力データ バッファーを連続的に取り出し、入力データをバッファーに入れ、MediaCodec.queueInputBuffer() メソッドを介して入力データをエンコーダーに送信し、エンコード処理を行います。 . 同時に、出力データキューから符号化出力データバッファを連続的に取り出し、出力データを処理する。入力データと出力データがすべて処理されたら、MediaCodec.stop() メソッドを呼び出してエンコーダーを停止し、MediaCodec.release() メソッドでリソースを解放します。

一般に、上記のサンプル コードは、MediaCodec を介してビデオ データのエンコードと処理を実現します。これには、主に、データの入出力、エンコーダーの状態制御、コールバック通知、スレッド管理、同時処理、構成パラメーターなどの基本的な実装メカニズムが含まれます。この記事では、主にオーディオおよびビデオ開発における MediaCodec のソース コード分析を分析します。音声と映像の学習は非常に広く深い技術と言えるので、この記事はごく一部です。オーディオおよびビデオ コンテンツ技術の詳細については、 「オーディオおよびビデオ開発入門」を参照してください。このドキュメントには、オーディオおよびビデオ開発における何千もの技術的なポイントが含まれています。クリックすると、詳細なカテゴリを表示できます。

要約する

メディア カーネルは、Android オペレーティング システムの重要な部分であり、オーディオとビデオのコーデック、オーディオとビデオの再生、カメラなど、オーディオとビデオに関連する機能の処理を主に担当します。これは、Android オペレーティング システムでマルチメディア機能を実現するための基本的なドライバーおよびソフトウェア ライブラリです。

Android システムでは、メディア コアはオーディオ モジュール、ビデオ モジュール、カメラ モジュールなどの複数のモジュールで構成されています。その中で、オーディオモジュールは主にオーディオの入力、出力、および処理を担当し、さまざまなオーディオ形式のデコードおよびエンコード機能を実現し、ビデオモジュールは主にビデオの入力、出力、および処理を担当し、さまざまなビデオのデコードとエンコードをサポートします。フォーマット; カメラ モジュール カメラ ハードウェア インターフェイスを呼び出して画像データを取得し、処理することを主に担当します。

Media カーネルのコアは、Android オペレーティング システムのオーディオおよびビデオ コーデックの基盤となるコンポーネントである MediaCodec コーデックです。MediaCodec は、ハードウェア アクセラレーションを使用して、オーディオおよびビデオ コーデックの効率とパフォーマンスを向上させることができます。

Android システムでは、開発者は Media API を使用してメディア コアを操作し、オーディオとビデオの再生、オーディオとビデオの記録、リアルタイムのストリーミング メディア伝送など、オーディオとビデオに関連する機能を実装できます。

一般に、メディア コアは、Android オペレーティング システムにオーディオおよびビデオ関連の機能を実装するための重要な部分であり、MediaCodec コーデックおよび複数のモジュールを通じて、さまざまなオーディオおよびビデオ フォーマットの入力、出力、および処理を実現します。開発者は、Media API を介して操作および制御し、リッチなオーディオおよびビデオ アプリケーションを実現できます。

おすすめ

転載: blog.csdn.net/m0_71524094/article/details/130346288
おすすめ