ffmpeg の紹介 - ffmpeg はどのようにトランスコードしますか?

ビデオはどのように再生されますか?

現在のプレイヤーのほとんどが ffmpeg 二次開発に基づいていることがわかっています。プレーヤーでビデオを開いたときに、画像がどのように表示され、音がどのように聞こえるかについて考えたことはありますか?

この図を使用して、再生中のビデオの流れを説明します。

下の図の意味を少し説明します。

  1. カプセル化解除: プレーヤーは入力カプセル化形式 (mp4、mkv) のデータを分離して、オーディオ ストリームとビデオ ストリームの 2 つの部分を生成します. データのこれら 2 つの部分は、シャントと同様に、現時点では圧縮データのみであることに注意してください.動画ファイルからオーディオとビデオを抽出します。
  2. 次のステップはデコード操作です. デコードとは、ビデオとオーディオのエンコードされたデータを圧縮されていないビデオとオーディオの生データにデコードすることです. ここでは、オーディオは pcm 形式のデータにデコードされ、ビデオは yuv 形式のデータにデコードされます。
  3. オーディオとビデオの同期再生: カプセル化解除とデコードによって取得されたビデオ情報とオーディオおよびビデオ データは、再生のためにグラフィックス カードとサウンド カードに送信されます。

ffmpeg コマンドのフォーマット

記事Basic Concepts of Audio and Videoでトランスコーディングを紹介したとき、次のようにトランスコーディング コマンドがスローされました。

ffmpeg -i 入力.flv 出力.mp4

ffmpeg コマンドの基本的な形式については、ffmpeg 公式 Web サイトを参照してください。

ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...

に翻訳します

ffmpeg [全局选项] {[输入文件选项] -i 输入文件} ... {[输出文件选项] 输出文件} ...

... は、コマンドが複数の入力と複数の出力を持つ可能性があることを示します。

たとえば、複数のファイルを入力することで、トランスコード後に複数のファイルを出力できます

ffmpeg -i input1 -i input2 \
    -acodec … -vcodec … output1 \
    -acodec … -vcodec … output2 \
    -acodec … -vcodec … output3

不完全な統計によると、ffmpeg コマンドのオプションの数は数万と少ないため、より多くの学習スキルを習得するだけでなく、より多くの経験を積む必要があり、丸暗記に頼っていてはまったく機能しません。

非常に多くのオプションが 1 つのコマンドに反映されます。基本的な一般規則は次のとおりです。

入力ファイル オプションは、その後の最初の入力ファイルにのみ作用し、出力ファイル オプションは、その後の最初の出力ファイルにのみ作用します。そのため、注文要件があります。

グローバルオプションは何気なく書くことができます. 例えば, 出力を上書きするかどうかを尋ねるグローバルオプション -y があります. 次の2つの方法が記述できます.

ffmpeg -y -i input.flv output.mp4
ffmpeg -i input.flv -y output.mp4

ただし、コマンドが非常に長い場合 (前述のオーディオとビデオのケースのように、コマンドには数百文字もある)、そのようなグローバル オプションは入力ファイルまたは出力ファイルの前に記述するのが最適です。

また、最初に出力ファイルを書き込んでから、入力ファイルを書き出すのではなく、少なくとも入力ファイルを書き終えてから、出力ファイルを書き出す必要があります.たとえば、次のような書き方はよくありません.

ffmpeg output.mp4 -i input.flv

良い習慣は良いスタートです。

記事の最後には、オーディオとビデオの無料学習教材があります。

 

ffmpeg トランスコード出力のプロセス

ffmpeg -i input.flv output.mp4

または、上記の単純なコード変換コマンドですが、ffmpeg はこのようなコマンドをどのように処理しますか?

次の図を使用して、出力をトランスコードするプロセスを表します。

 

具体的な説明は以下の通り

  1. ffmpeg は、デマルチプレクサ、デマルチプレクサを含む libavformat ライブラリを呼び出して、入力ファイルからエンコードされたパケットを読み取ります
  2. 次に、エンコードされたパケットをデコーダーに渡します (ストリーム コピー操作では、この手順は無視されます)。
  3. デコーダーは、フィルターでさらに処理できる非圧縮フレーム (つまり、生のフレーム) を生成します。
  4. 次に、フィルターによって処理された生データがエンコーダーに渡されます。
  5. エンコーダは渡されたデータをエンコードし、エンコードされたデータ パケットを出力します。
  6. 最後に、データはマルチプレクサによって出力ファイルに書き込まれます。

複雑なコマンドはすべて、上記のトランスコーディング プロセスを通過する必要があります。基になるコードは無視できますが、プロセス全体を理解する必要があります。

おすすめ

転載: blog.csdn.net/yinshipin007/article/details/126394789