ビデオエディタの作成-便利なavconvレシピ(ffmpeg)



最近、Webインターフェースを備えた小さなビデオエディタを作成する必要がありました。
これに先立って、時々私は次のようなコマンドを使用しました
ffmpeg -i file.avi file.mp3 

主に、ある形式から別の形式への変換用。 すべてが常に多かれ少なかれスムーズであり、ビデオとオーディオを操作するために実際にどれだけのニュアンスがあるのか​​想像するのは困難でした。
しかし、最初から始めましょう。 しばらくの間、私のubuntuは以下を発行し始めました:
 *** THIS PROGRAM IS DEPRECATED *** This program is only provided for compatibility and will be removed in a future release. Please use avconv instead. 

一般に、詳細に使用されていましたが、特に重要ではありませんでしたが、プロジェクトにすでに時代遅れの機能を追加することは、どういうわけか「それではありません」。 私は何が起こっているのかをグーグルで調べなければならず、 ffmpegプロジェクトはしばらく前に分割され、一部の開発者はlibavライブラリの作成を開始しました。これは現在デフォルトでubuntuに含まれています。 もちろん、高度な機能の互換性は最初に犠牲になりました。 同時に、プロジェクトの名前変更に伴い、ffmpeg実行可能ファイルの名前がavconvに変更されました。これは上記の警告です。

カットの下で、便利になった主な機能の小さな絞り。


 avconv [  ] -i   [ ]   

それぞれいくつかの入力ファイルがあり、それぞれの前に-iオプションが書き込まれます。

しかし、実際には、すべてが少し複雑になっています。
次に、有用なレシピのセットと説明の過程でオプションに関する小さなコメント

コマンドに共通の主要オプション

-y質問なしでファイルを上書きします
-threads 8操作を実行するスレッドの数(この場合は8ですが、すべてのコーデックが並列化できるわけではありません)
-s hd720ビデオサイズ(この場合、hd720p-1280 * 720規格に準拠)
-q 1エンコードの品質を設定します(異なるコーデックに異なる影響を与えます)。 デフォルトでは品質の名前のみであるため、このオプションを忘れないでください。
ストリームのプロパティを指定するオプションの場合、このストリームをオプション自体で直接指定できます(これがない場合、オプションのアクションはすべてのストリームに拡張されます)。 これは次のように行われます。
-q:a 1音質を設定します。
-q:v 1それぞれ-ビデオ。
数字で、数字の下のストリームを意味します
-q:v:0 1最初のビデオストリーム(ゼロからカウント)、
-q:0 1最初のストリームは一般に、ファイルのレイアウトに依存します-入力ファイルの内容に関してavconvが提供する情報を最初に調べる必要があります。

大きなファイルをフラグメントにカットする

 avconv -i in.mp4 -ss 00:00:30 -t 00:10:00 -q 1 -s hd720 -threads 8 -r 25 -y out.mp4 

何秒-ss 00:00:30から何時間-t 00:10:00にビデオを撮るかを-ss 00:00:30ます。

希望の音量と希望の長さでビデオからオーディオを分離

 avconv -i in.mp4 -ss 00:00:22 -t 00:00:30 -vol 512 -vn -f u16le -ac 2 -ar 44100 -threads 8 -y out.raw 

-vn出力ビデオストリームを除外します
-ss 00:00:22カットフラグメントの始まり
-t 00:00:30カットフラグメントの長さ
-vol 512ボリューム、256は通常のボリュームで、高いものはすべて低いものを増やします
-ar 44100オーディオサンプルレート(オーディオストリームのサンプリングレート)44100はcd品質に対応し、標準です
-ac 2オーディオチャンネルの数を設定します(2-ステレオを意味します)
-f u16le出力ストリーム形式を設定します。u16le-ヘッダーなしで生データをファイルに保存します。
データを別の形式でエクスポートできますが、多くのオーディオフラグメントを連結する場合はrawが便利です。ファイルを1つずつ結合するだけで簡単に実行できます。

ファイルを複製または複製する

オーディオトラックを接続する必要がある場合は、シンプルなcat使用できます
 cat in1.raw in2.raw > out.raw 

このようにして、好きなだけ多くのファイルを接続し、いくつかの実行に分けて中間ファイルを作成できます。
 cat in1.raw in1.raw in1.raw > out.raw 

したがって、必要な時間だけフラグメント(たとえば、無音または固体信号)を複製したり、小さなオーディオフラグメントをループしたりできます。

生の形式を通常のwavに変換する

 avconv -q 1 -f u16le -ac 2 -ar 44100 -threads 8 -i in.raw -y out.wav 

写真

ビデオファイルを画像に分割する
 avconv -i in.avi -q 1 -s hd720 -threads 8 -y "out/%08d.jpg" 

出力では、ビデオフラグメントを構成する多くのフレームを取得します。

画像からビデオファイルを収集する
 avconv -i "in/%08d.jpg" -q 1 -s hd720 -threads 8 -y out_v.avi 

適切な量​​の写真の複製
たとえば、写真があり、ビデオで30分間長持ちする必要があります。 -loopオプションは主にこれに使用されます-loop
 avconv -loop 1 -i in.jpg -t 00:00:05 -q 1 -s hd720 -threads 8 -y out.mp4 


スクリーンショットを撮る
 avconv -i file.mp4 -an -ss 00:00:30 -r 1 -vframes 1 -y -f mjpeg -q 1 file.jpg 

-f mjpegこの操作のコーデックを指定します
オーディオトラックをミックスする別の方法

オーディオ処理には、 soxある優れたツールsoxます。 驚いたことに、彼と一緒に、驚くことなく、彼はavconvで一連の不安定な結果の後、2つのオーディオトラックをマージすることができました。 たとえば、 avconvは同じ時間の2つのトラックをマージでき、そのうちの1つは出力で2つ目より早く終了します。 したがって、特に長いローラーでは、重ね合わせると音が強く「消える」可能性があります。

 sox -m in1.wav in2.wav out.wav 

-m入力ファイルの混合モードを設定するオプション。 オプションがない場合、soxは単にファイルを連結し、最初の後に2番目を追加します。

オーディオとビデオを1つのファイルにマージする

 avconv -i in.mp4 -i in.mp3 -c:v copy -q 1 out.mp4 

-cコーデック選択
-c:aオーディオコーデック
-c:vビデオコーデック
-c:v copy copy-元のデータを使用して再コーディングしない

連結オプション

 avconv -i "concat:in1.avi|in2.avi" -q 1 -b:a 128k -preset libvpx-720p -threads 8 -y {f_out} 

-bビットレートを選択
-b:a 128k -mp3トラックのビットレートを128 Kbに設定します
-preset定義済みの設定セットをすぐに設定します
-preset libvpx-720p -hd720p標準に従ってvpxビデオコーデックとフレームサイズをインストールします
concat: -リストが定義される入力ファイルの特別な「フォーマット」。 実際には、接続ファイルを発行するcat in1.avi in2.aviと同様にcat in1.avi in2.aviします。 したがって、catのようにファイルを接続しますが、それらを解析するコーデックはそれを理解できない可能性があり(これはほとんどのフォーマットで起こることです)、そのような接続をサポートするフォーマットを選択する必要があります。 これらの形式のうち、mpeg、avi、および生のビデオデータについては言及する価値があります。これらは別の記事に専念できますが、ここでは触れません。

異なるファイルからトラックを作成する

 avconv -i in1.mp4 -i in2.mp4 -map 0:a -map 1:v -y -q 1 out.mp4 

-map出力ファイルに含めるソーストラックを指定します(マップが指定されていない場合、avconvは最初のファイルを出力ファイル形式に変換するだけです)。
-map 0:a最初のファイルのオーディオトラック(ゼロからカウント)。
-map 1:v -2番目からのビデオトラック。

バージョン0.9の新-filter_complex

このオプションは、複雑な(複雑な)操作のフィルターの順序を決定します。
同じフレームレートのファイルでも正常に機能します。

フィルターは、次のような行で記述されます。
[in1] [in2]変換[out]

入力では、実際には-mapで記述したものと同じです。たとえば、[0:a] [1:a]-最初と2番目のクリップのオーディオチャンネルです。
出力では、変換後に新しく作成されたチャネルに名前を付けます(例:mix_a)。 また、将来マップ内で使用したり、次の変換の入力時にストリームの名前として使用したりすることもできます。

デフォルトでは、すべての着信フロー(またはフィルターが1つのみを受け入れる場合は最初のストリーム)が変換に該当するため、それらを省略することができます。 出力チャネルは結果のファイルのデフォルトチャネルになるため、ほとんどの場合、ドロップすることもできます。

変換操作は条件付きで「ジェネレーター」に分けることができます-それらは何も受け入れませんが、指定されたプロパティ「フィルター」を持つストリームのみを作成します-入力で1つのストリームを取り、それを変換し、「ミキサー」-入力でいくつかのストリームを取り、接続しますそれら。

出力にはいくつかのストリームも含まれる場合があります。たとえば、フィルターがステレオを2つのモノラルトラックに分割する場合、リスト[out1] [out2]などで記述する必要があります。

ジェネレーターの例

 avconv -filter_complex 'color=white' -t 5 -q 1 out.mkv 

color=white純白の画像を生成します。 これは、たとえば、字幕の背景を作成したり、ビデオ間の一時停止として使用したりできます。

ビデオフィルターの例

 avconv -i in.avi -vf "hflip" out.avi 

hflip画像を水平方向にhflipます

 avconv -i in.avi -vf "smooth=type=blur" -q 1 out.avi 

smooth-「blur」、「blur_no_scale」、「median」、「gaussian」、「bilateral」のいずれかのアルゴリズムに従って画像のぼかしを実行します。

 avconv -i in.avi -vf "scale=w=200:h=100" -q 1 out.avi 

scale-画像のスケーリングを実行します。 彼の例を使用して、パラメーターをフィルターに渡す方法を検討できます。 「Scale = ...」-この例のように、フィルター名の後に等号が示されている場合、「name = value」という形式のパラメーターのリストが続きます。 パラメーターも等号で示されます。したがって、最初は多少混乱しますが、慣れることができます。 リスト内のパラメーター自体はコロンで区切られています。
w=200:h=100出力画像の高さと幅を厳密に設定します。 もちろん、サイズを設定する難しい方法では、画像は制御されたサイズで取得されますが、比率は歪む可能性があります。
scale=w=iw/2:h=ih/2出力画像のサイズは、入力画像に応じて指定できます。 この場合、半分にすることを示します。 適切な係数を選択することにより、比率を調整できます。 ちなみに、これにより興味深い効果を実現できます。たとえば、小さな画像を追加情報としてコーナーに挿入したり、ビデオ監視システムで行われているように複数のビデオ画像を組み合わせたりできます。
ow=200:oh=200指定されたサイズに画像をトリミングします
計算でより複雑な式と関数を使用することもできます。

ミキシングの例

 avconv -i in1.mp4 -i in2.mp4 -filter_complex amix=inputs=2 -q 1 -b:a 128k -preset libvpx-720p -threads 2 -y out.mp4 

amix=inputs=2オーディオストリームをミックスします。 ここでは、入力にあるスレッドの数を示し、その列挙自体を破棄します。
Amixには、出力ストリームの長さを調整できる便利なパラメーターdurationもあり、次の3つの値のいずれかを取ることができます。
- longest -最大の混合オーディオストリームの長さ
- shortest -したがって、最短、
- first -リストされたストリームの最初の長さに沿って。

ビデオの画像オーバーレイ

 avconv -i video.mkv -i logo.png -filter_complex overlay=x=10:y=main_h-overlay_h-10 -q 1 out.mkv 

overlay -あるストリームを別のストリームにオーバーレイできます。 画像をストリームとして使用できます。 上の例では、ロゴを左と下に10ピクセルずつインデントするように設定します。 下のインデントを計算するには、メインストリームの高さから重畳ストリームの高さを引き、さらにインデント自体を引きます。

この例では、いくつかのフィルターを一緒に使用する方法を示します。 フィルタリストを区切るには、「;」を使用します。

 avconv -i in1.avi -i in2.avi -filter_complex "[1:v]scale=w=iw/3:h=ih/3[v_small];[0:v][v_small]overlay=x=main_w-overlay_w-main_w/20:y=main_h-overlay_h-main_w/20" -q 1 out.avi 

2番目の画像を取得し、3回縮小して右下隅に配置し、この画像の20分の1幅の水平および垂直に等しい端からインデントします。

PS最後に言いたいのは、最終版は最初にすべてがどのように見えたかとは非常に異なっていたということです。 最後になりましたが、最新バージョンであっても、多くのバグが影響しました。 0.8ブランチのバージョンは安定していると提案されていますが、残念なことに、多くの興味深い機能はありません。 一方、ブランチ0.9のavconvは非常に不安定で、一見テストされた場所で管理されており、一部の入力ファイルですべてのRAMを数秒で消費してサーバーをハングアップさせます。 もちろん、メモリ使用量は現在のユーザーに制限できますが、いずれにしてもavconvが失敗するため、これでも問題は解決しません。 ビデオシーケンスの個々のビデオが消えることがありました。場合によっては、オーディオトラックとビデオシーケンスの時間が予期せずに異なりました。他のツールや同じタスクを実行する他の方法を探す必要がありました。

UPD:サウンドごとに1つのイメージをオーバーレイします:
 ffmpeg -r 1 -loop 1 -i aa.jpg -i aa.mp4 -acodec copy -vcodec mjpeg -t 326 -q 1 -y a.mp4 


システムにavconv 0.9がない人
1)gitのクローンを作成して構成する
 git clone git://git.libav.org/libav.git; ./configure 

2)複数のスレッドでコンパイルを指定して、高速化することをお勧めします。 インストールを行わずに、システムを復元する必要がないようにすることをお勧めします。
 make -j 8 

コーデックがない場合:
  ./configure --help 

そして、たとえば./configure --enable-vdpauように--enabledが表示されるだけ./configure --enable-vdpau

便利なリンク

-avconvヘルプ
-filter_complexで使用できる計算式
- ビデオフィルター
- オーディオフィルター
また、ハブには、 19 ffmpegコマンドのビデオファイルをあらゆるニーズに変換することに関する記事の優れた翻訳があり、より便利なレシピを学ぶことができます。 ほとんどすべてがavconvで動作します。

Source: https://habr.com/ru/post/J192724/


All Articles