#author("2020-05-27T15:18:19+09:00","","") *ビデオファイルの扱いメモ [#ub893b9c] [[画像ファイルの扱い>image_files]] にも関連情報(主に imagemagick )あり ------ #contents * ffmpeg を使って、動画にテキスト入れる、複数の動画を並べる 2017年10月11日 [#c4e76e5c] ** 動画を回転させる [#k790b5d0] [[ffmpeg(avconv) で動画を回転させる>https://mgng.mugbum.info/815]] に従う 「-vf オプション」を使う - 左右反転 "hflip" - 上下反転 "vflip" - 右に90度回転 "transpose=1" - 180度回転 "transpose=1,transpose=1" - 右90度回転させて上下反転 "transpose=1,vflip" ** テキストのオーバーレイ [#weec52c5] [[ffmpegで動画にテキストをオーバーレイする>http://ja.akionux.net/wiki/index.php/ffmpegで動画にテキストをオーバーレイする]] や [[ffmpegで動画上にテキストを描画する>https://qiita.com/niusounds/items/797fe0743a9d59681446]] に従う - テキスト「This is a text to be superimposed」 - フォントサイズ「14」 - 位置「x=100」「y=100」 - フォントの色「white」← RGBカラーコードも可 - ビットレート「-b:v 20000k」 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 (適当に改行しています) **黒枠を付ける [#u08ac0a0] [[Windows の ffmpeg で生放送する方法>http://looooooooop.blog35.fc2.com/blog-entry-903.html#pad]] 「-vf オプション」を使う - pad=width:height:x:y:color ← デフォルトは黒~ 出力の幅:出力の高さ:余白の幅:余白の高さ ffmpeg -i infile.avi -vf "pad=(iw+40):(ih+40):20:20" -b:v 20000k outfile.avi iw、ih は入力動画の幅、高さ ** ふたつを左右に並べる(hstack) [#e6636573] [[【ffmpeg】 比較動画の作り方>http://looooooooop.blog35.fc2.com/blog-entry-990.html]] ffmpeg -i left.avi -i right.mp4 -filter_complex hstack outfile.avi ** 更に上下に並べる(vstack) [#y295b52f] ここでは、ファイルサイズを少し小さくする。 18MBを下回るように -b:v を調整。 ffmpeg -i upperfile.avi -i lowerfile.avi -b:v 4000k -filter_complex vstack outfile.avi *ビデオファイルの扱いメモ 2016年10月20日+随時 [#c433c8bc] ** バッチファイルで処理 [#dbb9c310] 同じフォルダにバッチファイル(○○.bat)を置いておけば、ダブルクリックでOK ***MTSファイルを結合する [#q492b2da] 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ファイルに変更する [#e479e7c5] 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日 [#f88646ca] 2分のところから25分間切り出し ffmpeg -ss 120 -i infile.mp4 -t 1500 -vcodec copy outfile.mp4 -ss 数値 切り出し始めの時間(秒) -t 数値 切り出し継続時間(秒) -vcodec copy ビデオコーデックを変更しない指定 ** 一部分の切り抜き(クロップ) 2016年11月1日 [#o2677246] コーデック: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日 [#v452c42c] 結論から言うと、解像度やアスペクト比を変更するときには、 画質をめちゃめちゃ低くしたいのでなければ、-crf オプションや 映像ビットレートを指定せずとも、ffmpeg がいい感じにやってくれる。~ 例)4K(3840:2160)のビデオを854:480へ変更したところ、 映像ビットレートは 55187kbps から 529kpbs になった。 たぶん、これは標準的な感じのビットレート。~ つまり、解像度やアスペクト比の変更のコマンドを発行するだけでよさそう。 *** 解像度やアスペクト比の変更 [#ef111b46] オプション:-vf scale=854:-1 など(-1は元の比を維持する) $ ffmpeg -i ifile.mp4 -vf scale=854:-1 ofile.mp4 VGA(640 × 480)の 480p の垂直解像度でアスペクト比 16:9なら、 (割り切れないのだけれど)854:480 となる(YouTube などはこれ)。 *** ファイルサイズを小さくする [#g31ba91d] オプション:-crf 32 など(デフォルトは 23) $ ffmpeg -i ifile.mp4 -crf 32 ofile.mp4 数字が大きくなるとファイルサイズが小さくなる(画像は荒くなる/画質は低下) *** ファイルサイズを小さくする(映像ビットレートの変更) [#i37d7114] オプション:-b:v 400k など(めちゃめちゃ大きな数字にするとほぼ元と同じになる) $ ffmpeg -i ifile.mp4 -b:v 400k ofile.mp4 数字が小さくなるととファイルサイズが小さくなる(画像は荒くなる/画質は低下) ** 静止画から動画を作成する [#v0b0b5ce] アニメーションGIFでいいのでは?と思うかもしれませんが、 アニメーションGIFではシークバーないし、256色だし、 色数はアニメーションPNG(APNG)でクリヤできるけど、 どっちにしろシークバーないので使いづらい、 という場合に動画がよいと思うのです。 静止画のピクセル数が縦横ともに、偶数でないといけない。どちらかが奇数だと height not divisible by 2 (1500x925) width not divisible by 2 (1257x830) などとエラーが出る(なぜ幅も偶数の必要があるのかしら???)。 *** 1枚の静止画から動画を作成する 2020年5月20日 [#p6b188c5] $ 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日 [#dd43ca73] 分子生物学の分野の人は、タイムラプス撮影したものを動画に変換するとき、 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日 [#qf66d733] 連続画像読み込み:[File]→[Import]→[Image Sequence...]~ 動画として保存:[File]→[Save As]→[AVI...]~ 参考:http://tec.miyakyo-u.ac.jp/hoshi/imagej2016/image_to_movie.html *** 複数の静止画をトリミングしてから動画を作成する 2020年5月27日 [#u4fa451a] 下準備:位置合わせを photoshop で行い、 連番の PNGファイルを作成しておく。 - Imagemagick 使ってトリミング - 往復の「復路」のファイルをコピー - 折り返し地点は1枚になるよう奇数の静止画を用意 - 一気に動画を作成 といった 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 # 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 メモ: for i in {01..$linenum} では上手く行かなかったので、seq を使った~ 連番の二桁の数値 01〜99 を使いたいので、 ひとつのファイルのコピーにあたっても seq を使った 参考:~ https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337~ https://qiita.com/katsukii/items/383b241209fe96eae6e7~ https://qiita.com/cakipy/items/60353b22bbe852946da0~ https://qiita.com/ran/items/28641a7a0ad8a40c8f72~ 動画はこちら↓(作成後、解像度を低く変換しています:480:270)~ #tinyvideo(http://www.cis.kit.ac.jp/~tomaru/pukiwiki/?plugin=attach&pcmd=open&file=catmovie-s.mp4&refer=movie_files, controls, autoplay) *** 複数の動画を結合する 2020年5月27日 [#w45f8cde] これは黒魔術です - 魔術書(結合する動画のリスト)を作成 - 呪文を唱える 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日 [#d5c431d2] $ ffmpeg -pix_fmts とすると何があるかわかる。~ yuv420p は入出力のフォーマットのフラグが立っていて、 NB_COMPONENTS 3 BITS_PER_PIXEL 12 とのこと。~ [[ウィキペディア>https://ja.wikipedia.org/wiki/YUV]] によると、YUV は輝度信号Yと、2つの色差信号を使って表現される色空間。 現時点では、MPEG圧縮は YUM は 4:2:0 とのこと。 mp4 動画を作るときは yuv420p でよい。 *** フレーム/秒 2020年5月20日 [#qa9c38ff] アナログカラーテレビ(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年5月25日 [#qdc5b112] 暗く撮影してしまった動画の明さを調整したいときなど $ ffmpeg -i ifile.mp4 -vf eq=brightness=0.5:saturation=1.5:contrast=1.5 ofile.mp4 - brightness: -1.0 〜 1.0 デフォルトは 0 - saturation: 0.0 〜 3.0 デフォルトは 1 - contrast: -1000.0 〜 1000.0 デフォルトは 1~ ほかガンマも触れる。 参考:~ https://ffmpeg.org/ffmpeg-filters.html~ https://hfuji.hatenablog.jp/entry/2018/02/03/232126~ https://qiita.com/riversun/items/6ff25fe8620457342a5e~ ** 動画の音声の変更 [#r62c99c3] 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, (略) のようになっている。これは、~ - stream 0 に ビデオ:ビデオコーデックが H.264、YUV4:2:0、アスペクト比 1920x1080 - stream 1 に オーディオ:オーディオコーデックが AAC、サンプリング周波数が 48,000 Hz、ステレオ とわかる。 別な音声だけのファイルの例として $ ffmpeg -i -ifile.mp3 Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 192 kb/s これは、~ - stream 0 に オーディオ:オーディオコーデックが mp3、サンプリング周波数が 44,100 Hz、ステレオ とわかる。 AAC: Advanced Audio Coding ← 普通の動画ならこれで(が?)よい~ MP3: MPEG-1 Audio Layer-3~ どちらも PCM(pulse code modulation)ではないので、 音声が圧縮されていること(場合によっては)注意 *** 動画の音源を差し替える 2020年5月25日 [#ua0dbfd2] ビデオはこっちの 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日 [#p8a44b24] aac の指定に加え、オプション-strict experimental が必要 -c:a aac -strict experimental *** サンプリング周波数の変更 2020年5月25日 [#g9e75fdf] オプション -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 ** ffmpeg で GPU を使ってみる 2020年5月25日 [#x23cc0ee] 自慢の品というのではない 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:&counter(today); |Yesterday:&counter(yesterday); |Total:&counter(); since 20 October 2016|