ffplay元アドレス:http://ffmpeg.org/doxygen/trunk/ffplay_8c_source.html
2つのキューはPacketQueue、FrameQueue、分析や説明のためのAVPacketとAVFrameキューにLETの関係がありffplayます。
A、AVPacket AVFrame構造と意味
AVPacket
圧縮されたデータを格納するために、圧縮されたデータは、オーディオ、圧縮映像データと字幕データ圧縮を含みます。これは、圧縮されたデータを格納する多重分離操作で通常であり、復号器への入力として渡されます。またはエンコーダからの出力は、マルチプレクサに渡されます。ビデオデータ圧縮のために、AVPacketは、典型的にはビデオフレームを含みます。圧縮されたオーディオデータの場合、圧縮されたオーディオは、いくつかのフレームを含むことができます。
AVFrame
デコードされた音声や映像データの場合は保存されています。AVFrameはav_frame_freeを通して放出av_frame_alloc、によって割り当てられなければなりません。
両者の関係
av_read_frame得られた圧縮されたデータは、一般に、3つの圧縮パケット(ビデオ、オーディオ、及びサブタイトル)、AVPacketで表されるがあり、AVPacketをパケット。
その後AVPacketへのコールavcodec_send_packetとavcodec_receive_frameはAVFrameをデコードします。
注:当初からFFmpegの3.xでは、avcodec_decode_video2はavcodec_send_packetとavcodec_receive_frameに置き換えられ、放棄されました。
二、ffplayキューの関係
3 ffplay PacketQueueがありますが、各ビデオパケットキューは、パケット、オーディオパケットおよび字幕キューのキューです。
したがって、3種類のFrameQueue、ビデオ・フレーム・キュー、オーディオおよび字幕フレームキューフレーム・キューがあります。
初期化は、それぞれ、ワークキューstream_open関数で実行される、初期化動作がpacket_queue_initのframe_queue_initによって行われます。手動初期化PacketQueue AVPacket割り当て構造なしで、なおが、直接復号プロセスAVPacketに使用。FrameQueueではav_frame_alloc AVFrame構造によって手動で割り当てられます。
read_thread機能、av_read_frame関数を介してリードデータパケットに、次にAVPacket packet_queue_putコールはPacketQueueに加えます。
video_thread関数では、データはget_video_frame機能、FrameQueueに添加し、次いでコールqueue_pictureのAVFrameによるリードフレームです。
そして、2つのキューは、それをリンクする方法ですか?あなたはread_thread機能を解析することによって知ることができます。
まず、必要な逆多重化および復号化するデータ構造を作成します。その後、3つのデータは、各オープンstream_component_open機能を通じてストリーミング。最後に、データパケットは、別々av_read_frameによって対応PacketQueueに加え逆多重化されます。stream_component_open機能において、ワークを復号するためのffplayは、具体的キューはdecoder_init関数によってPacketQueueを指定するPacketQueue入力を参照している、デコーダ、デコーダ構造は、キューの部材を有するデータ構造をセットアップ作業を復号化するための主な原因です。この作品は、stream_component_open中で行われます。指定した後PacketQueue復号機能はPacketQueue AVFrame構造からget_video_frame、そして最後queue_pictureのFrameQueue機能により得られた復号されたフレームに加えました。