vlcをCUIから使う

みなさんごきげんよう。今日も元気にラブライブ!の1stシングル「僕らのLIVE 君とのLIFE」を聞きましょう。
…あぁ、いつもいつもCD挿すのめんどくさいですね。ここはちょいとvorbisあたりに変換してハードディスクに保存してしまいましょう。誰ですかiPodとかで聞いてるのは?そんなものは知らない。見えない。分からない。
さて、手元にvlcがあります。こいつを使って収録されている曲及び各員からのコメントを変換して保存するには、トラックごとにダイアログから設定して、エンコードしてやらないといけません。おいぃ13トラックもあるぞ!手でやってられへん!!!
これはめんどくさい、一気に変換する方法はないものか…そうだ、vlcってCUIから使えねーの?と思ってvlc --helpとか打ってみたらやたらと長い説明が出てきて、それだけでは飽き足らず「網羅的なヘルプを表示するためには、'-H'オプションを指定してください。」とか言わはる。これはやばい。相当にやばい。しかし私はラブライブ!1stシングルを快適に聞くために頑張ってvlcでバッチエンコードするためのマンドを探しまくりました。ありました。やったー
というわけで、私の備忘録、兼、今日もどこかでvlcのプログラムオプションに困っている人達のために残しておきます。

サンプル

cvlc --sout-vorbis-quality=4 \
  --sout "#transcode{acodec=vorb,channels=2,samplerate=44100}:std{access=file,mux=ogg}" \
  cdda:///dev/cdrom :cdda-track=2 :sout-standard-dst=友情ノーチェンジ.ogg \
  cdda:///dev/cdrom :cdda-track=5 :sout-standard-dst=はじめまして-高坂穂乃果-.ogg

これは以下と同じです(理由は後述):

cvlc --sout-vorbis-quality=4 \
  --sout-transcode-acodec=vorb --sout-transcode-channels=2 \
  --sout-transcode-samplerate=44100 --sout-standard-access=file --sout-standard-mux=ogg \
  cdda:///dev/cdrom :cdda-track=2 :sout-standard-dst=友情ノーチェンジ.ogg \
  cdda:///dev/cdrom :cdda-track=5 :sout-standard-dst=はじめまして-高坂穂乃果-.ogg

Overview

cvlc [オプション] [[MRL] [オプション…]]…

vlcは、多くのオプションに従ってMRLごとにデータを再生(スピーカーやモニターに出力)、ストリーム出力(webに出力)、ローカルに保存(ファイルに出力)、その他何かします。
cvlcとは、GUI剥ぎ取ったvlcです。なので、vlcに同じコマンドを渡すこともできますし、ちゃんと動きます。ただしバッチ中にウィンドウ出てきてもうざいだけですが。

MRL

MRLは、入力データの場所です。ローカルファイル以外にも、web上のファイルやストリームとかでもいいです。
MRLはURLに何か色々付け足したものですが、その「何か」の部分は知りませんので知りません。URLは以下のような書式です(vlc --helpから抜粋)。

URL syntax:
  [file://]filename              Plain media file
  http://ip:port/file            HTTP URL
  ftp://ip:port/file             FTP URL
  mms://ip:port/file             MMS URL
  screen://                      Screen capture
  [dvd://][device][@raw_device]  DVD device
  [vcd://][device]               VCD device
  [cdda://][device]              Audio CD device
  udp://[[<source address>]@[<bind address>][:<bind port>]]
                                 UDP stream sent by a streaming server
  vlc://pause:<seconds>          Special item to pause the playlist for a certain time
  vlc://quit                     Special item to quit VLC

例えば、 /dev/cdrom に挿さっているオーディオCDなら、 cdda:///dev/cdrom です。
screen:// は多分、ディスプレイ出力を入力にするためのURLだと思います。ゲームのプレイ動画とか作れるかもしれませんね。
vlc://quit を見つけるとvlcは終了します。つまり、これを付けないとバッチ処理後もvlcは起動したままになります。

オプション

オプションは、グローバルなものと、MRLごとに指定するための記法の二つがあります。

--optionと書くと、全てのMRLに対するオプションになり、:optionと書くと、直前のMRLに対するオプションとなります。:optionは--optionより優先されます(この説明が完全に正しいわけじゃないっぽいです)。

また、--sout-*系のオプションは、

--sout "#module1{option1=value,option2=value…}:module2{option1=value,option2=value…}…"

という風に書くことができ、これは

--sout-module1-option1=value --sout-module1-option2=value … --sout-module2-option1=value

と同じです。
#module1{options}:module2{options}… の形式が使えるmoduleは、 transcode, standard, duplicate, rtp と、他あったような気がするけど忘れました。

個々のオプション項目

サンプルをもう一度記載します。

cvlc --sout-vorbis-quality=4 \
  --sout "#transcode{acodec=vorb,channels=2,samplerate=44100}:std{access=file,mux=ogg}" \
  cdda:///dev/cdrom :cdda-track=2 :sout-standard-dst=友情ノーチェンジ.ogg \
  cdda:///dev/cdrom :cdda-track=5 :sout-standard-dst=はじめまして-高坂穂乃果-.ogg
  • --sout-vorbis-*: Vorbisコーデックのオプション。デフォルトではVBRエンコードになっている
  • --sout-transcode-*: 入力を変換する系のオプション
    • --sout-transcode-acodec=(vorb|mpga|a52|ac3): 音声コーデックの指定
      • vorb: Vorbis
      • mpga: MPEG audio layer 2
      • a52, ac3: AC3 sound
    • --sout-transcode-ab=kbps: 音声ビットレート(kbps)(コーデックにVorbis使う場合は無視される)
    • --sout-transcode-channels=number: チャンネル数(ステレオなら2)
    • --sout-transcode-samplerate=Hz: サンプリングレート(Hz, オーディオCDなら多分44.1kHzだから44100)
  • --sout-standard-*: 出力先に関するオプション
    • --sout-standard-access=(file|udp|rtp|http): アクセス先の指定
      • file: 普通のファイル
      • udp, rtp, http: それらのプロトコルで垂れ流す(調べてないから知らない)
    • --sout-standard-mux=(avi|ogg|ps|ts): コンテナの指定
      • avi: AVI
      • ogg: OGG
      • ps: MPEG2-PS
      • ts: MPEG2-TS
    • --sout-standard-dst=url: 出力先の場所。--sout-standard-accessがfileの場合は普通にファイルのパスを指定するか、もしくはfile://の形式で指定。その他のプロトコルの場合は何かURL(調べてないから知らない)

standardには、stdという別名があるので、#module1{}:module2{}という書き方をする場合はそのstdという別名が使えます。

--sout-transcode-*には、もちろん映像関連のオプションもあります。 --sout-transcoode-vcodec=video_codec とか。

この他のmoduleも、全然使ってないけど憶測で適当に紹介します。

  • --sout-duplicate-*: 出力を分岐する
    • --sout-duplicate-dst=#module1{options…}:module2{options…} : オプションの内容に従って出力する。dstを何個も書いてやることで、出力先が増える
  • --sout-rtp-*: 指定するURLにRTPで出力

これらのオプションについて、詳細はvlc -Hや、

あたりを見てください。ちなみに上のURLのリストは多分内容が偏ってると思うので、もっと色々なことをしたい人は、勝手にwikiの中を漁ってください。
そんなわけでvlcコマンドラインから使う方法を紹介してきましたが、ぶっちゃけMRLとオプションをずらずら並べなくても、シェルのfor文使ってもいいですね。
あとなんか、--optionと:optionの関係はそんな単純なものじゃないっぽくて、まぁうまいことやってください。