LoginSignup
13
19

More than 5 years have passed since last update.

ffmpegで複数動画ファイルを一括変換するShellscriptを書いたのでメモ

Last updated at Posted at 2016-11-25

要約

  • 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はこちら.

Hz_changer.sh
#!/bin/sh

for FILE in */*.avi
do
    FILENAME=`echo ${FILE} | sed 's/\.[^\.]*$//'`
    ffmpeg -i ${FILENAME}.avi -r 10 -qscale 0 ${FILENAME}_10Hz.avi
done

参考
* ファイルサーバーだけど、色々させていきたい。(ffmpeg編)
* 初心者向けシェルスクリプトの基本コマンドの紹介

コード解説

#!/bin/sh

Hz_changer.sh
#!/bin/sh

このファイルがShellsprictファイル(.sh)であることを示す.

ファイル参照とループ処理

Hz_changer.sh
for FILE in */*.avi
do
#何らかの処理
done

○○という名前の1階層下のディレクトリにある○○.aviというファイルを探してきて, そのファイルすべてに何らかの処理を実行.
見つけたファイル名は順番にFILEに書き込まれ, ループ処理をする.

取得したファイル名から拡張子を削除

Hz_changer.sh
FILENAME=`echo ${FILE} | sed 's/\.[^\.]*$//'`

.aviファイルを見つけてきたはいいものの, 変換後のファイルを違う名前で保存したいので拡張子部分.aviを取り除く.
また.shファイルのルールとして以下がある.

  • 変数を呼び出す時は${}で囲う.
  • echoなどコマンドラインに結果を出力するようなコマンドの結果を代入するときは``で囲う.

ffmpegで動画変換

Hz_changer.sh
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有能すぎるのでこれからもどんどん使っていきたい.

13
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
19