ffmpeg 入門 - オーディオとビデオの基本概念

オーディオとビデオに関しては、誰もが映画 (ビデオ) を見たり、音楽 (オーディオ) を聴いたりしたことがあると思いますが、少なくとも mp4 がビデオ ファイルで、mp3 がオーディオ ファイルであることを知っておく必要があります。

オーディオおよびビデオ ファイルにはどのような属性がありますか? ビデオを例にとると、ffmpeg -i コマンドでメディア ファイルの情報を表示できます。

» ffmpeg -i r1ori.mp4
ffmpeg version 4.1 Copyright (c) 2000-2018 the FFmpeg developers
  built with Apple LLVM version 10.0.0 (clang-1000.10.44.4)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.1 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags='-I/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include/darwin' --host-ldflags= --enable-ffplay --enable-gpl --enable-libmp3lame --enable-libopus --enable-libsnappy --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-chromaprint --enable-frei0r --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfdk-aac --enable-libfontconfig --enable-libfreetype --enable-libgme --enable-libgsm --enable-libmodplug --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-librsvg --enable-librtmp --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtesseract --enable-libtwolame --enable-libvidstab --enable-libwavpack --enable-libwebp --enable-libzmq --enable-opencl --enable-openssl --enable-videotoolbox --enable-libopenjpeg --disable-decoder=jpeg2000 --extra-cflags=-I/usr/local/Cellar/openjpeg/2.3.0/include/openjpeg-2.3 --enable-nonfree
  libavutil      56. 22.100 / 56. 22.100
  libavcodec     58. 35.100 / 58. 35.100
  libavformat    58. 20.100 / 58. 20.100
  libavdevice    58.  5.100 / 58.  5.100
  libavfilter     7. 40.101 /  7. 40.101
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  3.100 /  5.  3.100
  libswresample   3.  3.100 /  3.  3.100
  libpostproc    55.  3.100 / 55.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'r1ori.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.20.100
  Duration: 00:00:58.53, start: 0.000000, bitrate: 1870 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 544x960, 1732 kb/s, 29.83 fps, 29.83 tbr, 11456 tbn, 59.67 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 129 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

ビデオのメタ情報に加えて、最初にコンパイルしたその他の構成も含まれています. -hide_banner パラメータを選択して、この情報を非表示にすることができます. 完全なコマンドは次のとおりです.

»ffmpeg -i r1ori.mp4 -hide_banner
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'r1ori.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.20.100
  Duration: 00:00:58.53, start: 0.000000, bitrate: 1870 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 544x960, 1732 kb/s, 29.83 fps, 29.83 tbr, 11456 tbn, 59.67 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 129 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
At least one output file must be specified

私たちは主にいくつかのデータを見ます

  1. Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'r1ori.mp4': # Input #0 は、ffmpeg -i パラメータを介して入力した最初のファイルを意味し、添え字は 0 から始まります。つまり、複数のファイルを入力できます。実際、ffmpeg は複数のファイルの出力もサポートしています。
  2. メタデータは動画のメタデータを表します
  3. Duration 行には、ビデオの再生時間が 58.53 秒、再生開始時間が 0、ファイル全体のビットレートが 1870kbit/s であることが含まれています。
  4. Stream #0:0(und): Video: h264、この行は、ファイルの最初のストリームがビデオ ストリームであることを示し、エンコード形式は H264 形式 (カプセル化形式は AVC1) であり、各フレームのデータは次のように表されます。 yuv420p、解像度は 544x960、ビデオ ストリームのビット レートは 1732kbit/s、フレーム レートは 29.83 フレーム/秒です。
  5. Stream #0:1(und): Audio: aac、この行は、ファイルの 2 番目のストリームがオーディオ ストリームであり、エンコード形式が ACC (カプセル化形式は MP4A) であり、採用されているプロファイルが LC 仕様であることを示します。サンプリング レートは 44.1 KHz、チャンネルはステレオ、ビット レートは 129kbit/s です。

見慣れない名詞が出てきたので、順番に紹介していきます。

容器

上記のビデオ ファイルのように、さまざまなデータ ストリーム (ビデオ ストリーム、オーディオ ストリーム、一部の字幕ストリームなど) は、コンテナーと呼ばれるファイルにカプセル化されます。よく知られているように、mp4、avi、rmvb などはマルチメディア コンテナー形式です。通常の状況では、マルチメディア ファイルの接尾辞はそのコンテナー形式です。

コンテナは、ボトル、ジャー、またはそのようなものとして理解できます。

 音声と映像の無料学習パッケージ、記事がやっと届きました。

エンコードとデコード (コーデック)

エンコーディング: ビデオとオーディオは、コーデックと呼ばれる特定の形式または仕様で記録および保存されます。コーディングは、コンテナーの内容の処理として理解できます。

一般的なビデオ エンコーディング フォーマットは h264、h265 などであり、一般的なオーディオ エンコーディング フォーマットは mp3、aac などです。

デコード:ビデオとオーディオのエンコードされたデータを非圧縮のビデオとオーディオの生データにデコードすることです。たとえば、オーディオにエコーを追加する場合、まずオーディオ ファイルをデコードしてからエンコードする必要があります。

ソフト ソリューション: ソフトウェア デコード。これにより、CPU はソフトウェアを介してビデオ ファイルをデコードできます。

難しい解決策: つまり、ハードウェア デコーディング. CPU への負荷を軽減するために、GPU を使用して、元々 CPU によって処理されたビデオ データの一部を処理します。

ソフト ソリューションは大量のビデオ情報を処理する必要があるため、ソフト ソリューションは非常に CPU を集中的に使用し、FFmpeg コマンドは CPU を強制終了する可能性があります。

比較すると、ハード ソリューションの効率は非常に高いですが、ハード ソリューションの欠点も明らかで、ソフト ソリューションと同様に字幕や画質などを処理できません。私の記憶が正しければ、Qiniu クラウド プラットフォーム (比較的プロフェッショナルなオーディオおよびビデオ プラットフォーム) はまだハード ソリューションをサポートしていません。

ffmpeg は、最も一般的なソフト デコーディング オープン ソース ライブラリであり、実際には H264、H265、MPEG-4 などのコーデック アルゴリズムを介してソフト デコーディングを実行します。

今日のオーディオとビデオの分野では、ffmpeg はほぼすべてのオーディオとビデオのコーデックをサポートしており、非常に強力です。

トランスコーディング: つまり、ある形式から別の形式へのビデオの変換であるエンコード変換です。たとえば、flv ファイルを mp4 ファイルに変換します。

ffmpeg -i input.flv output.mp4

ビットレート

ビット レートとも呼ばれるビット レートは、1 秒間にエンコーダーが出力するバイト数を示します。単位は Kbps、b はビット (ビット) です。これは、コンピューターのファイル サイズの測定単位です。1KB=8Kb の場合、センシティブ、s は秒 (second) ) p ごと (per) です。

例えば

同じ圧縮アルゴリズム (後でいくつかの異なる圧縮アルゴリズムを紹介します) の下では、ビット レートが高いほどビデオ品質が高くなります。

圧縮ファイルの場合、上記の理解によると、コードレートの概算方法 = ファイルサイズ / 期間。

たとえば、r1ori.mp4 のサイズが 13.7 MB で、再生時間が約 59 秒の場合、ビット レートは (13.7 x 1024 x 8) / 59 = 1900 kb/s にほぼ等しくなります。

計算式: 1MB=8Mb=1024KB=8192Kb

まだいくつかのパラメーターがあるため、このコード レートの概算値しか取得できません。

固定金利と変動金利

初期の頃、オーディオ エンコーディングが選択されたとき、固定ビット レート (Constant Bitrate、CBR) が選択され、続いて可変ビット レート (Variable Bitrate、VBR) が選択されました。そのため、「落ち着いた絵」と「劇的な絵」のバランスを取るのは難しい. 相対的に言えば、可変ビットレートはエンコーダを非常にうまく制御できます. より多くの詳細があり、絵が比較的暴力的である場合, より多くのビットを使用します, 比較的落ち着いた絵のために,下位ビットを使用します。このように、特定の出力品質の条件下では、VBR の方が有利であり、ストレージ用の可変ビット レートも優先します。

フレームとフレームレート

フレームとは写真のことです。

フレームレート(frames per second, fps)、つまり1秒間に何枚のフレームが出力されるかということで、1秒間に何回映像が出力されているかもわかります。

ゲームをプレイするときは誰もが深い経験をしているはずですが、ゲームが動かなくなると、画像がフレームからフレームへとジャンプし、非常に滑らかではなくなります。

フレームレートは画像の滑らかさに影響し、フレームレートが高いほど画像は滑らかになります。

残像現象(つまり、物体が急速に動いているとき、人間の目で見た像が消えた後、人間の目は像の約1/24秒の像を保持し続けることができる)により、一般的なムービー ビデオの場合、必要な最小フレーム レートは 24 です。これは、1 フレームあたり 1/24 = 0.042 秒の露出です。

解像度

解像度は、Blu-ray 1080P、ウルトラ クリア 720P、ビデオ Web サイトでよく見られる高精細 540P など、誰もが知っているはずです。

解像度は、ビデオ画面のサイズ、つまりビデオの幅と高さとして理解できます。720P は、高さが 720 ピクセルであることを意味します。

ビットレートとフレームレートを理解したところ、解像度が高いほど鮮明な映像とは一概には言えませんが、ビットレート、フレームレート、解像度の関係をどのようにバランスさせるかが分かりました。

一般に、ビデオのボリュームが小さく、解像度が高いビデオを受け入れる傾向があり、1 つは保存に便利であり、もう 1 つは見栄えが良いことです。

ロッシーとロスレス

まず、オーディオとビデオの生データとは何ですか?生データとは、オーディオおよびビデオ機器によって収集された、処理されていないデータを指します。オーディオの生データは pcm 形式で、ビデオの生データは yuv 形式です。

ロッシーとロスレス、つまりロスの有無にかかわらず、マルチメディア データ圧縮の用語です。非可逆圧縮は破壊的圧縮とも呼ばれますが、もちろん、圧縮後に解凍できない種類の損傷ではありません。たとえば、一般的な mp3 および mp4 ファイルは非可逆圧縮です。

オーディオ コーディングを例にとると、オーディオのサウンドは自然に由来するものであり、技術的なソリューションを通じてサウンドをキャプチャし、特定のアルゴリズムに従って保存します。

この段階では、保存したサウンドを自然の音に完全に復元することはできず、オーディオ エンコーディングには損失が伴います。

学生さんから質問されることもあると思いますが、記事の紹介を見たのですが、元の音声データはpcm形式ではないのでしょうか?

実際、pcm エンコーディングは限りなくロスレスに近く、信号の最高の忠実度を実現できるため、pcm エンコーディングはロスレス圧縮であると認められています。

良いオーディオです。自然からの最も本物の音を聞きたいのですが、なぜ圧縮するのですか?

生データが大きすぎて保存できません

保存しても送信に不便で、膨大な帯域幅を必要とします。

いまや動画の圧縮率は非常に高く、今や誰もが見慣れた4k・8kなど、そのニーズを十分に満たしてくれそうです

マルチプレクサとデマルチプレクサ

コンテナの場合、これはコンテナ用であり、2 つの頻繁な操作があることが多いことに注意してください。

コンテナー内のオーディオ データとビデオ データを取り出すことを、カプセル化解除と呼びます。

処理されたオーディオおよびビデオ データをコンテナーにパッキングすることはカプセル化と呼ばれ、マルチプレクサ カプセル化器 (マルチプレクサとも呼ばれます) によって完了します。

オーディオとビデオに関連する概念は、この記事で引き続き更新します. 理解しにくい概念があると感じた場合は、メッセージを残してください. 収集および補足します.

おすすめ

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