labunix's blog

labunixのラボUnix

非コンパイルなffmpegで動画のサムネイルを自動作成する(debian squeeze)

ffmpegの導入

$ sudo apt-get install -y ffmpeg
$ sudo apt-get build-dep -y ffmpeg

■対象となる動画の拡張子をすべて列挙する。

$ find . -type f -print | sed s/".*\."//g | tr [A-Z] [a-z] | sort -u | xargs echo -n | sed s/" "/"\\\\\|"/g;echo ""
avi\|flv\|m4v\|mp4\|mpg

■対象となる動画がデコード可能か確認する。

$ ffmpeg -formats 2>&1 | grep "^ D" | grep --color -i "avi\|flv\|m4v\|mp4\|mpg"
 DE avi             AVI format
 DE flv             FLV format
 DE m4v             raw MPEG-4 video format
 D  mov,mp4,m4a,3gp,3g2,mj2 QuickTime/MPEG-4/Motion JPEG 2000 format
 DEVSD  flv             Flash Video (FLV)
 D A    mp3on4          MP3onMP4
 D V D  vqavideo        Westwood Studios VQA (Vector Quantized Animation) video

■ファイル名にスペースが無いか
 古い「avi」「mpg」にはスペースがありません。

$ find . -type f -iname "*.avi" -print | grep " " | wc -l
0
$ find . -type f -iname "*.flv" -print | grep " " | wc -l
2604
$ find . -type f -iname "*.m4v" -print | grep " " | wc -l
7
$ find . -type f -iname "*.mp4" -print | grep " " | wc -l
75
$ find . -type f -iname "*.mpg" -print | grep " " | wc -l
0

■ファイル名にスペースが無い場合

$ find . -type f -iname "*.avi" -print | \
  for list in `xargs`;do \
    ffmpeg -i "$list" -f image2 -ss 15 -vframes 1 -s 214x120 $(echo "$list" | sed s/"\.avi\|\.AVI"/"\.jpg"/); \
  done

$ find . -type f -iname "*.mpg" -print | \
  for list in `xargs`;do \
    ffmpeg -i "$list" -f image2 -ss 15 -vframes 1 -s 214x120 $(echo "$list" | sed s/"\.mpg\|\.MPG"/"\.jpg"/); \
  done

■ファイル名にスペースがある場合
 ※一時的にスペースを「_」の10個連続に変換。
  「_」を10個も連続で含むファイルがあるなら、ファイル名の方を考え直したほうが良い。

$ find . -type f -iname "*.m4v" -print | \
  sed s/" "/"__________"/g | \
  for list in `xargs`;do \
    NAME=$(echo "$list" | sed s/"__________"/" "/g); \
    ffmpeg -y -i "$NAME" -f image2 -ss 15 -vframes 1 -s 214x120 "$(echo "$NAME" | sed s/"\.m4v\|\.M4V"/"\.jpg"/)"; \
  done

$ find . -type f -iname "*.mp4" -print | \
  sed s/" "/"__________"/g | \
  for list in `xargs`;do \
    NAME=$(echo "$list" | sed s/"__________"/" "/g); \
    ffmpeg -y -i "$NAME" -f image2 -ss 15 -vframes 1 -s 214x120 "$(echo "$NAME" | sed s/"\.mp4\|\.MP4"/"\.jpg"/)"; \
  done

$ find . -type f -iname "*.flv" -print | \
  sed s/" "/"__________"/g | \
  for list in `xargs`;do \
    NAME=$(echo "$list" | sed s/"__________"/" "/g); \
    ffmpeg -y -i "$NAME" -f image2 -ss 15 -vframes 1 -s 214x120 "$(echo "$NAME" | sed s/"\.flv\|\.FLV"/"\.jpg"/)"; \
  done

■エラーがあったら、ファイル名を出力
 ※「シングルクォート」はエラーになるので、ファイル名を変えた方が良い。

$ find . -type f -iname "*.avi" -print | \
  for list in `xargs`;do \
    ls $(echo "$list" | sed s/"\.avi\|\.AVI"/"\.jpg"/) > /dev/null 2>&1 || echo "$list"; \
  done

$ find . -type f -iname "*.mpg" -print | \
  for list in `xargs`;do \
    ls $(echo "$list" | sed s/"\.mpg\|\.MPG"/"\.jpg"/) > /dev/null 2>&1 || echo "$list"; \
  done
./camera/20090201.mpg

$ find . -type f -iname "*.m4v" -print | \
  sed s/" "/"__________"/g | \
  for list in `xargs`;do \
    NAME=$(echo "$list" | sed s/"__________"/" "/g); \
    ls "$(echo "$NAME" | sed s/"\.m4v\|\.M4V"/"\.jpg"/)" > /dev/null 2>&1 || echo "$NAME"; \
  done

$ find . -type f -iname "*.mp4" -print | \
  sed s/" "/"__________"/g | \
  for list in `xargs`;do \
    NAME=$(echo "$list" | sed s/"__________"/" "/g); \
    ls "$(echo "$NAME" | sed s/"\.mp4\|\.MP4"/"\.jpg"/)" > /dev/null 2>&1 || echo "$NAME"; \
  done

$ find . -type f -iname "*.flv" -print | \
  sed s/" "/"__________"/g | \
  for list in `xargs`;do \
    NAME=$(echo "$list" | sed s/"__________"/" "/g); \
    ls "$(echo "$NAME" | sed s/"\.flv\|\.FLV"/"\.jpg"/)" > /dev/null 2>&1 || echo "$NAME"; \
  done

■失敗したファイルの対処
 真っ黒な画像を準備、コピーする。

$ apt-file search convert | grep bin | grep "\/convert\$"
graphicsmagick-imagemagick-compat: /usr/bin/convert
imagemagick: /usr/bin/convert
imagemagick-dbg: /usr/lib/debug/usr/bin/convert

$ sudo apt-get install -y imagemagick
$ convert -size 214x120 xc:black black.jpg
$ find . -type f -print | \
  sed s/"\.avi\|\.flv\|\.m4v\|\.mp4\|\.mpg"/"\.jpg"/g | \
  sed s/" "/"__________"/g | \
  for list in `xargs`;do \
    ls "$(echo "$list" | sed s/"__________"/" "/g)" > /dev/null 2>&1 || cp black.jpg "$(echo "$list" | sed s/"__________"/" "/g)"; \
  done

■確認
 「black.jpg」の分、1多い。

$ find . -type f -print | grep "\.jpg" | wc -l
3761
$ find . -type f -print | grep -i "\.avi\|\.flv\|\.m4v\|\.mp4\|\.mpg" | wc -l
3760
$ find . -type f -print | grep "black.jp"
./black.jpg

■後片付け

$ sudo apt-get remove -y imagemagick
$ sudo apt-get autoremove

-------------------------------------------------------------------------------
デスクトップユーザなら、以下の方が楽or「black.jpg」を使わなくて済むかも。。。

■totemの場合

 linuxで簡単サムネイル画像の作成?
 http://freestyle.nvo.jp/archives/295

$ sudo apt-get install -y apt-file
$ sudo apt-file update
$ apt-file search totem | grep thumb | grep bin
totem: /usr/bin/totem-video-thumbnailer
totem-dbg: /usr/lib/debug/usr/bin/totem-video-thumbnailer

■私の環境にはtotemは導入されていない。

$ find /usr -type f -name "*totem*" -o -name "*gstreamer*" -print | grep bin
/usr/bin/gnome-volume-control.gstreamer
/usr/bin/gstreamer-properties

$ apt-file search gnome-volume-control.gstreamer
gnome-media: /usr/bin/gnome-volume-control.gstreamer
$ apt-file search streamer-properties | grep bin
gnome-media: /usr/bin/gstreamer-properties

■mplayer単体の場合

 【NOT MPlayerThumbs】Linuxでイケてる動画サムネイル
 http://mutous.blog120.fc2.com/blog-entry-201.html

$ apt-file list mplayerthumbs | grep bin
mplayerthumbs: /usr/bin/mplayerthumbsconfig

■mplayer+imagemagicの場合

 動画からサムネイル画像を生成する
 http://wiki.princo.org/?%C6%B0%B2%E8%A4%AB%A4%E9%A5%B5%A5%E0%A5%CD%A5%A4%A5%EB%B2%E8%C1%FC%A4%F2%C0%B8%C0%AE%A4%B9%A4%EB

$ apt-file search mplayer | grep bin
fvwm-crystal: /usr/bin/fvwm-crystal.mplayer-wrapper
gnome-mplayer: /usr/bin/gnome-mplayer
gnome-mplayer-dbg: /usr/lib/debug/usr/bin/gnome-mplayer
kdemultimedia-dbg: /usr/lib/debug/usr/bin/mplayerthumbsconfig
kmplayer: /usr/bin/kmplayer
mplayer: /usr/bin/mplayer
mplayer: /usr/share/mplayer/binary_codecs.sh
mplayer-dbg: /usr/lib/debug/usr/bin/gmplayer
mplayer-dbg: /usr/lib/debug/usr/bin/mplayer
mplayer-doc: /usr/share/doc/mplayer-doc/tech/binary-packaging.txt.gz
mplayer-gui: /usr/bin/gmplayer
mplayerthumbs: /usr/bin/mplayerthumbsconfig
remuco-mplayer: /usr/bin/remuco-mplayer
smplayer: /usr/bin/smplayer
stymulator: /usr/bin/ymplayer

$ apt-file search montage | grep bin
graphicsmagick-imagemagick-compat: /usr/bin/montage
imagemagick: /usr/bin/montage
imagemagick-dbg: /usr/lib/debug/usr/bin/montage
netpbm: /usr/bin/pnmmontage

■mplayerもimagemagicも私の環境には無い。

$ find /usr -type f -name "*mplayer" -o -name "*montage" -print

■ファイルマネージャ(ffmpegthumbnailer)の場合

 Xubuntuで動画サムネイルを表示させる方法
 http://www.uetyi.mydns.jp/wordpress/linux-desktop/entry-579.html 

$ apt-file search ffmpegthumbnailer | grep bin
ffmpegthumbnailer: /usr/bin/ffmpegthumbnailer
ffmpegthumbnailer-dbg: /usr/lib/debug/usr/bin/ffmpegthumbnailer

■「ffmpegthumbnailer」もはやり私の環境には無い。

$ find /usr -type f -name "ffmpegthumbnailer" -print

■ffmpeg単体の場合

$ apt-file search ffmpeg | grep bin
bitpim: /usr/share/bitpim/helpers/ffmpeg.lbin
ffmpeg: /usr/bin/ffmpeg
ffmpeg-dbg: /usr/lib/debug/usr/bin/ffmpeg
ffmpeg2theora: /usr/bin/ffmpeg2theora
ffmpegthumbnailer: /usr/bin/ffmpegthumbnailer
ffmpegthumbnailer-dbg: /usr/lib/debug/usr/bin/ffmpegthumbnailer
pfstools: /usr/bin/pfsoutffmpeg
smilutils: /usr/bin/ffmpeg2raw

■ffmpegも無かったw。

$ find /usr -type f -name "*ffmpeg*" -print | grep bin

■ffmpeg+apache+PHP

 動画ファイルからサムネイル作成ツール
 http://blog.ishiro.com/?p=182

■一応PHPはあるが頼りたくない。

$ dpkg -l | grep -i php | grep ^ii | awk '{print $2}' | column
libapache2-mod-php5     php5-cli                php5-mysql
php-pear                php5-common             php5-suhosin
php5                    php5-gd