k_piの雑記帳

個人的に困った点と、その解決法などをつらつら書き連ねた備忘録を兼ねたブログ

Raspberry Pi (Raspbian) で、MPEG2-TSファイルをmp4に変換する際に詰まった点

【変換元・変換先】

変換元MPEG2-TS:動画MPEG2・音声AAC
変換先MP4:動画H.264/AVC・音声AAC

Raspberry PiにおけるMPEG2-TS→mp4への変換の概要】

Raspberry PiにはGPUが搭載されており、ハードウェアアクセラレーターを利用したH.264エンコーダーと、有償ではあるがMPEG2デコーダーが利用できる。
(MPEG2デコーダーのライセンスキーは、
http://www.raspberrypi.com/mpeg-2-license-key/
にて購入可能である。)
しかし、ここで問題なのが、このエンコーダーデコーダーはあまり汎用的でないということである。というのも、フォーラムなどを見てみると、このGPUがどうやらメディア再生とカメラモジュール向けのようなのである。
(カメラ向けであるからか、ハードウェアアクセラレーターはカメラ機能を有効にしないと機能しない。
参考:Connecting The Dots: Rasberry Piのmpeg2ハードウェアデコーダの有効化
なお、カメラ機能を有効にするにはGPUに128MB以上のメモリを割り当てる必要がある。
参照:Raspberry Piユーザーガイド 第2版 - Eben Upton, Gareth Halfacree - Google ブックス
つまり、変換には適していないのだ。無論、今後のアップデートで変換向けのツールが出てくるかもしれないが、2015年2月現在、GStreamerを利用してカメラ向けエンコーダーを利用するのが主流のようだ。

【変換の下準備】

  1. apt-getで
    gstreamer1.0-plugins-base-apps gstreamer1.0-tools gstreamer1.0-plugins-ugly
    の3つのパッケージをインストールする。
  2. 変換用シェルスクリプトを書く
    RaspberryPiで動画をエンコードする - Qiita
    を参考にさせていただき、以下のようなスクリプトを書いた。*1
<encode.sh>
#!/bin/sh
INPUT="$1"
OUTPUT="$2"

## encode start
echo "encode start  ------------------"

gst-launch-1.0 \
    filesrc location="${INPUT}" \
    ! progressreport \
    ! tsdemux name=demuxer \
    ! queue \
    ! aacparse \
       ! faad \
       ! voaacenc bitrate=147456 \
       ! mp4mux name=mux \
       ! filesink location="${OUTPUT}" demuxer. \
    ! queue \
    ! mpegvideoparse \
       ! omxmpeg2videodec \
       ! omxh264enc target-bitrate=5120000 control-rate=variable \
       ! video/x-h264,stream-format=byte-stream,profile=main \
    ! h264parse \
       ! mux.

status=$?
echo "encode exit"
exit $status

  【変換作業】

./encode.sh hoge.ts hoge.mp4
でOK。

 【詰まった点】

<音声部>

AACがADTS AACである場合、mp4muxに処理させる際は、ADTSヘッダーを抜いてRAW AACの形式にしなければならず、
このADTSヘッダーを抜く作業のみをできればいいのだが、そんな器用なことができないので、
一旦、16bitのRAWデータに変換してから、もう一度RAW AACに変換し直している。
参考:

ADTS AAC ‐ 通信用語の基礎知識

RAW AAC ‐ 通信用語の基礎知識

また、本当なら、voaacencではなくfaacを使いたかったが、apt-getから取得できるプラグインには同梱されていないので、パス。(ビルドするの面倒臭い(´・ω・`)

 <動画部>

元動画がインターレースの場合、動きが激しいシーンでジャギーが出る。
MPEG2デコーダー(omxmpeg2videodec)側で勝手にプログレッシブ化するっぽいのだが、(まあ、再生向けのデコーダーだもんねぇ・・・)デインターレース処理が適当なせいで、ジャギーが出るっぽい。
と言っても、他のデコーダー使ったり、GStreamerで利用できるデインターレース処理をしたりするとGPUの支援が無いので、「遅っ」という感じである。

 

【結論】

まあ、RaspberryPiにはきつかったかなという印象。

もう少し、動画変換向けのツールが出れば使ってもいいかな・・・

 

製品紹介(Amazon.co.jpアソシエイト)-----------------
Raspberry Pi 3 MODEL B 【RS正規流通品】

Raspberry Pi 3 MODEL B 【RS正規流通品】

 
Raspberry Pi Model B+ (Plus)

Raspberry Pi Model B+ (Plus)

 

*1:参考元は、スケールを小さくする変換を行っているが、ここでは省いている。また、参考元にはaudioresampleなどが入っているが、特にビット深度・色空間等の変換は不要と判断し、省いている。他にもちょこちょこ手を加えている。