FLVファイルから指定した時間を無劣化で切り取る

FLVファイルからAACファイルに、AACファイルからM4Aファイルに無劣化で変換する でAACファイルを抽出していたのですが、音楽が流れている部分だけ切り取りたいと思いましたので、調べてみました。

環境

  • OS X El Capitan バージョン 10.11.5
  • FFmpeg バージョン 3.0.2

FFmpeg とそのオプション

FFmpeg で切り取ることもできるようでした。 切り取るためのオプションの man を抜粋してみました。

-ss は開始する位置を指定するためのオプションのようです。

$ man ffmpeg
-ss position (input/output)
    When used as an input option (before "-i"), seeks in this input
    file to position. Note that in most formats it is not possible to
    seek exactly, so ffmpeg will seek to the closest seek point before
    position.  When transcoding and -accurate_seek is enabled (the
    default), this extra segment between the seek point and position
    will be decoded and discarded. When doing stream copy or when
    -noaccurate_seek is used, it will be preserved.

    When used as an output option (before an output filename), decodes
    but discards input until the timestamps reach position.

    position must be a time duration specification, see the Time
    duration section in the ffmpeg-utils(1) manual.

-t は切り取る長さを指定するためのオプションのようです。

$ man ffmpeg
-t duration (input/output)
    When used as an input option (before "-i"), limit the duration of
    data read from the input file.

    When used as an output option (before an output filename), stop
    writing the output after its duration reaches duration.

    duration must be a time duration specification, see the Time
    duration section in the ffmpeg-utils(1) manual.

    -to and -t are mutually exclusive and -t has priority.

FFmpeg で切り取る

調べたどちらのオプションも -i オプションより前に指定するように記載されていましたので、そのように指定して実行してみます。

$ ffmpeg -ss 55:00 -t 3:00 -i in.flv -c:a copy out.aac
ffmpeg version 3.0.2 Copyright (c) 2000-2016 the FFmpeg developers
  built with Apple LLVM version 7.3.0 (clang-703.0.29)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/3.0.2 --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-libxvid --enable-vda
  libavutil      55. 17.103 / 55. 17.103
  libavcodec     57. 24.102 / 57. 24.102
  libavformat    57. 25.100 / 57. 25.100
  libavdevice    57.  0.101 / 57.  0.101
  libavfilter     6. 31.100 /  6. 31.100
  libavresample   3.  0.  0 /  3.  0.  0
  libswscale      4.  0.100 /  4.  0.100
  libswresample   2.  0.101 /  2.  0.101
  libpostproc    54.  0.100 / 54.  0.100
Input #0, flv, from 'in.flv':
  Duration: 01:00:59.90, 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         : Lavf57.25.100
    Stream #0:0: Audio: aac (HE-AAC), 48000 Hz, stereo, 49 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
size=    1084kB time=00:03:00.02 bitrate=  49.3kbits/s speed=7.52e+03x    
video:0kB audio:1055kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 2.734380%

指定した時間から微妙にずれるので、作成されたファイルの内容を聞きながら指定する時間を調整しました。 無劣化で切り取るため一瞬で終わりました。 サイズも切り取った分だけ小さいファイルが作成されました。

$ ls -l
total 149752
-rw-r--r--  1 user  staff  23418302  5 30 16:14 in.flv
-rw-r--r--  1 user  staff   1109858  5 30 16:14 out.aac

終わり

これで、MP4BoxでM4Aファイルに変換 すれば iTunes で音楽のところだけ聞けます。

参考