ffmpegで動画ファイルの詳細情報を取得する際にファイル名がSJISの場合ファイル指定に
難航したので解決策のメモ。
例えばWindows系ファイルシステムがマウントされたLinux系サーバでは日本語ファイル名や
フォルダ名が以下の様に文字化けしてしまうことがあります(1行目)。ファイル名は"コ ピー.mp4"
$ ls -l
-rw-rw-r-- 1 fujimoto fujimoto 111044022 11月 9 16:46 2015 ?R ?s?[.mp4
-rw-rw-r-- 1 fujimoto fujimoto 111044022 11月 9 16:46 2015 ああ あ.mp4
-rw-rw-r-- 1 fujimoto fujimoto 111044022 11月 9 16:46 2015 あああ.mp4
これを以下の様にffmpegにコピペしても旨く行きません
$ ffmpeg -i ?R ?s?[.mp4
$ ffmpeg -i "?R ?s?[.mp4"
$ env LANG=ja_JP.SJIS ffmpeg -i "?R ?s?[.mp4"
ffmpeg version N-81489-ga37e6dd Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-17)
configuration: --enable-gpl --enable-nonfree --enable-libfdk_aac --enable-libx264
libavutil 55. 29.100 / 55. 29.100
libavcodec 57. 54.101 / 57. 54.101
libavformat 57. 48.101 / 57. 48.101
libavdevice 57. 0.102 / 57. 0.102
libavfilter 6. 57.100 / 6. 57.100
libswscale 4. 1.100 / 4. 1.100
libswresample 2. 1.100 / 2. 1.100
libpostproc 54. 0.100 / 54. 0.100
?R ?s?[.mp4: No such file or directory
なんとか直接ファイル名を渡す方法は無いものか・・・
ということでlsやfindで取得したファイル名をそのままffmpegに渡す方法でうまくいきました。
ただしリストの何番目という情報を最初に把握する必要があり、あまりスマートな方法では無いかもしれません。
カレント内のファイルの場合
$ ls -1
$ ffmpeg -i "`ls -1|sed -n 1p`"
カレント内のサブフォルダのファイルを指定する場合
$ find . -type f|grep mp4
$ ffmpeg -i "`find . -type f|grep mp4|sed -n 1p`"
動画情報の取得に成功した場合の結果
$ ffmpeg -i "`find . -type f|grep mp4|sed -n 8p`"
ffmpeg version N-81489-ga37e6dd Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-17)
configuration: --enable-gpl --enable-nonfree --enable-libfdk_aac --enable-libx264
libavutil 55. 29.100 / 55. 29.100
libavcodec 57. 54.101 / 57. 54.101
libavformat 57. 48.101 / 57. 48.101
libavdevice 57. 0.102 / 57. 0.102
libavfilter 6. 57.100 / 6. 57.100
libswscale 4. 1.100 / 4. 1.100
libswresample 2. 1.100 / 2. 1.100
libpostproc 54. 0.100 / 54. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from './/Rs[.mp4':
Metadata:
major_brand : mp42
minor_version : 1
compatible_brands: mp41mp42isom
creation_time : 2014-07-18T07:40:50.000000Z
Duration: 00:00:44.08, start: 0.000000, bitrate: 20154 kb/s
Stream #0:0(deu): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 2 kb/s (default)
Metadata:
creation_time : 2014-07-18T07:40:50.000000Z
handler_name : Core Media Audio
Stream #0:1(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080, 20146 kb/s, SAR 1:1 DAR 16:9, 29.97 fps, 29.97 tbr, 30k tbn, 50 tbc (default)
Metadata:
creation_time : 2014-07-18T07:40:50.000000Z
handler_name : Core Media Video
At least one output file must be specified
難航したので解決策のメモ。
例えばWindows系ファイルシステムがマウントされたLinux系サーバでは日本語ファイル名や
フォルダ名が以下の様に文字化けしてしまうことがあります(1行目)。ファイル名は"コ ピー.mp4"
$ ls -l
-rw-rw-r-- 1 fujimoto fujimoto 111044022 11月 9 16:46 2015 ?R ?s?[.mp4
-rw-rw-r-- 1 fujimoto fujimoto 111044022 11月 9 16:46 2015 ああ あ.mp4
-rw-rw-r-- 1 fujimoto fujimoto 111044022 11月 9 16:46 2015 あああ.mp4
これを以下の様にffmpegにコピペしても旨く行きません
$ ffmpeg -i ?R ?s?[.mp4
$ ffmpeg -i "?R ?s?[.mp4"
$ env LANG=ja_JP.SJIS ffmpeg -i "?R ?s?[.mp4"
ffmpeg version N-81489-ga37e6dd Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-17)
configuration: --enable-gpl --enable-nonfree --enable-libfdk_aac --enable-libx264
libavutil 55. 29.100 / 55. 29.100
libavcodec 57. 54.101 / 57. 54.101
libavformat 57. 48.101 / 57. 48.101
libavdevice 57. 0.102 / 57. 0.102
libavfilter 6. 57.100 / 6. 57.100
libswscale 4. 1.100 / 4. 1.100
libswresample 2. 1.100 / 2. 1.100
libpostproc 54. 0.100 / 54. 0.100
?R ?s?[.mp4: No such file or directory
なんとか直接ファイル名を渡す方法は無いものか・・・
ということでlsやfindで取得したファイル名をそのままffmpegに渡す方法でうまくいきました。
ただしリストの何番目という情報を最初に把握する必要があり、あまりスマートな方法では無いかもしれません。
カレント内のファイルの場合
$ ls -1
$ ffmpeg -i "`ls -1|sed -n 1p`"
カレント内のサブフォルダのファイルを指定する場合
$ find . -type f|grep mp4
$ ffmpeg -i "`find . -type f|grep mp4|sed -n 1p`"
動画情報の取得に成功した場合の結果
$ ffmpeg -i "`find . -type f|grep mp4|sed -n 8p`"
ffmpeg version N-81489-ga37e6dd Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-17)
configuration: --enable-gpl --enable-nonfree --enable-libfdk_aac --enable-libx264
libavutil 55. 29.100 / 55. 29.100
libavcodec 57. 54.101 / 57. 54.101
libavformat 57. 48.101 / 57. 48.101
libavdevice 57. 0.102 / 57. 0.102
libavfilter 6. 57.100 / 6. 57.100
libswscale 4. 1.100 / 4. 1.100
libswresample 2. 1.100 / 2. 1.100
libpostproc 54. 0.100 / 54. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from './/Rs[.mp4':
Metadata:
major_brand : mp42
minor_version : 1
compatible_brands: mp41mp42isom
creation_time : 2014-07-18T07:40:50.000000Z
Duration: 00:00:44.08, start: 0.000000, bitrate: 20154 kb/s
Stream #0:0(deu): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 2 kb/s (default)
Metadata:
creation_time : 2014-07-18T07:40:50.000000Z
handler_name : Core Media Audio
Stream #0:1(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080, 20146 kb/s, SAR 1:1 DAR 16:9, 29.97 fps, 29.97 tbr, 30k tbn, 50 tbc (default)
Metadata:
creation_time : 2014-07-18T07:40:50.000000Z
handler_name : Core Media Video
At least one output file must be specified
コメント