vlc がないので ffmpeg でトランスコード

mediatomb の config.xml には最初からトランスコードをする為の設定がファイルの最後の方に入っている。

  <transcoding enabled="yes">
    <mimetype-profile-mappings>
      <transcode mimetype="video/x-flv" using="vlcmpeg"/>
      <transcode mimetype="application/ogg" using="vlcmpeg"/>
      <transcode mimetype="application/ogg" using="oggflac2raw"/>
      <transcode mimetype="audio/x-flac" using="oggflac2raw"/>
    </mimetype-profile-mappings>
    <profiles>
      <profile name="oggflac2raw" enabled="no" type="external">
        <mimetype>audio/L16</mimetype>
        <accept-url>no</accept-url>
        <first-resource>yes</first-resource>
        <accept-ogg-theora>no</accept-ogg-theora>
        <agent command="ogg123" arguments="-d raw -o byteorder:big -f %out %in"/>
        <buffer size="1048576" chunk-size="131072" fill-size="262144"/>
      </profile>
      <profile name="vlcmpeg" enabled="yes" type="external">
        <mimetype>video/mpeg</mimetype>
        <accept-url>yes</accept-url>
        <first-resource>yes</first-resource>
        <accept-ogg-theora>yes</accept-ogg-theora>
        <agent command="vlc" arguments="-I dummy %in --sout #transcode{venc=ffmpeg,vcodec=mp2v,vb=4096,fps=25,aenc=ffmpeg,acodec=mpga,ab=192,samplerate=44100,channels=2}:standard{access=file,mux=ps,dst=%out} vlc:quit"/>
        <buffer size="14400000" chunk-size="512000" fill-size="120000"/>
      </profile>
    </profiles>
  </transcoding>
</config>

ここで になってて、 になっていれば、vlc を使ってトランスコードが行われる。超簡単!
が、しかし、うちのサーバには vlc が入っていない…。というわけで、ffmpeg を使ってトランスコードをすることにした。参考にしたのはココ。具体的には vlc の代わりに ffmpeg で変換するシェルスクリプトを作成してそれを使ってトランスコードする。
実際の config.xml のトランスコードの部分はこんな感じ。

  <transcoding enabled="yes">
    <mimetype-profile-mappings>
      <transcode mimetype="video/x-ms-wmv" using="vlcmpeg"/>
      <transcode mimetype="video/divx" using="vlcmpeg"/>
      <transcode mimetype="video/x-flv" using="vlcmpeg"/>
      <transcode mimetype="application/ogg" using="vlcmpeg"/>
      <transcode mimetype="application/ogg" using="oggflac2raw"/>
      <transcode mimetype="audio/x-flac" using="oggflac2raw"/>
    </mimetype-profile-mappings>
    <profiles>
      <profile name="oggflac2raw" enabled="no" type="external">
        <mimetype>audio/L16</mimetype>
        <accept-url>no</accept-url>
        <first-resource>yes</first-resource>
        <accept-ogg-theora>no</accept-ogg-theora>
        <agent command="ogg123" arguments="-d raw -o byteorder:big -f %out %in"/>
        <buffer size="1048576" chunk-size="131072" fill-size="262144"/>
      </profile>
      <profile name="vlcmpeg" enabled="yes" type="external">
        <mimetype>video/mpeg</mimetype>
        <accept-url>yes</accept-url>
        <first-resource>yes</first-resource>
        <accept-ogg-theora>yes</accept-ogg-theora>
	<agent command="/usr/local/bin/mediatomb-transcode-video" arguments="%in %out"/>
        <buffer size="14400000" chunk-size="512000" fill-size="120000"/>
      </profile>
    </profiles>
  </transcoding>
</config>

タグで、どの mimetype のムービーをトランスコードするかを設定している。この例だと、mimetype が "video/x-ms-wmv", "video/divx" そして 'video/x-flv" のファイルが、vlcmpeg というプロファイルを使ってトランスコードされる。で、この vlcmpegってプロファイルは下の方で定義されている。トランスコード後は "video/mpeg" になって、実際にトランスコードをするのは agent の /usr/local/bin/mediatomb-transcode-video になる。この mediatomb-transcode-video がシェルスクリプトで、内容は単純に ffmpeg を使って変換を行っているだけ。中身はこんな感じ。

paraches@debian:/usr/local/bin$ ls
ffmpeg  ffprobe   mediatomb 
ffplay  ffserver  mediatomb-transcode-video 
paraches@debian:/usr/local/bin$ cat mediatomb-transcode-video
#!/bin/bash

FFMPEG_PATH="/usr/local/bin/ffmpeg"
INPUT="$1"
OUTPUT="$2"
VIDEO_CODEC="mpeg2video"
VIDEO_BITRATE="1024k"
VIDEO_FRAMERATE="25"
AUDIO_CODEC="mp2"
AUDIO_BITRATE="128k"
AUDIO_SAMPLERATE="44100"
AUDIO_CHANNELS="2"
FORMAT="dvd"

exec "${FFMPEG_PATH}" -i "${INPUT}" -vcodec ${VIDEO_CODEC} -b ${VIDEO_BITRATE} \
-r ${VIDEO_FRAMERATE} -acodec ${AUDIO_CODEC} -ab ${AUDIO_BITRATE} -ar ${AUDIO_SAMPLERATE} \
-ac ${AUDIO_CHANNELS} -f ${FORMAT} - > "${OUTPUT}"
paraches@debian:/usr/local/bin$ 

-vcodec が mpeg2video になって、-format が dvd になる。大抵の DVD プレーヤーならこれでいけるらしい。

早速、前に PS3 で見られなかったファイルを試してみると、今度は「非対応データ」にならずにムービーが始まった!
因に「非対応データ」になるファイルのコーデック?は wmv2 だった。wmv3 なら大丈夫なのに…。
他にも .mkv なんかは video/x-matroska をトランスコードするようにすれば PS3 でも見られるようになるはず。