試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

MKVToolnixについて(Matroskaコンテナからのデータの取り出し)

MKVToolnixツール群に含まれるmkvextractコマンドを使用することで、Matroskaコンテナからデータを取り出して保存することができる。

トラック(オーディオやビデオの部分)

「tracks」を指定した上で、トラック番号ごとに出力ファイル名を記述する。*1

mkaファイルの場合

mkaファイルの場合は、中の各圧縮/伸長方式(コーデック)に対応したファイル形式で出力される。下の例では便宜上、形式によって出力ファイルの拡張子を変えている。

(FLACコーデックのオーディオを含む場合)
$ mkvextract tracks [FLACを含んだmkaファイル] 1:track1.flac
(TTAコーデックのオーディオを含む場合)
$ mkvextract tracks [TTAを含んだmkaファイル] 1:track1.tta

これで取り出したFLACファイルは何故かMPlayerでシークできない*2が、-dumpaudioで別ファイル*3に保存し直すと直る。

$ mplayer -dumpaudio -dumpfile dump.flac track1.flac

このようになる原因は、mkvextractが吐き出すFLACファイルがFLACコンテナ(「(FLAC).flac」の形式)ではなくOggコンテナ(「(FLAC).ogg」の形式)のためで、flacコマンドでWAVEファイルをエンコードするときにOggコンテナに保存したものをMPlayerで読み込ませても同様の挙動になる。*4
(2008/10/28)オプション指定によりOggコンテナではなくFLACコンテナで出力することもできることが分かった(id:naga_sawa氏に感謝)。
[引用] mkvextractのマニュアルより

       --no-ogg
              Only valid for FLAC tracks. Normally FLAC tracks are embedded in
              an Ogg transport stream. With this switch they are extracted  to
              raw FLAC files instead.

取り出しのとき、入力ファイルと出力ファイルとの間に上の--no-oggオプションを付けることで

$ mkvextract tracks [FLACを含んだmkaファイル] --no-ogg 1:[出力ファイル].flac
Extracting track 1 with the CodecID 'A_FLAC' to the file '[出力ファイル].flac'. Container format: raw data

FLACコンテナで書き出され、シークもできるようになったことを確認した(使用したバージョンは2.3.0)。
なお、このオプションを付けないと

Extracting track 1 with the CodecID 'A_FLAC' to the file '[出力ファイル].flac'. Container format: Ogg (FLAC in Ogg)

と、Oggコンテナで書き出されたことを示すメッセージが出力されている。

mkvファイルの場合

mkvファイルの場合、まずはトラック番号とオーディオ/ビデオの対応をmkvinfoで調べておく。*5
例として、手元にある「オーディオAAC(トラック1)/ビデオH.264(トラック2)」のファイルで試したところ

$ mkvextract tracks [mkvファイル] 1:audio.aac 2:video.h264
Extracting track 1 with the CodecID 'A_AAC' to the file 'audio.aac'. Container format: raw AAC file with ADTS headers
Extracting track 2 with the CodecID 'V_MPEG4/ISO/AVC' to the file 'video.h264'. Container format: AVC/h.264 elementary stream
progress: 100%
$ file audio.aac video.h264
audio.aac:  MPEG ADTS, AAC, v4 LC, 44.1 kHz, stereo
video.h264: JVT NAL sequence, H.264 video, baseline @ L 21

このようになり、MPlayerでは

video.h264 を再生中

H264-ES ファイルフォーマットと判断.
FPS がヘッダに指定されていないか不正です. -fps オプションを利用して下さい.
ストリームを見付けることが出来ませんでした.

となってしまったが、fps数を指定することで再生はできた(下は29.97fpsの場合)。

$ mplayer video.h264 -fps 29.97

正しい値を指定しないと再生速度がおかしくなる。
この他に、recordMyDesktopが出力する(Theora + Vorbis).ogvのファイルをmkvファイルにしたものを取り出そうとしたところ

Error: Extraction of track number 1 with the CodecID 'V_THEORA' is not supported.

となり、Theoraのビデオ部分は取り出せなかった(オーディオ部分は取り出せた)。MPlayer-dumpvideoを試したが、出力されたファイルは再生できず、fileの出力も、ただの「data」だった。
もしかすると、他のコーデックでも、オーディオ/ビデオ問わず、取り出したときに何か問題が起こるかもしれない。

Cuesheet

「cuesheet」指定で埋め込みCuesheetを標準出力に書き出す。

$ mkvextract cuesheet [Matroskaファイル] > out.cue

先頭にゴミデータが入る場合がある。

添付ファイル

添付ファイルを取り出すには、そのファイルの識別子(ファイルUID)を指定する必要があり、mkvinfo

$ mkvinfo [Matroskaファイル]
(中略)
| + Attached
|  + File name: [ファイル名]
|  + Mime type: [MIMEタイプ]
|  + File data, size: [ファイルサイズ]
|  + File UID: [ファイルUID]
(以下略)

というまとまりを探して、取り出したいファイルのUIDを控えておいて

$ mkvextract attachments [Matroskaファイル] 1234:aaa.txt 5678:bbb.txt

のように指定することで、添付ファイルを取り出すことができる。

その他

ここでは扱わないが、「tags」「chapters」なども取り出すこともできる。詳しくはヘルプを参照。

関連記事:

使用したバージョン:

  • MKVToolnix 2.2.0(2.2.0-r1)
  • FLAC 1.2.1(1.2.1-r2)
  • MPlayer r27458(1.0_rc2_p27458)
  • recordMyDesktop 0.3.7.3

*1:複数のトラックを含む場合は「[番号]:[ファイル名]」をスペース区切りで後ろに続けることができる

*2:最下行の表示が「A: -0.1 (unknown) of inf (00.-8) 2.5% 12%」のようになっている

*3:保存されたファイルをfileで調べると「FLAC audio bitstream data, xx bit, stereo, xx.x kHz, xxxxxx samples」のようになっている

*4:ただ、fileで調べると、mkvextractが出力するファイルが「Ogg data, FLAC audio」となるのに対し、flac--oggオプションを付けてエンコードしたものは「Ogg data」となった

*5:どちらかをとりあえず決めて、出力後にオーディオとビデオが逆だった場合にファイル名を入れ替えるという手もある