2013-12-23

OpenLP + FFmpeg でテキストをオーバレイ

OpenLP には, 遠隔操作用プラグインがあり, JSONによって表示中のテキストを取得することができる. OpenLP のテキストを FFmpeg でオーバレイするためのスクリプトを作成した.
#! /bin/env python
# vi: set expandtab sw=4 ts=4:

server='http://192.168.xx.xx:4316'
out='/dev/shm/live.txt'
tmp='/dev/shm/live.txt.tmp'

def get(url):
    import urllib2
    import json
    s = urllib2.urlopen(server+url).read()
    j = json.loads(s)
    return j

def text():
    t = get('/api/controller/live/text')
    ss = t[u'results'][u'slides']
    for s in ss:
        text = s[u'text']
        selected= s[u'selected']
        if selected:
            return text

def update(s):
    import os
    if s==u'':
        s = u'\n'
    open(tmp, 'w').write(s.encode('utf_8'))
    os.rename(tmp, out)

pp = False

while True:
    try:
        p = get('/api/poll')
        if p!=pp:
            t = text()
            pp = p
            print p
            print t.encode('utf_8')
            update(t)
    except:
        update(u'')
        import time
        time.sleep(10)
    import time
    time.sleep(1)
これを実行した上で, FFmpeg を以下のように起動する.
/usr/local/bin/ffmpeg -loglevel warning -f video4linux2 -i /dev/video0 -f alsa -i hw:0 \
-vf drawtext='fontfile=/usr/share/fonts/ipa-gothic/ipag.ttf:textfile=/dev/shm/live.txt:fontsize=24:fontcolor=black:box=1:y=12:x=(W-tw)/2:reload=1:boxcolor=white@0.5' \
-vb 2048k -ab 64 -f mpegts -vcodec mpeg2video -pix_fmt yuv420p -b:v 3M -acodec mp2 -ab 128k -ar 44100 -ac 2 -aspect 4:3 - | \
/usr/local/bin/ffmpeg -loglevel warning -f mpegts -i - http://127.0.0.1:9999/feed1.ffm
なぜか feed1.ffmを出力にするとフィルタが機能しなかったので, パイプを使った.

1 件のコメント:

  1. 映像と音声がずれる場合は, -itsoffset offset オプションを音声の前に入れると良いかもしれない.

    返信削除