・動画と音声の分割,結合(その2)
画像で困ればnetpbm,動画で困ればffmpeg,と言われている通り, この手の作業を自動化するにはffmpegが使えるのでは,とあれこれ調べてみた.
ffmpegの場合,-vn オプションを指定すれば画像が,-an オプションを指定すれば音声が,それぞれ出力されないらしい. この機能を指定すればステレオ片チャンネルの動画ファイルから,音声データと画像データを分割できそう.
このあたりを見ると,-acオプションはずいぶん柔軟に音声入力を指定できるようで, 自前で5.1chなデータなんてのも作れるらしい.
とりあえずやりたいことは片チャンネルを欠くステレオ音声をモノラルにすることなので,-ac 1 を指定すればよさげ.また,ボリュームをあげるには -af "volume=5dB" という指定が使える.
ということで,音声をモノラルで取りだすのはこんな感じ.
ffmpeg -y -i $infile -vn -ac 1 -af "volume=5dB" temp.aac
一方,音声なしの動画データは -an で作れ,CODECを変える必要はないので,こんな感じでよさそう.
ffmpeg -y -i $infile -an -vcodec copy temp.mp4
最終的にこれらを一つにまとめるには,-i オプションで入力ファイルを複数指定する.
ffmpeg -i temp.mp4 -i temp.aac $newfile
これらをまとめてシェルのforループから回せるように,st2mono.sh という名前のスクリプトにしてみた.
#!/bin/sh infile=$1 ffmpeg -y -i $infile -vn -ac 1 -af "volume=5dB" temp.aac ffmpeg -y -i $infile -an -vcodec copy temp.mp4 ffmpeg -i temp.mp4 -i temp.aac New/$infile
あとは,作業用ディレクトリに変換が必要な動画ファイルを集めて,Newディレクトリを作り,
$ ls 316-1-01.mp4 316-1-06.mp4 316-1-11.mp4 316-2-04.mp4 316-2-09.mp4 316-1-02.mp4 316-1-07.mp4 316-1-12.mp4 316-2-05.mp4 316-2-10.mp4 316-1-03.mp4 316-1-08.mp4 316-2-01.mp4 316-2-06.mp4 316-2-11.mp4 316-1-04.mp4 316-1-09.mp4 316-2-02.mp4 316-2-07.mp4 316-2-12.mp4 316-1-05.mp4 316-1-10.mp4 316-2-03.mp4 316-2-08.mp4 New/
先に作ったスクリプトに食わせてやるだけ.
$ for i in 316*.mp4 ; do > ../st2mono.sh $i > done
(temp.aac作成) ffmpeg version 2.5.4 Copyright (c) 2000-2015 the FFmpeg developers built on Feb 28 2015 15:37:07 with gcc 4.8.4 (GCC) configuration: --prefix=/usr --libdir=/usr/lib64 .. Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '316-1-01.mp4': ... Duration: 00:04:00.47, start: 0.021333, bitrate: 918 kb/s Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x480 [SAR 1:1 DAR 4:3], 782 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default) Metadata: handler_name : VideoHandler Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 127 kb/s (default) ... size= 2427kB time=00:04:00.44 bitrate= 82.7kbits/s video:0kB audio:2427kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000% (temp.mp4作成) ffmpeg version 2.5.4 Copyright (c) 2000-2015 the FFmpeg developers ... Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '316-1-01.mp4': ... Duration: 00:04:00.47, start: 0.021333, bitrate: 918 kb/s Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x480 [SAR 1:1 DAR 4:3], 782 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default) Metadata: handler_name : VideoHandler Stream #0:0(und): Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 640x480 [SAR 1:1 DAR 4:3], q=2-31, 782 kb/s, 29.97 fps, 30k tbn, 30k tbc (default) Metadata: handler_name : VideoHandler Stream mapping: Stream #0:0 -> #0:0 (copy) ... video:22958kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.356696% (両者を合成) ffmpeg version 2.5.4 Copyright (c) 2000-2015 the FFmpeg developers ... Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'temp.mp4': ... Duration: 00:04:00.47, start: 0.021000, bitrate: 784 kb/s Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x480 [SAR 1:1 DAR 4:3], 782 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default) ... Input #1, aac, from 'temp.aac': Duration: 00:04:02.13, bitrate: 82 kb/s Stream #1:0: Audio: aac (LC), 48000 Hz, mono, fltp, 82 kb/s [libx264 @ 0x70e120] using SAR=1/1 [libx264 @ 0x70e120] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 [libx264 @ 0x70e120] profile High, level 3.0 ... Output #0, mp4, to 'New/316-1-01.mp4': Metadata: Stream mapping: Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264)) Stream #1:0 -> #0:1 (aac (native) -> aac (libfaac)) Press [q] to stop, [?] for help frame= 7207 fps=128 q=-1.0 Lsize= 24891kB time=00:04:00.44 bitrate= 848.0kbits/s video:22205kB audio:2427kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.048357% [libx264 @ 0x70e120] frame I:38 Avg QP:20.25 size: 25932 [libx264 @ 0x70e120] frame P:2598 Avg QP:23.53 size: 6145 [libx264 @ 0x70e120] frame B:4571 Avg QP:28.00 size: 1266 [libx264 @ 0x70e120] consecutive B-frames: 4.1% 27.3% 20.1% 48.5% ...
このスクリプトで作成した動画ファイルは,無事モノラル音声になっている模様
GUIなaudacityとavidemuxでやるのに比べて, スクリプト経由でffmpegを回すと人手がかからないのでずっと楽. こういう処理がちゃっちゃと組めるのがLinux/Unix環境の魅力だなぁ..