[[diary/Kojima]]

・動画と音声の分割,結合(その2)

画像で困ればnetpbm,動画で困ればffmpeg,と言われている通り,
この手の作業を自動化するにはffmpegが使えるのでは,とあれこれ調べてみた.

ffmpegの場合,-vn オプションを指定すれば画像が,-an オプションを指定すれば音声が,それぞれ出力されないらしい.
この機能を指定すればステレオ片チャンネルの動画ファイルから,音声データと画像データを分割できそう.

[[このあたり:https://trac.ffmpeg.org/wiki/AudioChannelManipulation]]を見ると,-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%
 ...

このスクリプトで作成した動画ファイルは,無事モノラル音声になっている模様

#ref("mono_01.jpg")

GUIなaudacityとavidemuxでやるのに比べて,
スクリプト経由でffmpegを回すと人手がかからないのでずっと楽.
こういう処理がちゃっちゃと組めるのがLinux/Unix環境の魅力だなぁ..
- と言っても、人手なら2、3つ間違えたら気づくミスを、スクリプトを回していたら数百回も間違えていた、なんてこともあるから注意は必要。 -- [[kojima]] &new{2015-08-20 (木) 13:35:23};

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS