ザリガニが見ていた...。ザリガニが見ていた...。読者になるザリガニが見ていた...。この広告は、90日以上更新していないブログに表示しています。2015-06-19なるべく理解したいffmpegコマンドストリーム・フィルターチェーン・フィルターグラフ・リンクラベルという概念に注目して調べてみた。ファイル情報を見るファイルに含まれるビデオとオーディオの形式を確認してみる。specifiedエラー表示*1されるのだけど、ファイル情報が詳細に表示されるのだ。二つのストリーム(オレンジ色の部分)が確認できる。ストリーム=ファイル内部で区別される連続するデータの流れ。映像が記録されている。音楽が記録されている。ストリームという概念ストリームという概念は重要である!ファイルは-iオプションで指定した順に0、1、2...と番号管理されている。同様に、ファイル中のストリームも順に0、1、2...と番号管理されている。#0:0とは、ファイル0番のストリーム0番という意味。一般的に、ストリーム0番にはビデオが記録される。ストリーム1番以降に、一つあるいは複数のオーディオが記録される。ffmpegでは、処理対象をストリーム単位で指定できる。#0:0は、コマンドオプション中で[0:0]のように表記できる。変換する.flvファイルを.mp4ファイルに変換する。ファイルフォーマットは、出力ファイルの拡張子によって判別される。sample.mp4変換しないで取り出す.flvファイルからmp3オーディオだけ取り出す。copyを指定することで、.flvファイル中のmp3をそのままコピーするのだ。copyを指定しないと、再変換する手間と時間がかかり、多少劣化すると思う。データをエンコード(符号化・圧縮化)する時の処理方法のこと。sample.mp3ちなみに、.flvファイル中にmp3オーディオが含まれているからコピーできるのだ。含まれているのがaacオーディオだったりすると、エラーが発生してコピーできない。aacオーディオが含まれている場合は、以下のように指定すればコピーできる。sample.aacさらに、h264ビデオとaacオーディオが含まれているなら、劣化なしでmp4ファイルに変換できる。h264とaacがmp4の要件に合っているからコピーできる。以下の3通りの書き方は、すべて同じ処理を指定している。sample.mp4指定した範囲を切り出すビデオやオーディオの好みの部分を指定して、切り出せる。sample_110_to_230.mp3再生時刻1分10秒から、1分20秒間を切り出す。sample_110_t_120.mp3上記はどちらも同じ部分を切り出し、1分20秒間のmp3オーディオとなる。複数のファイルを連結するsample_1.mp4とsample_2.mp4を連結して、sample_1_2.mp4に出力する。ビデオの幅と高さ・アスペクト比は事前に合わせておく必要あり。再エンコードが発生するので多少は劣化する。0)concatの引数を何も指定しないと、デフォルト設定によって以下のように解釈される。sample_1_2.mp4デフォルトはa=0なので、二つ目のファイルのオーディオは連結されないのだ。一つ目のファイルのオーディオはそのまま残るが、二つ目のファイルのオーディオは削除される。-iオプションのファイル数より、nの値が小さくてもコマンドは正常に終了するが、nで指定したファイル数しか連結されない。以下の例では、sample_1_2_3.mp4には、sample_1.mp4とsample_2.mp4しか連結されない。sample_1_2_3.mp4すべて連結するには、n=3を指定するのだ。sample_1_2_3.mp4よって、正しく連結できたかどうかは、動画の最後まで確認する必要がある!フェードイン・フェードアウトビデオビデオの先頭から、30フレーム使ってフェードインさせる。sample_fade-in.mp4ビデオの300フレームから、30フレーム使ってフェードアウトさせる。sample_fade-out.mp4ビデオの先頭から、1秒使ってフェードインさせる。sample_fade-in.mp4ビデオの時刻10秒から、1秒使ってフェードアウトさせる。sample_fade-out.mp4オーディオオーディオの先頭から、1秒使ってフェードインさせる。sample_fade-in.m4aafadeのみ、ss=Nを指定できる。ssの場合、Nに何を指定しても、常に先頭の指定となる。オーディオの60秒から、1秒使ってフェードアウトさせる。sample_fade-out.m4a仮にss=60と指定しても、いきなりフェードアウトが始まってしまう...。フィルターチェーン・フィルターグラフ・リンクラベルによる連続技フィルターチェーンフィルターチェーンを使って、二つのフィルター(フェードイン・フェードアウト)を適用する。フィルターチェーンとは、複数のフィルターをカンマ,で区切って指定する方法。一つ目のフィルター処理、その結果に対して二つ目のフィルター処理...のように適用される。以下の処理で、フェードインで始まり、フェードアウトで終わるビデオになる。sample_fade-in_fade-out.mp4フィルターグラフとリンクラベルフィルターグラフとリンクラベルを使っても、フィルターチェーンと同様の処理を行える。フィルターグラフとは、フィルターやフィルターチェーンをセミコロン;で区切って指定する方法。フィルターグラフとフィルターチェーンは似ているので、よく混乱するのだけど、決定的な違いがある。sample_fade-in_fade-out.mp4フィルターグラフは、リンクラベルなしでは処理結果を次のフィルターに引き継がない。リンクラベルを設定しておく必要がある。sample_fade-in_fade-out.mp4[a]という表記がリンクラベル。(英数文字とアンダースコア_を使って任意の名前を命名する)fade=in:0:30のフィルターの結果に[a]というリンクラベルを設定して、[a]が指し示す結果に対してfade=out:300:30フィルターを適用している。二つのフィルターの連続では、フィルターグラフの利用価値をあまり見出せないが...フィルターグラフには、フィルターチェーンの区切りとなって、グループ化する役割がある。sample_1.mp4とsample_2.mp4を連結してから、フェードイン・フェードアウトする場合...ビデオだけなら、シンプルなフィルターチェーンのみで処理できる。sample_1_2.mp4ビデオとオーディオを扱うと、concatの出力は二つのストリームになるので、必ず二つのリンクラベルが必要になる。-mapにそのリンクラベルを指定して、出力ファイルに書き込む必要がある。最後のフィルター出力でリンクラベルを指定しなければ、そのフィルター出力は自動的に出力ファイルに書き込まれる。フィルターグラフを使えば、もう少しシンプルに表現できる。フィルターグラフの場合、ビデオは[v]にリンクされ、リンクなしのオーディオは出力ファイルに書き込まれる。sample_1_2.mp4一方、フィルターチェーンを使うと、リンクなしのオーディオは次のフィルターにリンクしてしまう。sample_1_2.mp4...エラー発生...リンクラベルを使うなら、フィルターグラフで区切った方が幸せになれそう。フィルターの順序を逆にして、sample_1.mp4をフェードイン・sample_2.mp4をフェードアウトしてから、連結することもできる。sample_1_2.mp4[0:0]、[1:0]などの表記については、前項のストリームという概念を参照。sample_1.mp4のストリーム0番をフェードインして、リンクラベル[a]を設定する。sample_2.mp4のストリーム0番をフェードアウトして、リンクラベル[b]を設定する。[a]・sample_1.mp4のストリーム1番・[b]・sample_2.mp4のストリーム1番を連結する難解なffmpegのオプション指定が少しずつ見えてきた!フィルターチェーン・フィルターグラフ・リンクラベルが分かってくると、フィルター処理の流れが見える。したら後は、個々のフィルターの動作を調べれるだけで、ffmpegが何をしているのか理解できるのだ。フィルターの動作をすべて覚える必要なんてない。必要になったらマニュアルを見て調べればいいのだ。FFmpeg(日本語訳)合成ffmpegのフィルター指定は、まるでプログラミングコードである。フィルターチェーン・フィルターグラフ・リンクラベルを理解すると、そのコードの流れが見えてくる。コードの流れが見えてくると、自分が何をわからず、何を調べればいいのか、理解できるようになる。なると、俄然面白くなってくる!以下をサンプル映像とさせていただき、いろいろなオプション指定を試してみた。overlay.mp4padは、ビデオの表示領域を設定する。width)2*iwを設定すると、横幅が2倍のビデオになる。拡大された領域は、背景が黒くなる。overlayは、二つのビデオを重ね合わせる。[a][b]overlayとした場合、ビデオ[a]にビデオ[b]を重ねる。(ビデオ[b]が上になる)[a][b]overlay=x:yで、ビデオ[a]の(x,y)座標を起点にビデオ[b]を配置する。w・hは、ビデオ[b]の幅・高さ解釈される。W・Hは、ビデオ[a]の幅・高さと解釈される。指定なしは、0と解釈される。sample_1.mp4の横幅を2倍にして、(640,0)の座標を起点に、sample_2.mp4を重ね合わせるのだ。sample_1.mp4とsample_2.mp4のビデオサイズは、640x360。overlay.mp4padとoverlayの指定を上下に配置する設定に変更してみた。overlay.mp4scaleは、入力されたビデオサイズを拡大・縮小する。scale=iw/2:ih/2は、ビデオの幅と高さを半分に縮小するのだ。1:1は、sample_2.mp4のオーディオも合成している。sample_1.mp4に、幅と高さを半分に縮小したsample_2.mp4を重ねているのだ。overlayの座標指定なしなので、(0,0)を起点として、左上の1/4領域に配置される。overlay.mp4重ねたビデオ同士を透過する。blendフィルターをちゃんと理解できていない...。overlay.mp4上に重なるビデオサイズを調整してから透過合成すれば、ピクチャーinピクチャーの透過合成となる。確実にconcat実は、上記サンプル映像二つは、単純にはconcatできない...。Parsed_concat_0調べてみると、アスペクト比が異なっていると気付いた。(default)ならばsample_2.mp4のアスペクト比をsample_1.mp4に合わせてみる。sample_1_2.mp4しかし、上記ではコマンドラインが2行に分かれて、余分な中間ファイルも作成してしまい、あまり嬉しくない。そこで、filter_complexを使って、setdarあるいはsetsarのフィルターを追加することで、一行で連結できた。sample_1_2.mp4[0:v]・[0:a]は、ファイル0番のビデオストリーム・ファイル0番のオーディオストリームという意味のようだ。sample_1.mp4の場合、[0:v]は[0:0]と同じストリーム、[0:a]は[0:1]と同じストリームを指す。参考ページ以下のページがたいへん参考になりました。bashを利用している。...2010-08-28MacBookでラジオを録音する今やインターネットにはあらゆる情報が流れている。読者になるこのブログについて検索リンク記事一覧はてなブログをはじめよう!zariganitoshさんは、はてなブログを使っています。あなたもはてなブログをはじめてみませんか?はてなブログをはじめる(無料)はてなブログとはザリガニが見ていた...。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。