19
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

呪いのビデオをGStreamerで作る

Last updated at Posted at 2020-11-26

GStreamerというマルチメディアフレームワークを使って、呪いのビデオを作ってみたいと思います。

準備その1: GStreamer

brewやaptなどでインストールできます。

$ brew install \
    gstreamer \
    gst-plugins-base \
    gst-plugins-good \
    gst-plugins-bad \
    gst-plugins-ugly

準備その2: 怖そうなフォント

2020-11-26 at 16.12.jpeg

今回はVDL テラGというフォントを使いました
https://www.vdl.co.jp/font/terag.html
https://fonts.adobe.com/fonts/vdl-terag

ベース映像を作る

まずベースとなる砂嵐動画を、480p(640x480)30fpsで10秒分=300フレーム生成して表示してみます。

$ gst-launch-1.0 -e \
  videotestsrc pattern=snow num-buffers=300 ! \
  video/x-raw,width=640,height=480,framerate=30/1 ! \
  autovideosink

output1_base.jpg

このような動画が生成できました。videotestsrc で砂嵐を生成して autovideosink で画面に表示しています。
コマンドのパイプに似ていますが、 | ではなく ! で繋ぐ事に注意してください。

文字を乗せる

先程の砂嵐動画に文字を乗せてみます。

$ gst-launch-1.0 -e \
  videotestsrc pattern=snow num-buffers=300 ! \
  video/x-raw,width=640,height=480,framerate=30/1 ! \
  textoverlay text="おわかりいただけただろうか...?" font-desc="VDL-TeraG, 30" ! \
  autovideosink 

output2_text_simple.jpg

このような動画が生成できました。
videotestsrctextoverlay で文字を乗せて autovideosink で画面に表示しています。
font-desc の部分で今回使用するフォントと大きさを指定しています。

文字を不穏な赤色にする

先程のtextoverlayに指定するテキストをマークアップして色指定してみます。

$ gst-launch-1.0 -e \
  videotestsrc pattern=snow num-buffers=300 ! \
  video/x-raw,width=640,height=480,framerate=30/1 ! \
  textoverlay text="<span foreground='#0000BB'>おわかりいただけただろうか...?</span>" font-desc="VDL-TeraG, 30" ! \
  autovideosink

output3_text_red.jpg

このような動画が生成できました。

<span foreground='#0000BB'> とHTMLのような感じでマークアップしていますが、これはpango markupという、GTKで多言語を描画するライブラリのマークアップ形式です。
参考: https://developer.gnome.org/pygtk/stable/pango-markup-language.html

また、環境によって色指定の順序が違います。
brewでgstreamerをインストールしたMac環境の場合、画面表示ではBGR、書き出しではRGBで指定しないと正しい色になりませんでした。

字幕ファイルで、再生フレームに応じて文字を表示する

{開始フレーム番号}{終了フレーム番号}字幕テキスト
のような形式(MicroDVD形式)で字幕ファイルを用意します。

subtitles.txt
{10}{20}お
{20}{30}おわ
{30}{40}おわか
{40}{50}おわかり
{50}{60}おわかりい
{60}{70}おわかりいた
{70}{80}おわかりいただ
{80}{90}おわかりいただけ
{90}{100}おわかりいただけた
{100}{110}おわかりいただけただ
{110}{120}おわかりいただけただろ
{120}{130}おわかりいただけただろう
{130}{140}おわかりいただけただろうか
{140}{150}おわかりいただけただろうか.
{150}{160}おわかりいただけただろうか..
{160}{170}おわかりいただけただろうか...
{170}{300}おわかりいただけただろうか...?

動画に合わせて表示します。

$ gst-launch-1.0 -e \
  filesrc location=subtitles.txt ! \
  subparse ! \
  text. \
  \
  videotestsrc pattern=snow num-buffers=300 ! \
  video/x-raw,width=640,height=480,framerate=30/1 ! \
  textoverlay name=text font-desc="VDL-TeraG, 30" ! \
  autovideosink 

output4_subtitle.jpg

今回のコマンドには2つのストリームがあります。

1つめは filesrc location=subtitles.txt ! subparse の字幕ファイルから字幕データをパースするストリームで、 ! text. の部分でストリームにtextという名前を付けています。

2つめは videotestsrc から始まる動画ストリームです。textoverlay name=textの部分で、先程の字幕ストリームを参照しています。

また、字幕ファイルはMicroDVD形式以外にも、

  • SubRip
  • MPSub
  • SAMI
  • TMPlayer
  • MPL2
  • SubViewer
  • DKS
  • WebVTT
  • QTtext
  • LRC

形式の字幕ファイルにも対応しているようです。

ただMicroDVD、SubRipで試した限り、字幕ファイルではpango markupが使えないようでした...

書き出す

今までは autovideosink で画面に表示しているだけでしたが、h264でエンコードしてMP4ファイルに保存してみます。

$ gst-launch-1.0 -e \
  filesrc location=subtitles.txt ! \
  subparse ! \
  text. \
  \
  videotestsrc pattern=snow num-buffers=300 ! \
  video/x-raw,width=640,height=480,framerate=30/1 ! \
  textoverlay name=text font-desc="VDL-TeraG, 30" ! \
  vtenc_h264 ! \
  mp4mux ! \
  filesink location=output.mp4 

vtenc_h264 でh264にエンコードして mp4mux でMPEGコンテナに格納、filesink でファイルに書き出しています。

※ エンコーダ部分は環境によって使える物が違います。
CPUエンコードのx264encavenc_h264は幅広い環境でも使えるかと思います。
Mac環境ではvtenc_h264 vtenc_h264_hw
IntelCPU Linux環境なら vaapih264enc
NVIDIAのNVENCが扱える環境なら nvv4l2h264enc nvenc
Raspberry Piだと avenc_h264_omx
などなど...エンコーダを明示的に指定できます。

免責事項

当記事内容や映像によって生じたあらゆる損害、呪いについて、当方は一切責任を負いません。

19
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?