あれ、どうやったっけ

(たぶん)テキストサイト風blog。文が安定するまで書き直しあるからメンゴ。

記憶困難な黒魔術的文言を紹介します@ffmpegとかgst-launch-1.0

むかーし調べてほしいと聞かれた奴出てきた

他人から頼まれた系で調べたやつのメモが出てきたのでこちらに移転します。

https://trac.ffmpeg.org/wiki/HWAccelIntro

QSV 対応 Intel CPU で H.264 のハードウェアエンコード on Linux - Qiita

ffmpeg -y -hide_banner -fflags +discardcorrupt \
-vaapi_device /dev/dri/renderD128 \
-hwaccel vaapi -hwaccel_output_format vaapi \
-i "${1}" \
-vf "format=nv12|vaapi,hwupload,scale_vaapi=w=1280:h=720" -c:v h264_vaapi -qp 20 -aspect 16:9 \
-c:a copy -bsf:a aac_adtstoasc \
${2}

内容は上の2リンクからパクったものですが

  • -fflags +discardcorrupt(破損フレーム破棄、ADTSヘッダ付きAACに要らんゴミ混入系エラーが出るため)
  • -bsf:a aac_adtstoasc(mp2tsで使われるADTSヘッダを取っ払ってmp4用aacに変換フィルタ)

あたりがちょっと違いますね……ってくらい。

なお性能は「淫輝のN3710でCPU使用率12%(1コアだけ)って程になるのでいろいろ影響なくて便利、epgrec UNA最高」とのこと、友人談。あとHWエンコの際は -threads 2 しても意味ないよ。

gst-launch-1.0はもっとひどいぞ

これも似たような頼まれごとですが、こっちは無償奉仕ムリっつってラーメン大好き小泉さんの刑に処したものです。

gst-launch-1.0 -v \
filesrc location="${file_path}" \
! progressreport ! tsdemux name=demux \
        ! queue \
        ! mpegvideoparse \
        ! imxvpudec num-additional-framebuffers=60 \
        ! imxipuvideotransform \
        ! video/x-raw,width=${width},height=${height} \
        ! imxvpuenc_h264 quant-param=${quant_param} idr-interval=60 \
        ! video/x-h264,stream-format=byte-stream,profile=high \
        ! h264parse \
        ! mux. \
    demux. ! queue \
        ! aacparse \
        ! faad \
        ! voaacenc bitrate=${audio_bitrate} \
        ! mp4mux name=mux faststart=true streamable=true \
        ! filesink location="${result}"

注意していただきたいのはこのへん。

tsdemux name=demux \
(略)
! mux. \
demux. ! queue \
(略)
 ! mp4mux name=mux

「tsdemux name=demux」で音声と映像分離し、以降でどうこうするわけですけれども……「demux.」(末尾のドットを忘れるな)が分離ポイント。

分離したのを合流する際は「mux.」(末尾のドット忘れるな + コマンドのパイプの ! が必要かどうかは確認せい、上記例なら mux. demux. ! queue ってなるんで不要)。「mp4mux name=mux 」が音声と動画の合流ポイント。

分離したり合流する際は、tsdemuxとかmp4muxの「name」で書いた名前を指定します。

たとえばこんな感じですか。

  • tsdemux以下の流れで映像をimx4のhwエンコーダでどうにかした後、mux. でmp4muxに合流
  • demux. 以降で音声を処理、ただ(CuBox-iに積まれていた)GStreamerのプラグインには「ADTSヘッダのみ除去してコピるAACフィルタ」はナイため、劣化上等でwavったる必要あり
  • mp4muxで合流して合体

gst-launch-1.0は基本的にあたまおかしい表記の代わりプラグイン周りが書きやすいので、弱小のARM乗せた板作ってるメーカーさんはGStreamer用のプラグインだけ用意してることが割とあるですね。正確に言うとgst-launchは動作検証用簡易ツールで実際は「CなりC++なりからプラグイン読んでテメェでアプリ作れ」ってことになるんですが……。

正確にはyoctoでサポートされてる場合が多いとでもいうか……ですかねぇ。良く調べてないから知らんけど。yoctoは大雑把に言うとARMとか組み込み用のカーネルとかその他ツールをモリっとビルドしてくれるツール群、およびそれを提供してる団体の事ですね。

あとCuBox搭載のHWエンコーダはやや性能がアレというか画像の乱れが出やすいようです。良く分からん線が入るとかを友人宅で確認しています。あとおごりのごはんっておいしいです。

GStreamerって基本エラー耐性ウンコなんですよね。FFMPEGだったら怪しかったら数フレーム捨ててるのかムリ解釈してるのかは承知しませんが、根性でなんとかしてる場合が多いように見えます。ですが、GStreamerは逝きますので、個人的にはあまり積極的に使いたい奴ではない。