Androidのオーディオ入力ストリームからSMPTEタイムコード(ウィキペディア)を抽出しようとしています。
ここで述べたように、 https://stackoverflow.com/a/2099226最初のステップは、同期するために0011111111111101の入力ストリームバイトシーケンスをスキャンすることです。しかし、AudioRecordクラスでこれを行う方法は?
Androidのオーディオ入力ストリームからSMPTEタイムコード(ウィキペディア)を抽出しようとしています。
ここで述べたように、 https://stackoverflow.com/a/2099226最初のステップは、同期するために0011111111111101の入力ストリームバイトシーケンスをスキャンすることです。しかし、AudioRecordクラスでこれを行う方法は?
その答えは本当に正しくありません。取得するオーディオ信号は変調された搬送波であり、そこからSMPTEビットを抽出することは多段階のプロセスです。マイクまたはオーディオを介して取得する生データはSMPTEタイムコードに対応しません。したがって、オーディオをデコードする必要がありますが、これはまったく単純ではありません。
最初のステップは、オーディオ信号をバイフェーズマークコードから変換することです。私自身はSMPTEリーダーを実装していませんが、SMPTE標準のクロックレートを知っているので、最初に行うことは、バックグラウンドノイズを取り除くために慎重にフィルタリングすることです。マイク。DCオフセットを除去するための穏やかなハイパスで十分であり、HFノイズの穏やかなローパスも役立つはずです。(代わりに、広いバンドパスを使用できます)
次に、各クロックサイクルの開始を見つける必要があります。自己相関やPLLアルゴリズムのような凝ったことをすることもできますが、SMPTE標準からおおよそのクロックレートを知り、数パーセント上下に調整できることで十分だと思います。したがって、仕様に従って遷移が繰り返されることを確認してください。タイムコードが大きく歪んでいると思われる場合は、何か凝ったことをするのが役立ちます(これは、非常に古いテープデッキを使用している場合や、非常に高速/低速で同期したい場合に当てはまりますが、LTCは実際にはこのために設計されていません。より多くのVTCのドメイン。)。
クロックを特定したら、クロックティックごとに、クロックサイクルの開始時に信号の遷移が発生したかどうかを判断する必要があります。各クロックティックは途中で遷移しますが、開始時の遷移は0ビットを示します。これが、BMCがクロックとデータの両方を単一のストリームで送信する方法です。これにより、実際のSMPTEデータの新しいストリームを作成できます。
これで、BMCをSMPTEストリームにデコードしました。次のステップは、同期コードを探すことです。ウィキペディアの仕様とSMPTEの記憶から、80ビットブロックの他の場所で偶然または偶然に発生する可能性のある単一の同期コードを見つけるだけでは不十分であると断言します。代わりに、適切な間隔で連続して複数を見つける必要があります。次に、データを80ビットのSMPTEブロックに読み取ることができます。読み取りながら、同期コードの検証を続行する必要があります。期待した場所に見つからない場合は、最初から検索を開始してください。
最後に、デコードしたら、常にすべてのデータを正しく読み取ることはほぼ確実ではないため、「フライホイール」を作成する方法を考え出す必要があります(チェックサムはありません!)。それが獣の性質です。