#要約
- Ubuntuにffmpegをインストールして動画のHz変換をした.
- たくさんあるファイルをコマンド一発で変換したかったので, そのためのShellScriptを書いた.
- Gistにあげた
#やったこと
動画をCNNで機械学習させるため, 30Hzの動画を10Hzに加工して, 画像として切り出したかった. そのためにまず動画のダウンサンプリングをした.
動画を扱うUbuntuのソフトとしてffmpegが有名なようなので, それをダウンロードして使った.
動画のファイルがたくさんあっていちいちコマンドを打つのが大変めんどくさいのでShellSprictを書いてコマンド一発で動くようにした.
#ffmpegのインストール
Qiitaを参考にコマンド3つで簡単インストール.
コマンドは以下.
$ wget http://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz
$ tar xvf ffmpeg-release-64bit-static.tar.xz
$ sudo cp ./ffmpeg-release-64bit-static/ffmpeg /usr/local/bin
参考:Ubuntu 14.04 で最新の ffmpeg を簡単かつクリーンにインストールする方法
#Shellscriptのコード
今回は「そもそもShellScriptって何だよ」というところから始めたのでちょっと大変だった. でもこれを学んでおいて本当に良かったと思う. Script書いて放置でいいので, 作業の捗り度が本当に段違い. もっと早く, できればUbuntuインストールと同時くらいで学びたかった.
書いたScriptはこちら.
#!/bin/sh
for FILE in */*.avi
do
FILENAME=`echo ${FILE} | sed 's/\.[^\.]*$//'`
ffmpeg -i ${FILENAME}.avi -r 10 -qscale 0 ${FILENAME}_10Hz.avi
done
参考
#コード解説
#!/bin/sh
#!/bin/sh
このファイルがShellsprictファイル(.sh)であることを示す.
ファイル参照とループ処理
for FILE in */*.avi
do
#何らかの処理
done
○○という名前の1階層下のディレクトリにある○○.aviというファイルを探してきて, そのファイルすべてに何らかの処理を実行.
見つけたファイル名は順番にFILEに書き込まれ, ループ処理をする.
取得したファイル名から拡張子を削除
FILENAME=`echo ${FILE} | sed 's/\.[^\.]*$//'`
.aviファイルを見つけてきたはいいものの, 変換後のファイルを違う名前で保存したいので拡張子部分.aviを取り除く.
また.shファイルのルールとして以下がある.
- 変数を呼び出す時は${}で囲う.
- echoなどコマンドラインに結果を出力するようなコマンドの結果を代入するときは``で囲う.
ffmpegで動画変換
ffmpeg -i ${FILENAME}.avi -r 10 -qscale 0 ${FILENAME}_10Hz.avi
動画変換部分. -iの後が読み込みたいファイル名 -r がHz指定である.
今回は読み出したファイル名+_10Hz.aviを書き出すという使い方になっている.
ちなみにここを変更するだけで動画から画像の切り出し等, 様々な動画加工を行える.
参考:ffmpegの使い方
#実行方法
このスクリプトがあるフォルダに移動して
bash Hz_changer.sh
またこのファイルはディレクトリの構成として
- Hz_changer.sh
- dir1
- video1.avi
- video2.avi
- dir2
- video1.avi
- video2.avi
- video3.avi
のような感じを考えて作られている. ディレクトリ構成によってFILE読み出し部分は適宜修正が必要.
#実行結果
上のような構成に対して実行すると
- Hz_changer.sh
- dir1
- video1.avi
- video1_10Hz.avi
- video2.avi
- video2_10Hz.avi
- dir2
- video1.avi
- video1_10Hz.avi
- video2.avi
- video2_10Hz.avi
- video3.avi
- video3_10Hz.avi
こんな感じになると思う.
自分はさらにこのあとほぼ同じような処理で画像に切り出すのでこれでよかったが,別ファイルに保存したい場合はmkdirコマンドで新しくディレクトリを作って, mvコマンドなどで移動させると良いと思う.
#終わりに
ShellScript有能すぎるのでこれからもどんどん使っていきたい.