ffmpeg コマンドラインを使用してビデオを変換するためのサンプルコード

ffmpeg コマンドラインを使用してビデオを変換するためのサンプルコード

この記事の本文を始める前に、まず ffmpeg プログラムをインストールする必要があります (Linux では x264 エンコーディングもインストールする必要があります)。 Mac で brew を使用して直接インストールします。

brew ffmpeg をインストールします --with-faac --with-fdk-aac --with-ffplay --with-fontconfig --with-freetype --with-libass --with-libbluray --with-libcaca --with-libsoxr --with-libquvi --with-frei0r --with-libvidstab --with-libvorbis --with-libvpx --with-opencore-amr --with-openjpeg --with-openssl --with-opus --with-rtmpdump --with-schroedinger --with-speex --with-theroa --with-tools --with-x265

インストール後、ffmpeg コマンドを使用して MP4 ファイルを圧縮できます。

ffmpeg -i MVI_7274.MOV -vcodec libx264 -preset fast -crf 20 -y -vf "scale=1920:-1" -acodec libmp3lame -ab 128k a.mp4

パラメータの説明は次のとおりです (https://vistb.net/2012/02/x264-video-compress-intro/ から変更)。

-preset: エンコード設定を指定します。 x264 エンコード アルゴリズムには、設定可能なパラメータが多数あります。パラメータ値が異なるとエンコード速度が大きく異なり、品質にも影響する場合があります。ユーザーがアルゴリズムを理解して手動でパラメータを設定する手間を省きます。 x264 はいくつかのプリセット値を提供しており、プリセットで指定できます。プリセットは、ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo です。 Ultrafast はエンコード速度が最も速いですが、圧縮率が低く、生成されるファイルサイズが大きくなります。一方、Placebo はその逆です。 x264 で使用されるデフォルト値は medium です。プリセットは主にエンコード速度に影響し、エンコード結果の品質には大きな影響を与えないことに注意してください。 HD ムービーを圧縮する場合、通常は slow または slower を使用します。マシンの性能が非常に優れている場合は veryslow を使用できますが、通常、それほど大きなメリットはありません。

-crf: これは最も重要なオプションで、出力ビデオの品質を指定するために使用されます。値の範囲は 0 ~ 51 で、デフォルト値は 23 です。数値が小さいほど、出力ビデオの品質が高くなります。このオプションは、出力ビデオのビット レートに直接影響します。一般的に言えば、480p を圧縮する場合は約 20、720p を圧縮する場合は 16 ~ 18 を使用しますが、1080p は試していません。個人的には、通常の状況では 16 未満にする必要はないと考えています。最善の方法は、いくつかの値をそれぞれ数分間試して、最終的な出力品質とファイル サイズを確認し、ニーズに応じて選択することです。

実際、-b 1024k のようなパラメータもあるのですが、-crf が設定されると -b は役に立たないことがわかりました。私の簡単な試みによると、5D2 で撮影した 18 秒間の 1920x1080 ビデオ (午後の自然光、シンプルな画像、大きな白い壁、黒いドアが 1 つだけ) の crf と圧縮ファイル サイズの関係は次のとおりです。

CRfファイルサイズ
16 54M
18 39M
20 2500万
22 17M
24 11M
26 730万
28 5.0M
30 360万
32 270万
デフォルト14M(CRFは23)

crf が 20、28、32 のときのビデオ品質を比較したところ、32 でも品質が低下していることがわかりました。20 は確かに非常に優れていますが、28 と 20 の違いはそれほど大きくありません。crf 値を 26 ~ 28 に設定するのが適切です。サイズに要件がある場合は、そのままにしてデフォルト値 (おそらく 31) を使用できます。

また、プリセットに関して、低速と高速は実行時間のみに関係します。低速の実行時間は高速の実行時間よりもはるかに長くなります。低速で生成された mp4 ファイルは小さくなり (12M)、高速で生成されたファイルは大きくなります (14M) が、ビデオ品質の違いは明らかではありません。

元のビデオ サイズを 1920x1080 から 960x540 に縮小すると、ビデオ サイズは次のようになります。

CRfファイルサイズ
16 11M
18 670万
20 440万
22 3.0M
24 2.1M
26 160万
28 130万
30 110万
32 893K
デフォルト250万(CRFは23)

まとめると、品質に対する要件が高い場合は 22 以下を選択します。サイズに対する要件が非常に高い場合は 26 を選択します (ただし、品質はわずかに低下します)。それ以外の場合は 24 の方がコスト効率が高く (またはデフォルトの 23 でも問題ありません)、サイズに対する要件が非常に高い場合は 28 以上を選択します。

追記(@gghyooより)

-threads nを使用すると、マルチスレッド操作を実装し、マルチコアCPUを最大限に活用できます。

以下にいくつか例を挙げます。

ffmpeg -threads 2 -crf 20 -y -i ML-02.avi -strict 実験的 ML-02.mp4

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。

以下もご興味があるかもしれません:
  • Ffmpeg を使用して flv ビデオのサムネイルとビデオ時間を取得するためのコード
  • nginx と ffmpeg を使用してストリーミング メディア サーバーを構築するプロセスの詳細な説明
  • Mac OS で Android Studio 用の FFmpeg デコード ライブラリをコンパイルするための詳細なチュートリアル
  • ffmpeg 中国語パラメータの詳細な説明
  • ffmpeg 中国語パラメータの説明と使用例
  • MAC に FFmpeg をインストールするグラフィック チュートリアル

<<:  MYSQLは、ショッピングカートに追加する際に重複追加を防ぐためのサンプルコードを実装します。

>>:  CocosCreator システムイベントがどのように生成され、トリガーされるかについての詳細な説明

推薦する

スーパーバイザーによるDockerfileのマルチサービスイメージパッケージ操作

Dockerfileの作成yumソースを設定する cd /tmp/docker vim Docker...

Vue が天気予報機能を実装

この記事では、天気予報機能を実現するためのVueの具体的なコードを参考までに共有します。具体的な内容...

CSSアニメーションがJSによってブロックされるかどうかについての簡単な議論

CSS のアニメーション部分は JS によってブロックされますが、transform のアニメーショ...

Dockerの高可用性構成の詳細な説明

Docker の作成Docker Compose は、管理対象コンテナをプロジェクト、サービス、コン...

Docker を使用した nGrinder パフォーマンス テスト プラットフォームの導入プロセスの分析

nGrinderとは何ですか? nGrinder は、スクリプトの作成、テストの実行、監視、結果レポ...

Nginx ソースコード調査における nginx 電流制限モジュールの詳細な説明

目次1. 電流制限アルゴリズム2. nginxの基礎知識4. 実戦要約する高並行性システムには、キャ...

CSS3 border-radius 丸角の実装方法と使い方の詳しい説明

以前は、角を丸くするのは非常に面倒でしたが、CSS3 では、角を丸くするのは非常に簡単になり、bor...

Linux FTP匿名アップロードとダウンロードが自動的に開始される問題を解決する

勉強や仕事で FTP サーバーを頻繁に使用する場合は、起動時に自動的に起動するように設定できます。設...

Linux の RPM パッケージでインストールされた xinetd ベースのサービスの管理

目次序文1. xinetdサービスに基づく起動管理(1)Telnetサービスのインストール(2)Te...

MySQL8 ベースの docker-compose デプロイメント プロジェクトの実装

1. まず、次のパスに従って対応するフォルダを作成します。 ローカルのdockerでmysqlを実行...

指定された期間内のすべての日付または月を取得する MySQL ステートメント (ストアド プロシージャの設定やテーブルの追加は不要)

mysql は期間内のすべての日付または月を取得します1: mysqlは期間内のすべての月を取得し...

Angularルーティングサブルートの詳細な説明

目次1. サブルート構文2. 例1. 2つの新しいコンポーネントを作成し、その内容を変更する2. ル...

Vue.jsはElement-uiを使用してナビゲーションメニューを実装します

この記事では、Element-uiを使用してvue.jsでナビゲーションメニューを実装するための具体...

マルチポートおよびマルチドメイン名アクセスのNginx構成の実装

サーバーに複数のサイトを展開するには、異なるサイトにアクセスするために複数のポートを開く必要がありま...

Linuxの読み取りコマンドの使用

1. コマンドの紹介read コマンドは、シェルの組み込みコマンドで、標準入力または -u オプショ...