the way to detect sync time of two audios の皮算用

完遂するかは気力次第。

これとかで「同じ対象を別アングルから複数撮影者が撮影した動画たち」の同期なんてことを考えたわけだけれど、これを目と耳だけで頑張るのがかなり大変で。こんなん GUI があったって大変だろうが、ffmpeg と普通のプレイヤーだけでどうにかしようとするのはなかなかに筆舌に尽くしがたい。

当然絵よりは音の方が(対象までの距離差が小さい限り)同期のヒントにするには相応しくて、これに基づいて同期時刻を知る方法はあるだろうなぁ、と。waveform 絵をΔtずつの移動ウィンドウで類似をはかるとか、FFT して周波数ドメインでごにょごにょするんだろうなぁ、と、入り口の想像はつかないことはないけれど、「あるだろ、きっと」と探したら、ないことはなかった。ふむ、狙ったわけではないが Python でやっておるね、ありがたい。

ただ、これこれ、ともにそのまま使うのはほぼ零点で、作りがかなりヒドいので、「現実」に適用するとメモリエラーと悶絶する遅さで全然使い物にならない。

後者のほうが前者を書き換えたものらしく、そして作者の思惑は実にワタシのとまったく同じで、かなり用途を限定したシンプルなものに直されてる。(つまり「既に手持ちの2つの動画を同期ポイントを知りたいだけ」。)必要なら Python 3 対応、これは print と has_key を直せばいいだけ。もうひとつ、subprocess.call の使い方が阿呆なので、shell=True でない使い方に「戻す」(元のままでは Windows でまともに動かないし、Unix でだって shell=True なんかやるべきじゃない)。Memory Error を起こさないようにするには、find_freq_pairs をジェネレータに書き換えて、これを受ける側(find_delay)をインデクスループでなく素直に for pair in time_pairs にすればいい。

ただ、そもそも「たぶん Python かなり初心者」が書いたと思われるコードで非常に非効率なのは一瞥してわかるので…、この説明:

に基づいて、プログラム全体をほぼ一から書き直した方が早いんじゃないかという気がする。(最低でもあまりに numpy array の使い方を理解してなくてそれが理由で重くなってるのだが、書かれてしまっているコードを元にするとかえって理解しずらい。)

まぁもう少し眺めてみるけれど、完遂するかは気力が続けばの話。


06:34追記: 悶絶するほど遅いのは true div, floor div 関連だった。やりかけのもの、fork して必要最小限の fix をしたやつ、GitHub に置いといた