FLVファイルからAACファイルを抽出する

らじる★らじるradiko.jpで録音したファイルはFlash Videoというコンテナ型のファイルフォーマットなのでそのままだとMacで再生しづらいです。 今回はFLVファイルからAACファイルを抽出することについて調べてみました。

環境

  • OS X El Capitan バージョン 10.11.3
  • Homebrew バージョン 0.9.5
  • FFmpeg バージョン 2.8.6

FFmpeg?

FFmpeg is the leading multimedia framework, able to decode, encode, transcode, mux, demux, stream, filter and play pretty much anything that humans and machines have created.

FFmpeg

インストール

Homebrewを先にインストールしておきます。

FFmpegを使って抽出しますのでFFmpegをインストールします。

$ brew install ffmpeg
==> Downloading https://homebrew.bintray.com/bottles/ffmpeg-2.8.6.el_capitan.bot
######################################################################## 100.0%
==> Pouring ffmpeg-2.8.6.el_capitan.bottle.tar.gz
==> Caveats
FFmpeg has been built without libfaac for licensing reasons;
libvo-aacenc is used by default.
To install with libfaac, you can:
  brew reinstall ffmpeg --with-faac

You can also use the experimental FFmpeg encoder, libfdk-aac, or
libvo_aacenc to encode AAC audio:
  ffmpeg -i input.wav -c:a aac -strict experimental output.m4a
Or:
  brew reinstall ffmpeg --with-fdk-aac
  ffmpeg -i input.wav -c:a libfdk_aac output.m4a
==> Summary
🍺  /usr/local/Cellar/ffmpeg/2.8.6: 210 files, 44.4M

確認

次のように入力するとFLVファイルの内容が確認できます。 filename.flvは実際のファイル名に変更します。 ここではらじる★らじるから保存したファイルを使っています。

$ ffmpeg -i filename.flv
ffmpeg version 2.8.6 Copyright (c) 2000-2016 the FFmpeg developers
  built with Apple LLVM version 7.0.2 (clang-700.1.81)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/2.8.6 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-vda
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Input #0, flv, from 'filename.flv':
  Duration: 01:01:57.97, start: 0.000000, bitrate: 51 kb/s
    Stream #0:0: Audio: aac (HE-AAC), 48000 Hz, stereo, fltp, 49 kb/s
At least one output file must be specified

これを見るとAudio: aac (HE-AAC)ってあります。 FLVファイルはコンテナフォーマットというもので、多くの種類の音声や動画を含むことができるそうです。 このファイルは音声だけがaac (HE-AAC)のフォーマットで含まれています。

抽出

このファイルからAACファイルを抽出するのは次の通りです。

$ ffmpeg -i filename.flv -c:a copy out.aac
ffmpeg version 2.8.6 Copyright (c) 2000-2016 the FFmpeg developers
  built with Apple LLVM version 7.0.2 (clang-700.1.81)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/2.8.6 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-vda
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Input #0, flv, from 'filename.flv':
  Duration: 01:01:57.97, start: 0.000000, bitrate: 51 kb/s
    Stream #0:0: Audio: aac (HE-AAC), 48000 Hz, stereo, fltp, 49 kb/s
Output #0, adts, to 'out.aac':
  Metadata:
    encoder         : Lavf56.40.101
    Stream #0:0: Audio: aac, 48000 Hz, stereo, 49 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
size=   22381kB time=01:01:58.01 bitrate=  49.3kbits/s    
video:0kB audio:21785kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 2.734391%

オプションについては次のところを参考にしました。

filename.flvは最初に確認したファイルです。 out.m4aは抽出した後にできるファイルです。 -c:a copyは音声をそのまま(エンコード、デコードを省略して)出力します。

拡張子の.flv.aacは、これを元にファイルのフォーマットを判断しているようなので、この通りに指定しておいた方が良さそうです。 そうじゃない場合は、-f fmt (input/output)のオプションを指定する必要があります。 最初、ここで抽出した後にできるファイルの拡張子を.m4aにしていたんですけど、無理矢理MP4のコンテナフォーマットにしているようで、Codec for stream 0 does not use global headers but container format requires global headersっていう警告が出ていたりしたので素直に.aacにしました。

抽出しているだけなので一瞬で終わりました。

ファイルサイズ

抽出しているだけなので、音質は変わっていないと思います。 1時間程度録音したファイルのサイズは抽出前が23.7MB程度で、抽出後が22.9MB程度でした。

$ ls -l
-rw-r--r--  1 user  staff  23789474  2  7 18:00 filename.flv
-rw-r--r--  1 user  staff  22917952  2  9 22:12 out.aac

終わり

AACファイルを抽出したのでFinderのクイックルックや再生機能で再生できました。 でもiTunesでは再生できませんでした。

参考

10 February 2016 追記

iTunesで再生できるようになるまでを書いてみました。