オーディオとビデオの開発-FFmpeg

  オーディオとビデオの開発を見て組み合わせ、タイヤ蹴り、非常に複雑で、大規模な開発者のトピックであるOEIP(オープンソースプロジェクト)新しい例を。

  

    あなたは、SDLを使用して、FLV、MP4ファイルの種類、およびプロトコルRTMPのオーディオおよびビデオデータ、オーディオプレーヤーを開くことができます。

  

    小麦/混合音データの収集と情報収集が書かれており、ビデオメディアファイルやRMTP契約。

写真主な属性

  長さ/幅/チャンネル番号/ピクセルフォーマット(U8 / U16 / F32)、及びフォーマットRGBA / YUVの配列を含みます。前記OpenCVのと同様にピクセル形式のチャンネル、CV_8UC1 / CV_8UC4、チャネルフォーマットU8に4つのチャネルを示します。フォーマットは、単にそのような一般的にゲームテクスチャのために使用されるBGRA、BGR、R、RGBA / BGRとしてRGBAクラスに分け、配置されている/ R自体は、平均チャネルフォーマット、リヤコンビネーションRGBA32を表し、RGBAF32を表すために使用しましたピクセルデータフォーマットのチャネル。そして、YUVタイプ、メディアタイプは、一般的な、デバイス、オーディオおよびビデオファイルを集める2 YUVフォーマットの一部のようにスライドストリーミングとして、使用されています。まず、YUV420、YUV422、YUV444、その同じポイントとしてUVに対応する画素の数が画素Yに対応する点であり、差は、4つの画素に対応するYUV420 U / V、2つに対応するUV 422として表されます画素、UV444 UV画素に対応する点を示し、YUVピクセルデータフォーマットは一般U8あります。

  私たちは、最終的には1080のように、サイズがバイトを占有し、いくつかの一般的なフォーマットを比較することができます。

  • RGBA32 1920×1080×4 = 8294400 4の各ピクセルは、4つのRGBAチャンネルを含みます。
  • 大きさの前でYUV420 1920 * 1080 + 980 * 540 * 2は、UV占有サイズに続いて、Yによって占有しました。
  • + 980 * 1080 YUV422 1920 * 1080 * 2 Yは、UV占有サイズに続く、フロントのサイズによって占有されています
  • YUV444 1920×1080×3 YUV 3チャネルの各ピクセル。

  第二のフォーマットがソートされ、YUV420 YUV420I、YUV420P、YUV420SP(NV12)のように細分化することができ 、 単に、Pは別々に格納された3つのYUVを示すサフィックスであり、そしてYは別にSPであり、UVは絡み合って、Iさらに簡単、YUVは、同様の構成を単純に、絡み合って、およびRGBA形式。
YUV420P / YUV422Pは、一般的に、輝度Yは、人間の目の最も敏感な部分を表現するため、他のYのみ誰もが見ることができる、私が思うに、早期に黒と白のテレビをビデオファイルにプッシュとプルを使用し、ストリーミング、このフォーマットは、直接、最も便利と互換性がありますUV廃棄ライン、Y / U / Vは、メモリ分布の連続でなくてもよいです。前記YUV420I / YUV422Iデバイスは、一般加工容易にするために、連続的に、メモリの使用、YUV420SP(NV12)も、この単純なフォーマットをこの一般的なすべてのデバイスを収集して収集リーバ、唯一1つの便利なYの使用は、第二のUVであります次にバックALIGN、YUVはユニティであり、Yは、幅が均一であってもよく、メモリは、好都合には、連続的でもあります。

次のようにオーディオの基本的な性質があります

  サンプリングレート:人間の耳の最高周波数が22kHzであると聞いて、そのような完全に周波数を再現するように、サンプリングレートはそれほど一般的で、それは44100サンプルレートに共通で、周波数必要* 2です。

  チャンネル数:一般的なモノ、2チャンネルは、より珍しいチャネルもあります。

  データ形式:一般S16(16ビットの符号付きの統合)、F32(32ビット浮動小数点)は、他のU8、D64として使用されていない、これらの二つのデシベルの範囲が小さい、大きすぎるAで表されます。

  そして表現の画像タイプは、チャネルP(平面)、I(インターリーブ)は、同様に、オーディオデータは、典型的には、私は、P伝送、OEIP項目に、一般S16モノ適切なフォーマットに変換されている収集された複数のPまたはIを管理する必要はありません

オーディオとビデオの開発の基本的な考え方

  上記の基本的な理解では、私たちはいくつかの概念を教えて(間違っがある場合はここに私の基本的な理解のいくつかはある、と指摘して歓迎)。

  コーディング:オリジナルのオーディオおよびビデオデータの圧縮は、単に、サイズ1920×1080 1080PYUV420 * 3/2 = 3110400バイト、1秒、その後、約25フレーム78Mがあります。YUV-> H264、オーディオPCM-> ACC手順などの映像を符号化します。FFmpegのでは、同様のプロセスがAVFrame-> AVPacketあります

  復号化:圧縮されたオーディオおよびビデオデータをH264-> YUV、ACC-> PCMプロセス、元のオーディオとビデオに変換されます。FFmpegのではAVPacket-> AVFrameです。

  符号化及び復号化では、フレームあたりの画像が長さと幅、及びピクセルフォーマットをソートし、フレーム当たりの音声チャンネルに応じて、元の画像サイズ組成物の元のサイズに依存し、各サンプリング点の数は、AAC 1024(特別なあるようなコーデックの特定のために固定されています。 2048ケース)、MP3 1152の対応するフィールドはAVFrame.nb_sampesを示し、AVCodecContext.frame_sizeフレーム当たりのこのようなデュアルチャネルU16の量で、2 *はsizeof(U16)でAACのデータ* 1024は、符号化率及び品質を決定、通常の状況下では、レートの品質は良いですが、結果のファイルや職業、右のオンラインプレゼンテーション率のようなネットワーク、4M 1080P一般的な使用率の低下は、あなたが1Mラインを使用しますが、画像が時に移動してもよいです貼り付け、レート制御は、異なる制御戦略を持って、需要に基づいた独自の制御戦略を選択するために、インターネットのこの部分は、詳細な説明があります。

  メディアファイル:FLV / MP4異なるメディアフォーマットに、さまざまな方法で保存された情報を符号化するこれらの異なるメディアフォーマットが異なる符号化形式をサポートし、これはより一般的に、2つのコードの形式を使用しているので、ほとんどのメディアフォーマットは、H264 / ACCの符号化情報をサポート。

  マルチメディアプロトコル:RTMP / RTSPこれらの、ネットワーク伝送メディアファイルと制御パッケージに関する情報。

  オーディオ及びビデオストリーム:ストリームメディアファイルは、1つ以上のオーディオおよびビデオストリームを含むことを特徴とオーディオストリーム、ビデオストリーム、字幕ストリーム、等が挙げられる。これらの中に、各ビデオストリームは、同じ属性(長さと幅、ピクセルフォーマット、等)であります元のビデオストリームに符号化されたデータ。

  多重化:例えば、1つのメディアファイルにビデオストリームとオーディオストリームに多重化されています。

  以上のように、オーディオストリームとビデオストリームに対応したメディアファイルの分解:逆多重化。

FFmpegのメインターゲット

  AVFormatContext:マルチプロトコルやメディアファイル、および契約情報が契約に含まれているメディアファイルを解決するならば、校長は現在、読み取り/書き込みアーカイブ、読み取り/書き込みヘッドとファイル方式のファイルの終わりなどです。あなたは、メディアファイルであることを、オブジェクトの思考を置くことができます。

  AVCodec:コーデック、符号化と復号化、またはノート同じCodecIDを持つが、主な関数ポインタが含まれている別のオブジェクト、どのフレーム - >パケット/パケット交換>フレームを伝えます。

  AVCodecContext:コーデック環境は、簡単な言葉で、AVCodecはコーデックが、これは彼に、このような対応するビデオなどの適切な属性設定、長さと幅、ならびに対応するコード化されたセットは、Bフレームが含まれているを伝えることですかと言う、GOPは、どのくらいこのすべてであります私たちはAVCodecとAVCodecContextは、変数のAVCodecContextセットと同等である方法のAVCodecセットに相当し、クラス、であると仮定した場合には、理解することができます。

  AVStream:一般的なメディアファイル含む少なくとも一つのオーディオストリームまたはビデオストリーム、多重化/コーデック間の結びつきの関係を逆多重化します。あなたはAVStreamリスト情報は、オーディオとビデオのコーディングが含まれて理解することができます。AVStreamもAVCodecContextが背後に含まれる多重化し、そのコピーからそれを逆多重化の両方の情報を話す対応するコーデック情報が含まれています。

  AVFrame:オリジナルオーディオおよびビデオ情報を、固定長のデータを含みます。

  AVPacket:オーディオおよびビデオ符号化情報、可変長データを含みます。

FFmpegの共通API分析

  APIを解決するためのメディアファイル適切な処置を読みます。

  メディアファイル/プロトコルアドレスに応じてオープンAVFormatContext avformat_open_input。

  avformat_find_stream_infoオーディオ見つけるとビデオは、対応するインデックスAVFormatContextにストリーム。

  avcodec_find_decoderインデックスに従ってデコーダ対応するオーディオ及びビデオストリームを開きます。

  デコーダ環境デコーダavcodec_alloc_context3生成。

  デコーダ環境にコピーavcodec_parameters_to_contextストリーム復号化パラメータ(長さ及び画像、オーディオの幅、及びframe_sizeの基本的な特性)。

  オープンデコーダ環境avcodec_open2。

  av_read_frame各AVPacketは、メディアファイルAVFormatContextから読み取ります。

  インデックス対応AVPacket avcodec_send_packetは、ストリームをデコードする対応するデコーダを発行します。

  Bフレーム関係のでavcodec_receive_frame、ビデオストリームのように、デコードするデコーダPフレームを生データを取得し、一方は必ずしもそのような考慮の前後AVPacket AVFrame、Pフレームを取得していない、それは、いくつかのパケットの後の時間であってもよいですavcodec_send_packet / avcodec_receive_frame文言は、このような場合であるので、それは、より多くのデータフレームを読み出して。

  ライト動作の解析API(非IOモード)でメディアファイルに対応します:

  avformat_alloc_output_context2はAVFormatContextに対応するフォーマットに応じて、データフォーマットの固定された数は、時間ベースのオーディオストリームとビデオストリームはミリ秒かかるFLVフォーマットとして、異なるされている、私は、この値をオンにしようとした後avformat_write_header後に再び変更されます発生します。

  avcodec_find_encoder / avcodec_find_encoder_by_name彼らの希望エンコーダを選択してください。

  avcodec_alloc_context3選択したエンコーダは、我々は、このような画像符号化の長さと幅を知る必要があり、ビットレート、GOPおよび他の設定など、それぞれの情報を記入する必要があるプロセスを、復号上記異なる選択エンコーダ環境を生成します。

  オープンデコーダ環境avcodec_open2。

  avformat_new_stream AVFormatContextに対応するエンコーダにおいて、ビデオおよびオーディオストリーム情報、充填対応する生成。

  ストリームにエンコーダパラメータavcodec_parameters_from_contextコピーセット。

  解像度、及びポインタavio_open合意プロトコル、読み出しおよび書き込みプロトコル情報プロトコルヘッダ、プロトコル・コンテンツにどの。

  書き込みヘッダ情報avformat_write_header。

  エンコーダへの圧縮データの終わりをavcodec_send_frame。

  データは、パケットのシリーズを得るために、いくつかのフロントフレームであってもよい、avcodec_receive_packetコーディングデコードし、パケットを決定することは不可能Pフレームのようなフレームを取得します。

  av_interleaved_write_frameクロスライトのメディアファイルにエンコードされたオーディオおよびビデオデータ

  av_write_trailer書き込みは、すべてのデータに基づいて算出される値の充填部分が書き込まれ、終了します。

  IOモードを使用する場合もあり、キーフレーム画像データは、オーディオIOに直接書き込まれている利用し、その後等不明長さと幅を、ストリーミング直接ビデオに直接もたらしストリームから対応する音声およびビデオフレームの属性を読み出すことができます。

  違いは読み取りと書き込み、AVFormatContextすべてのストリームから得られた情報を復号化ストリームを読み出すために、持っているメディアファイル内の情報を読み取るためにAPIから分かるように、デコーダが開き、AVFormatContext、パケットをデコードするデコーダからの各パケットを読み出します。メディアファイルがAVFormatContextに空白を生成することで記述し、選択したエンコーダを開いて、ストリームを生成し、フレームあたりのデータ・ストリーム、ファイルを使用して確定エンコーダエンコードを書き込みます。

  関連ピットは、画像メディアファイルは、一般的にP YUVフォーマット、YUVフォーマット記憶部、ならびに対応する整列の概念で使用され、例えば、あなたが広い1080であると仮定するが、YUVブロックにおいて、Yは幅であるかもしれません1088、(セットフラッシュ32の使用をしたと仮定して)前記インデックスのデータの各行画像はGPU全体のプロセスに必要なタイトに私OEIP処理、OEIP画像データで提案される処理のすべてに対応し、1080から1087までゼロパディングハッシュデータは、av_image_copy_to_buffer / av_image_fill_arraysプロセスを使用する必要があります。

  Pフォーマット関連ピット、マルチチャンネルオーディオのメディアファイルは、使用されているが、一般的な使用のI形式のオーディオキャプチャおよび再生機器で、ライン上のいくつかのAPIコールにSDLライブラリを使用して一般的な使用swr_convertコンバータ、オーディオプレーヤーので、これは、あなたが処理中OEIPコードを表示することができ、オーディオキャプチャWinodwsはWASAPIを使うと言うことではありません。

  時間ベースのコンセプトは:それはMP4であれば、オーディオおよびビデオストリームの概念は、時間ベースを持って、より重要なのは、FLVのオーディオおよびビデオは(1、1000)され、時間ベースのビデオは、一般的にあるオーディオ、(1,90000)であります対応サンプリングレート。時間ベースは、あなたは、単に一秒スケールとして理解することができ、FLVストリーム対応はミリ秒、およびミリ秒の1/90に相当する時間ベースのMP4ビデオストリームである、などのFLVで25のフレームのビデオ対応としてどのような意味、 、フレームごとに、40時間のグループによって分離し、MP4に、コーディング、我々はOEIP内で変換留意時間ベースユニットを、対応frams / DTS /時間にPTSを必要とするとき、360タイムベースを分離した場合我々は、すべて判明/ユーザに関連転送のすべての時間をミリ秒単位で、私たち自身の内部プロセスを変換しています。

  したがって、このOEIPは、メディアファイル/プロトコルを入力と出力の利用可能なソースを追加し、同様に、それらは容易にそのような対応するプロトコルでメディアファイル/コンテンツ提示直接Unity3D / UE4レーンにTexture2DとしてUnity3D / UE4レーンを表示さディスプレイ、またはビデオに格納されているにTexture2D / RTTデータにUnity3D / UE4、または押し出します。

  参考:
  https://www.cnblogs.com/leisure_chn/category/1351812.html葉以上FFmpegの開発よりも

おすすめ

転載: www.cnblogs.com/zhouxin/p/12651304.html