コンピューターによって記録された他のセンサーに関して特定の記録されたイベントがいつ発生するかを正確に (ミリ秒単位で) 知ることができるように、コンピューターを外部カムコーダーの記録と同期させたいと考えています。1 つのアイデアは、カムコーダーのマイクが拾うコンピューターからの短いパルス音またはチャープ音を毎秒再生することです。しかし、サウンド クリップを再生する単純な cron ジョブの精度は十分ではありません。gstreamer のようなものを使用することを考えていましたが、システム クロックに従って正確に特定の時間にクリップを再生するにはどうすればよいでしょうか?
2 に答える
ビデオカメラの開始時刻がわかっている場合は、キャプチャされたビデオストリームから、ビデオの任意の時刻の時刻を取得できます。これを行う必要はありません。すべてのフレームには、コンテナ内のフレームに関連付けられたタイムスタンプがあり、正確な時刻を知ることができます。必要なのは、開始時間に注意することだけです。
編集:それを行う別の方法は次のようになります:あなたが信頼できる時計を持っているなら、あなたはそれをビデオカメラの道に入れることができますか?ですから、あなたは常にビデオ自体に対策を講じています。
これを解決するための私の試みは次のとおりです。http://pygstdocs.berlios.de/pygst-tutorial/playbin.htmlの gstreamer python チュートリアル コマンドライン プレイビン (例 2.3) の 1 つを変更して、システム クロックと同期した定義された間隔でサウンド ファイルを繰り返し再生しました。
パイプラインがシンクからのデフォルト クロックの代わりにシステム クロックを使用することを確認し、パイプラインがエレメントのベース タイムを設定できないようにしました。次に、ファイルの再生が完了すると、先頭に戻り、シンクが次のエポックでバッファの再生を待機するようにベース時間が手動で設定されます。
#!/usr/bin/env python
import sys, os
#import time, thread
import glib,gobject
import pygst
pygst.require("0.10")
import gst
class CLI_Main:
def __init__(self):
self.player = gst.element_factory_make("playbin2", "player")
fakesink = gst.element_factory_make("fakesink", "fakesink")
self.player.set_property("video-sink", fakesink)
bus = self.player.get_bus()
bus.add_signal_watch()
bus.connect("message", self.on_message)
# use the system clock instead of the sink's clock
self.sysclock = gst.system_clock_obtain()
self.player.use_clock(self.sysclock)
# disable the pipeline from setting element base times
self.player.set_start_time(gst.CLOCK_TIME_NONE)
# default tick interval
self.tick_interval = 1;
self.tick_interval = float(sys.argv[1])
filepath = sys.argv[2]
if os.path.isfile(filepath):
self.playmode = True
self.player.set_property("uri", "file://" + filepath)
current_time = self.sysclock.get_time()
print current_time
play_time = (current_time/long(self.tick_interval*gst.SECOND) + 1) * long(self.tick_interval*gst.SECOND)
print play_time
self.player.set_base_time(play_time)
self.player.set_state(gst.STATE_PLAYING)
print "starting"
def on_message(self, bus, message):
t = message.type
if t == gst.MESSAGE_EOS:
# compute the next time the sound should be played
current_time = self.sysclock.get_time()
play_time = (current_time/int(self.tick_interval*gst.SECOND) + 1)*int(self.tick_interval*gst.SECOND)
# setup the next time to play the sound and seek it to the beginning
self.player.set_base_time(play_time)
# seek the player so that the sound plays from the beginning
self.player.seek(1.0, gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, gst.SEEK_TYPE_SET, 0L, gst.SEEK_TYPE_NONE, 0L)
# make sure that the player will play
self.player.set_state(gst.STATE_PLAYING)
#self.playmode = False
print play_time
elif t == gst.MESSAGE_ERROR:
self.player.set_state(gst.STATE_NULL)
err, debug = message.parse_error()
print "Error: %s" % err, debug
self.playmode = False
mainclass = CLI_Main()
loop = glib.MainLoop()
loop.run()
コードがハッキングされていてごちゃごちゃしていたらごめんなさい。私はまだpythonに慣れていません。