ビデオファイルの扱いメモ

画像ファイルの扱い にも関連情報(主に imagemagick )あり


ffmpeg を使って、動画にテキスト入れる、複数の動画を並べる 2017年10月11日

動画を回転させる

ffmpeg(avconv) で動画を回転させる に従う

「-vf オプション」を使う

テキストのオーバーレイ

ffmpegで動画にテキストをオーバーレイするffmpegで動画上にテキストを描画する に従う

ttfファイルが作業ディレクトリの中にないと上手く動かなかったので、ウィンドウズのttfファイルをコピーした。

「-b:v 20000k」としてビットレートを元の動画よりずっと高くして、動画の劣化を防いだ。指定しないとビットレートは低めになる。今回は 17769 kb/s だったので、20000k を指定した。

回転とテキストオーバーレイを一緒に

  ffmpeg -i infile.avi -vf "transpose=1,transpose=1,
  drawtext=fontfile=DejaVuSans.ttf:
  text='This is a text to be superimposed':fontsize=11:x=10:y=10:
  fontcolor=white" -b:v 20000k outfile.avi
 (適当に改行しています)

黒枠を付ける

Windows の ffmpeg で生放送する方法

「-vf オプション」を使う

 ffmpeg -i infile.avi -vf "pad=(iw+40):(ih+40):20:20"
 -b:v 20000k outfile.avi

iw、ih は入力動画の幅、高さ

ふたつを左右に並べる(hstack)

【ffmpeg】 比較動画の作り方

 ffmpeg -i left.avi -i right.mp4 -filter_complex hstack outfile.avi

更に上下に並べる(vstack)

ここでは、ファイルサイズを少し小さくする。 18MBを下回るように -b:v を調整。

 ffmpeg -i upperfile.avi -i lowerfile.avi -b:v 4000k
 -filter_complex vstack outfile.avi

ビデオファイルの扱いメモ 2016年10月20日+随時

バッチファイルで処理

同じフォルダにバッチファイル(○○.bat)を置いておけば、ダブルクリックでOK

MTSファイルを結合する

Windows の copy コマンドを利用

コマンド例

copy /b 00000.MTS+00001.MTS+00002.MTS+00003.MTS+00004.MTS+00005.MTS+00006.MTS+00014.MTS 20161015-1.MTS

オプション

/b

binary でコピーするよう指定(デフォルトは text)

MTSファイルを mp4ファイルに変更する

ffmpeg を利用(https://ffmpeg.org/

コマンド例

ffmpeg -i 20161015-1.MTS  -codec copy -map 0:0 20161015-1.mp4

オプション

-i (ファイル名)

入力ファイル名を指定

-codec copy

コーデックを変更しない指定
録画したコーデックやフレームレートを維持したまま動画ファイル形式を変更するために指定する
録画はAVCHDのカムコーダ(ソニーハンディカム)で行うので、コーデックはH.264、フレームレートは 29.97 fps
mp4ファイルの再生にはコーデック H.264(または MPEG-4 AVC)に対応したプレーヤが必要

-map 0:0

オプションは映像のみを取り出し mp4ファイルに格納する指定
音声データは含まれず、その分ファイルサイズも小さくなる

一部分のフレームの切り出し 2016年11月1日

2分のところから25分間切り出し

ffmpeg -ss 120 -i infile.mp4 -t 1500 -vcodec copy outfile.mp4
-ss 数値

切り出し始めの時間(秒)

-t 数値

切り出し継続時間(秒)

-vcodec copy

ビデオコーデックを変更しない指定

一部分の切り抜き(クロップ) 2016年11月1日

コーデック:H.264
横×縦:1920×1080
を横3、縦2の6分割した右下を切り抜きする場合

左上中上右上
左下中下右下
ffmpeg -i infile.mp4 -vf crop=640:540:1280:540 outfile.mp4
-vf crop=W:H:X:Y

切り抜きサイズと位置の指定
W:切り抜き後の幅
H:切り抜き後の高さ
X:左からの切り抜き位置
Y:上からの切り抜き位置

←X→
Y
←W→
H

ビデオコーデックを変更しない指定はできない
必ずエンコードする必要あり

サイズ変更 2020年5月14日

結論から言うと、解像度やアスペクト比を変更するときには、 画質をめちゃめちゃ低くしたいのでなければ、-crf オプションや 映像ビットレートを指定せずとも、ffmpeg がいい感じにやってくれる。
例)4K(3840:2160)のビデオを854:480へ変更したところ、 映像ビットレートは 55187kbps から 529kpbs になった。 たぶん、これは標準的な感じのビットレート。
つまり、解像度やアスペクト比の変更のコマンドを発行するだけでよさそう。

解像度やアスペクト比の変更

オプション:-vf scale=854:-1 など(-1は元の比を維持する)

$ ffmpeg -i ifile.mp4 -vf scale=854:-1 ofile.mp4

VGA(640 × 480)の 480p の垂直解像度でアスペクト比 16:9なら、 (割り切れないのだけれど)854:480 となる(YouTube などはこれ)。

ファイルサイズを小さくする

オプション:-crf 32 など(デフォルトは 23)

$ ffmpeg -i ifile.mp4 -crf 32 ofile.mp4

数字が大きくなるとファイルサイズが小さくなる(画像は荒くなる/画質は低下)

ファイルサイズを小さくする(映像ビットレートの変更)

オプション:-b:v 400k など(めちゃめちゃ大きな数字にするとほぼ元と同じになる)

$ ffmpeg -i ifile.mp4 -b:v 400k ofile.mp4

数字が小さくなるととファイルサイズが小さくなる(画像は荒くなる/画質は低下)

静止画から動画を作成する

アニメーションGIFでいいのでは?と思うかもしれませんが、 アニメーションGIFではシークバーないし、256色だし、 色数はアニメーションPNG(APNG)でクリヤできるけど、 どっちにしろシークバーないので使いづらい、 という場合に動画がよいと思うのです。

静止画のピクセル数が縦横ともに、偶数でないといけない。どちらかが奇数だと

height not divisible by 2 (1500x925)
width not divisible by 2 (1257x830)

などとエラーが出る(なぜ幅も偶数の必要があるのかしら???)。

1枚の静止画から動画を作成する 2020年5月20日

$ ffmpeg -loop 1 -i ifile.png -vcodec libx264 -pix_fmt yuv420p -t 3.0 -r 30 ofile.mp4

これで、静止画が mp4 の動画になる(音声なし)。

パラメタの説明

-loop 1           ← ループさせる: -loop は boolian なので(本家マニュアル)、1 でON
-vcodec libx264   ← 映像コーデック H.264:今はこれ一択ですね 
-pix_fmt yuv420p  ← 動画フォーマット:mpeg系列なら yuv420p 一択
-t 3.0            ← 継続時間(秒)
-r 30             ← フレーム/秒:デフォルトは 25

参考:
http://tecsingularity.com/ffmpeg/make-movie/
https://ffmpeg.org/ffmpeg-filters.html

複数の静止画から動画を作成する 2020年5月27日

分子生物学の分野の人は、タイムラプス撮影したものを動画に変換するとき、 imageJ を使うのではないかと思いますが、 imageJ ではいまひとつな場合があって。
1枚の静止画から作成した動画を結合してもいいのですが、 連番の静止画から一気に動画を作ると手間が少ない。

$ ffmpeg -y -r 1.0 -i %02d.png -b:v 3000k -c:v h264 -pix_fmt yuv420p -r 30 out.mp4

パラメタの説明

-y                    ← 上書きなどの [y/N] に y と答える
-r 1.0(はじめのもの)  ← 1秒間に何枚静止画を出すかの指定(0.2なら5秒間同じ画像)
-b:v 3000k            ← ビットレート:大きいと綺麗になる
-c:v h264             ← 映像コーデック H.264:今はこれ一択
-pix_fmt yuv420p      ← 動画フォーマット:mpeg系列なら yuv420p 一択
-r 30(後のもの)      ← 動画のフレーム/秒:デフォルトは 25 

ビットレートの指定(-b:v 3000k)を省略すると、 いい感じにファイルサイズが小さめになる (画像も無駄に綺麗にはならない=荒くなるともいえるが)

参考:https://qiita.com/ran/items/28641a7a0ad8a40c8f72

imageJ でのタイムラプス動画作成 2020年5月27日

連続画像読み込み:[File]→[Import]→[Image Sequence...]
動画として保存:[File]→[Save As]→[AVI...]
参考:http://tec.miyakyo-u.ac.jp/hoshi/imagej2016/image_to_movie.html

複数の静止画をトリミングしてから動画を作成する 2020年5月27日

下準備:位置合わせを photoshop で行い、 連番の PNGファイルを作成しておく。

といった shell script
この script のあるディレクトリにファイルをコピーし、 script を実行すれば($ sh genmovie.sh)、動画ができる。 トリミングの指定は個々にしておくべきですが、 もしかしたらルーチンの作業の場合 (=photoshop での加工で画像がいつも同じ位置になるよう仕上げられるなら)、 トリミングの指定はいつも同じまま使えるかもしれません。

genmovie.sh

#!sh
linenum=`ls | grep png | wc -l` # カウント
echo "Number of PNG files:" $linenum
#
for i in `seq -f %02g 1 $linenum`
do
    echo "Now trimming:" $i.png
    convert $i.png -crop 1920x1080+1047+622 t$i.png
#    convert $i.png -crop 1920x1080+1047+622 -normalize n$i.png
    convert $i.png -crop 1920x1080+1047+622 -linear-stretch 0x0.0001% l$i.png
    #
    rev=`expr $linenum \* 2 - $i` # 折り返しの画像を1枚にする
    for rev2 in `seq -f %02g $rev $rev` # 1枚だけコピー
    do
	cp t$i.png  t$rev2.png
    done
done
#
ffmpeg -y -r 1.0 -i t%02d.png -c:v h264 -pix_fmt yuv420p -r 30 out.mp4
ffmpeg -y -r 1.0 -i t%02d.png -vf scale=320:-1 -c:v h264 -pix_fmt yuv420p -r 30 out320.mp4
ffmpeg -y -r 1.0 -i l%02d.png -c:v h264 -pix_fmt yuv420p -r 30 outl.mp4
ffmpeg -y -r 1.0 -i l%02d.png -vf scale=320:-1 -c:v h264 -pix_fmt yuv420p -r 30 outl320.mp4

メモ:

for i in {01..$linenum}

では上手く行かなかったので、seq を使った
連番の二桁の数値 00〜99 を使いたいので、 ひとつのファイルのコピーにあたっても seq を使った

-normalize ←  to -contrast-stretch 2%x1% と同じ
-linear-stretch 0x0.0001%

どちらもコントラストを強める補正
オプションの -linear-stretch と -contrast-stretch は よく似ているが、-linear-stretch は the image colors are stretched mathematically で、 一方、-contrast-stretch は using the histogram bins との違いがある。 どっちが美しいのかよくわからないけれど、histogram bins を 使ってしまうと、結果的にガンマを触っていることになりそうなので、 ぼくらの仕事の分野ではよくないような気がする。
似たもので -auto-level があるが、これは real-life images には使わない(使えない)。外れ値があった場合、もろに影響されてしまうため。

※ -contrast-stretch の説明では、 -normalize は -contrast-stretch 0.15x0.05% と同じと書いてあり、矛盾がある

参考: https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337
https://qiita.com/katsukii/items/383b241209fe96eae6e7
https://qiita.com/cakipy/items/60353b22bbe852946da0
https://qiita.com/ran/items/28641a7a0ad8a40c8f72
https://qiita.com/yoya/items/1da8e8e04881bab67015
https://imagemagick.org/script/command-line-options.php

動画(コントラスト強めたもので、解像度 320:180 のもの)はこちら↓

&nowiki(video:http://www.cis.kit.ac.jp/~tomaru/pukiwiki/?plugin=attach&pcmd=open&file=catmovie320.mp4&refer=movie_files);

01-small.png

複数の動画を結合する 2020年5月27日

これは黒魔術です

mylist.txt:

file mydir5/mymovie08.mp4
file mydir2/mymovie02.mp4
file mydir4/mymovie13.mp4
file mydir3/mymovie04.mp4

「file」は、「file」と書いておかないと魔術は使えません
異なるディレクトリに対して魔術は使えます

$ ffmpeg -f concat -i mylist.txt -vcodec copy output.mp4

呪文には派生がいろいろありますが、同じ種類の複数の「生贄」から、 ひとつの魔物を作るだけなら、コーデックは変える必要はありません

参考:https://qiita.com/niusounds/items/c386e02ab8e67030bdc0

動画フォーマット 2020年5月20日

$ ffmpeg -pix_fmts

とすると何があるかわかる。
yuv420p は入出力のフォーマットのフラグが立っていて、

NB_COMPONENTS   3
BITS_PER_PIXEL 12

とのこと。
ウィキペディア によると、YUV は輝度信号Yと、2つの色差信号を使って表現される色空間。 現時点では、MPEG圧縮は YUM は 4:2:0 とのこと。 mp4 動画を作るときは yuv420p でよい。

フレーム/秒 2020年5月20日

アナログカラーテレビ(NTSC規格:米国や日本)では 29.97 fps。
現在も DVD などのデジタルでもこれのようです。 手元の、ソニーハンディカムも 29.97 fps でした。 後で、普通の動画と合成する予定があるのなら、一致させるべきでしょうけど、 単独で閲覧させる場合は悩ましい……。

参考:http://digitalcamera.support.fujifilm.jp/app/answers/detail/a_id/19371/
参考:https://mossan99.hatenablog.com/entry/2013/03/28/160907

動画からの静止画の切り出し 2020年6月24日

1枚切り出す

ffmpeg -i ifile -ss 始点(秒) -vframes 1 -f image2 output.jpg

複数枚を連続で切り出す

ffmpeg -i ifile -ss 始点(秒) -t 終点(秒) -r 数字(1秒あたり枚数) -f image2 %06d.jpg

000001.jpg で連番で出力される

参考:
https://w.atwiki.jp/kobapan/pages/161.html
https://qiita.com/matoken/items/664e7a7e8f31e8a46a60

動画の明るさの調整 2020年5月25日

暗く撮影してしまった動画の明さを調整したいときなど

$ ffmpeg -i ifile.mp4 -vf eq=brightness=0.5:saturation=1.5:contrast=1.5 ofile.mp4

参考:
https://ffmpeg.org/ffmpeg-filters.html
https://hfuji.hatenablog.jp/entry/2018/02/03/232126
https://qiita.com/riversun/items/6ff25fe8620457342a5e

動画の音声の変更

https://ffmpeg.org/ffmpeg-filters.htm

stream のどこに動画(ビデオ)や音声(オーディオ)が入っているかを知ら ないと触れないことがある。まずは、そこで、ちょいと調べる。

$ ffmpeg -i -ifile.mp4
……
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9] (略)
……
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo,  (略)

のようになっている。これは、

別な音声だけのファイルの例として

$ ffmpeg -i -ifile.mp3
Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 192 kb/s

これは、

AAC: Advanced Audio Coding ← 普通の動画ならこれで(が?)よい
MP3: MPEG-1 Audio Layer-3
どちらも PCM(pulse code modulation)ではないので、 音声が圧縮されていること(場合によっては)注意

動画の音源を差し替える 2020年5月25日

ビデオはこっちの stream、 オーディオはあっちの stream というのを、-map オプションを使って指定する。

例えば

$ ffmpeg -i ifile.mp4 -i ifile.mp3 -c:v copy -c:a aac -strict experimental -ar 48000 -af volume=0.5 -map 0:v -map 1:a ofile.mp4
-c:v copy ← ビデオコーデックは入力のものを使う
-c:a aac -strict experimental ← オーディオコーデックの AAC への変更
-ar 48000 ← サンプリング周波数を 48 kHz へ
-af volume=0.5 ← 音の大きさを 0.5倍に
-map 0:v -map 1:a ofile.mp4 ← ビデオを stream 0、オーディオを stream 1 に

音声の大きさを調整するときは倍数か dB で指定できる

-af volume = 0.5 ← デフォルトは 1
-af volume = 10dB ← 使い途がわからん

結果は

$ ffmpeg -i ofile.mp4
……
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9] (略)
……
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)

で音声の変換もできた。

音声ファイルの音声が短いと、終わったあとは無音になる。

オーディオコーデックの AAC への変更 2020年5月25日

aac の指定に加え、オプション-strict experimental が必要

-c:a aac -strict experimental

サンプリング周波数の変更 2020年5月25日

オプション -ar を使う

$ ffmpeg -i ifile.mp4 -ar 48000 ofile.mp4 

48,000 Hz になる ← DVD などの音声は 48000 Hz になる
パワーポイントから動画を作成すると、入力音声が 44,100 Hz になる ← CD と同じ
ビデオカメラで撮ったものと同じにしたいときなど変換するといいのかもしれない

音声ファイルだけの変更もできる

$ ffmpeg -i ifile.mp3 -c:a aac -strict experimental -ar 48000 -af volume=0.5 ofile.mp3

https://ffmpeg.org/ffmpeg-filters.htm

音声を削除する 2021年9月23日

オプション -an を使う
オプション -vcodec copy でビデオコーデックの変更をしない(速い)

$ ffmpeg -i ifile.mp4  -vcodec copy -an ofile.mp4 

無音の音声ファイルを作る 2022年6月9日

音声トラックがない動画ファイルに、無音の音声を入れたいことがある。そういうときに使える。

$ ffmpeg -t 60 -f lavfi -i aevalsrc=0 -ac 2 nosound.mp3

こうしてできた無音の音声ファイルを動画の音声トラックに入れる

$ ffmpeg -i movie-nosoundtrack.mp4 -i nosound.mp3 -c:v copy -c:a aac -strict experimental -ar 48000 -af volume=0.5 -map 0:v -map 1:a movie-nosound.mp4

音声トラックなし動画ファイルに、無音の音声を入れるとき、 音声ファイルが動画より短かい場合は後は無音となるそうな。

参考:【ffmpeg】動画の音声を無音に差し替える方法

音声がついていない動画に無音の音声を付ける 2022年6月9日

$ ffmpeg -i movie-nosoundtrack.mp4 -f lavfi -i aevalsrc=0:s=48000 -ac 2 -shortest movie-nosound.mp4

参考:【ffmpeg】動画の音声を無音に差し替える方法

動画を加工する 2021年5月19日

撮影/作成した動画のフレームレート(fps)や音声を加工して、ファイルサイズや聞き易さや時間(早回し)などをする。

例えば、 画質を落とし(crfを大きく)、 フレームレートをNTSC規格の 29.97 fps に、 速度を 1.05倍に(画像と音声共に)、 音声のサンプリング周波数を落とし(22050 Hz)、 高音をカット(10700 Hz以下)、 オーディオコーデックをmp3に、 とするなら

$ ffmpeg -i movie.mp4 -crf 32 -r 29.97 -vf setpts=PTS/1.05 -af asetrate=44100*1.05 -ar 22050 -cutoff 10700 -acodec libmp3lame small-fast.mp4

マイクロソフトパワーポイントから出力した動画はフレームレートが 30.30 fps という半端だった。なぜ?

参照

ffmpeg で GPU を使ってみる 2020年5月25日

自慢の品というのではない GPU (ノートに入っているCPUの内蔵GPU、インテル HD グラフィックス) を使ってみるには……

$ ffmpeg -hwaccel auto 以下略

でよい(単に動かせる、ということかもしれぬ)。

参考:
https://trac.ffmpeg.org/wiki/HWAccelIntro
https://stackoverrun.com/ja/q/10007990

試してみたところ

$ ffmpeg -hwaccel auto -i ifile.mp4 -vf "eq=brightness=0.2:saturation=1.5,scale=960:-1" -c:v libx264  -b:v 400k ofileha.mp4 ← オプションあり
$ ffmpeg -i ifile.mp4 -vf "eq=brightness=0.2:saturation=1.5,scale=960:-1" -c:v libx264  -b:v 400k ofile.mp4

オプションありでは、タスクマネジャーを見ると、GPU を使っているのがわかった。 しかし、「あり」では、時間が2倍くらい長く掛ってしまった(2分20秒 vs. 1分10秒)。 だからといって CPUの使用量(%)が減る訳でもなし。
自慢の品の GPU がないと、そして、専用オプションを使わないと、 GPU を使ってもあまり得にはならないようです。

Today:1Yesterday:4Total:7922 since 20 October 2016

添付ファイル: file01-small.png 88件 [詳細] filecatmovie320.mp4 165件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 16 Sep 2022 (金) 14:51:07 (580d)