[ PC系セットアップ覚書 Top]

PC系セットアップ覚書

2011年まで「俺的な非 UN*X 環境をめざして」という題でしたが、 「UNIX系」と「非UNIX系」の区別がだんだん難しくなってきましたので、 あれこれ区別しないことにしました(^_^;


[前] Macが起動しませんよ‥ 2018/09a

ffmpeg で動画を1つに合体 2018/06a

フレームレートとかサイズとかがバラバラな、ごく短い動画群をまとめて1つの 動画にしたいときのメモ。

[Table of Contents]

基本的なこと

ffmpeg で動画を合体させたいとき。

% ffmpeg -i in01.mov -i in02.mov -filter_complex concat out.mov
こんな感じかな? これで in01.mov と in02.mov をくっつけて out.mov という 動画ファイルを作ってくれます。

 ただこの方法は、合体させるファイルの数が多くなるとファイル名の指定が面倒くさい、 というか試してみるとなんか動画2つしか合体されてくれなくね??? ‥という 感じがしますので、そのときは別の方法を使います。

% ffmpeg -f concat -safe 0 -i douga-list.txt -c copy out.mp4
こんな感じに書いて、別途 douga-list.txt というファイルを作ってそこに以下:
file in01.mov
file in02.mov
こんな感じで書いてやると、in01.mov in02.mov の中身をつなげて out.mp4 に してくれます。

[Table of Contents]

動画の属性を揃える

ただ実際にこれをやろうとしても、案外大変!

 何が大変かというと。SAR がどうとか DAR がどうとか、 "Non-monotonous DTS in output stream 0:0" とかいう わけわからないエラーメッセージが大量に出るのです。まあ、エラーメッセージが 大量に出ても、それでもちゃんと動画ができてくれてれば良いんですけど。 できあがった動画を見てみると、途中からどう見てもおかしい。 緑っぽいブロックノイズばかりの動画になってて何だこりゃ?! と。 (-c copy を外せばいいのかな? と思っても、外しても何かうまくいかない‥)

 そういう時にどうするか。たぶん動画のサイズとかフレームレートを合わせてやれば エラーはあまり出なくなるみたいです。動画のサイズを揃えるには、 以前[ 動画から必要なエリアの切り出し ]で紹介したように -vf の crop オプションが使えます。

% ffmpeg -i CIMG000.MOV -vf "crop=600:300:20:80" -c:v h264 a.mp4
これで動画から 600x300 の領域だけを切り抜くことができます。

 大きなサイズの動画を小さくしたいときは以下:

% ffmpeg -i CIMG000.MOV -vf "crop=1200:600:40:160" -s 600x300 -c:v h264 a.mp4
こんな感じで -vf の crop を使ったあとで -s オプションを使います。あるいは
% ffmpeg -i CIMG000.MOV -vf "crop=1200:600:40:160,scale=600:-2" -c:v h264 a.mp4
このように -vf オプションで crop と scale の指定をする方法もあります。 すると大きなサイズの動画からその一部を切り抜き、 さらにその切り抜きをこちらの指定したサイズに変更することができます。

[Table of Contents]

動画のFPSを揃える

(2022.6追記)

最初は iPhone で撮影していたものの、 途中で「ストレージが一杯でもう書き込めません」とかいう感じのエラーが出て それ以上撮影できなくなったとき。そのとき別のスマフォを持ってたりすると 別のスマフォでその後を撮影する‥なんてことがごく稀にあったりします。

そんなとき。せっかくなのでその両方のスマフォで撮影した動画を結合させて1つに してしまいたい! そうした方が管理もラクだし‥なんて 思うこともあります。そのときは ffmpeg で動画のサイズを揃えたうえで 動画を結合させるんですけど、できた動画を見てみると、 動画がなんか結合部分あたりから おかしくなっていることがよくあります。

ということでちょっと調べてみると、 なぜなのか理由は調べてないのでよくわからないんですけど、 同じスマフォの同じカメラアプリで同じ日に撮影した動画であっても それぞれ FPS が 29.97 になっていたり 30 になっていたり 他の近い数字になっていたりするみたいですね。 んで FPS の数値が違うものどうしを無理に結合しようとすると、 それがたとえ 29.97 と 30 といったかなり近い数値のものであっても、 挙動がおかしい不審な動画ができてしまいます。 それを防ぐため、各動画の FPS を揃えると良さげです。具体的には以下:

% ffmpeg -i IN-1.mov -r 30 IN-1-r30.mp4
% ffmpeg -i IN-2.mp4 -r 30 IN-2-r30.mp4
こんな感じで -r オプションを使って FPS を揃えて(もちろん動画のサイズ等も揃えて)、 そして揃えたほうの動画(上の例では IN-1-r30.mp4 や IN-2-r30.mp4 のほうの動画)を 結合させたら、うまく合体できました。 (iPhone と AQUOS の動画でしか試していません)

(2022.12追記)

合体させる動画の FPS を調べたら 29.97 のが多いから全部の動画のFPSを 29.97 に揃えてから 合体させてみたんだけど、おかしいなあ‥うまくいかないなあ‥。 ‥なんてこともあると思います。そのときは 29.97 よりもっと細かい -r 29.97002997 という数字を指定するか、あるいは分数で -r 30000/1001 (これは 4500000/286/525 を約分したもの) こんな感じで指定するとうまくいく可能性が高まります。

「何だ 29.97 という中途半端な数字は!!」と思ったときは「29.97 fps」みたいな感じで 検索するとそれについて説明してるサイトがいっぱい見つかります。

[Table of Contents]

動画のSAR/DARを揃える

(2022.7追記)

合体させる動画は SAR, DAR の値が一致してないとダメです。 SAR, DAR について簡単に説明すると、DAR が「再生・表示されたときのヨコタテ比」です。 素朴な状態ではDARのヨコタテ比は動画のヨコタテのドット比と同じになるはずですが、 これを変更することができるのです。つまり、 たとえば 400:400 ドットの動画なのに、横に引き伸ばして 800:400 ドットの動画のように 常に再生させることが可能なのです。ここで使われるのが SAR というやつで、 たとえば上の「本来のドット数よりも動画が横に2倍に引き伸ばされて表示される」 例だと SAR は 2:1 になっています。 (たぶん説明の内容はこれで合ってる‥はず。説明が読者に伝わるかどうかは不明)

 この SAR の値をどうやって変更するか? どうやら ffmpeg では直接 SAR を変更できない みたいです。 かわりに DAR のほうを変更し、その結果 SAR も変更される‥こんな手順を踏むと良いみたいです。 たとえばここで例にあげてる 400:400 ドットの動画。SAR が 2:1 になってるこの動画の SAR を 1:1 にしたいときは以下:

% ffmpeg -i A -aspect 400:400 -c copy out.mp4
aspect オプションを使って DAR を設定してやります。これで DAR が 400:400 = 1:1 になりますが、 他方この動画のドット数は 400:400 なので、ああ、両方ともヨコタテ比が同じじゃん! と ffmpeg が判断し、その結果 SAR が 1:1 になるみたいです。

[Table of Contents]

動画の属性を揃える(強引に)

(2021.12追記)

でも。動画の縦横のサイズを揃えただけでは不十分なことも多いです。 何をどうやってもうまく動画が合体されてくれず、 もうお手上げ! なんてことになることもあります。

 そんなときに私が取る方法ですけど。 他ページで紹介した「動画の中に動画を埋め込む(基本編)」を使います。

 動画の縦横サイズは合っているものの、動画の微妙な設定をどうしても合わせられなくて合体させられない 動画A,Bがあると仮定します。ここで動画Bの設定を動画Aに合わせたいとき、こんな感じ:

% ffmpeg -i A -i B -filter_complex "overlay=x=0:y=0" -map 1:a:0 -preset ultrafast B2
つまり動画Aの中に動画Bを埋め込んでしまうのです。ただ動画Bの大きさは動画Aと同じなので、 動画Aの表示部分が全部動画Bで上書きされてしまい、結果として 内容は動画B、設定は動画A という性質をもつ動画 B2 が強引に作成されてしまう 感じになります。さらに音声部分についても -map 1:a:0 オプション によって動画BのものがB2に書き込まれる感じになりますので、 動画Aの要素は動画の設定以外はまったく残らない感じになってしまいます。 ‥でもちょっと動画の画質は落ちるかな? それが気になるときは -crf オプションを使って こんな感じ:
% ffmpeg -i A -i B -filter_complex "overlay=x=0:y=0" -map 1:a:0 -crf 18 -preset ultrafast B2
こうすると少しマシになるかな? という感じです。

こうして作成した動画ファイル: B2 を B のかわりに使えばほぼ動画を合体することが できるはずですけど、それでもダメだったことがありました。そのとき何が問題だったか といえば音声データでした。動画の画像の設定が一致していても、音声データの設定が 一致してないとやっぱ合体できないんですよね。

 音声データ形式の変換方法については、 これまで一度くらいしかやったことがないので忘れてしまいました😅 思い出したら追記します。 (映像のほうだけあれば良い、音声はどうでもいい‥という時であれば、 上で紹介したコマンドラインから -map 1:a:0 部分を外せば 音声形式は動画Aのものになるので面倒はなくなるはずです)

[Table of Contents]

動画の属性を知る

あ、そうそう。動画のサイズとかフレームレートとかを知りたいときは単純に以下:

% ffmpeg -i IMG_0001.m4v
こんな感じに実行すると、いろんな表示が出ます。その中に以下:
Stream #0:1(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 10485 kb/s, 29.86 fps, 29.97 tbr, 600 tbn, 50 tbc (default)
こんな情報があって、それでこの動画は h264 形式の、1920x1080 サイズの、 SAR が 1:1、DAR が 16:9 ( = 1920:1080 )、 フレームレート29.86fps の動画であることがわかります。



[次] FFFTP v3に切り替え 2018/05a