Mam projekt C# pracy z wejściowego audio Stream z Kinect 1, Kinect 2, Mikrofon lub cokolwiek innego.W jaki sposób można podzielić i potokować wiele strumieni NAudio
waveIn.DataAvailable += (object sender, WaveInEventArgs e) => {
lock(buffer){
var pos = buffer.Position;
buffer.Write(e.Buffer, 0, e.BytesRecorded);
buffer.Position = pos;
}
};
Zmienna buforowa to strumień ze składnika A, który zostanie przetworzony przez komponent B do rozpoznawania mowy działający na strumieniach.
dodam nowe składniki C, D, E, praca na Streams obliczyć boiska, wykrywanie dźwięku, wykonaj drukowanie palca, lub cokolwiek innego ...
Jak można powielać, że Stream dla składników C, D, E?
Składnik A wysłać zdarzenie „Mam Stream robić to, co chcesz” Nie chcę, aby odwrócić logikę przez zdarzenie „Daj mi swoje strumienie”
szukam na "MultiStream", który mógłby dać mi Stream instancji i będzie obsługiwać zadanie
Składnik a
var MultiStream buffer = new MultiStream()
...
SendMyEventWith(buffer)
Komponent B, C, D, E
public void HandleMyEvent(MultiStream buffer){
var stream = buffer.GetNewStream();
var engine = new EngineComponentB()
engine.SetStream(stream);
}
- MultiStream musi być Stream zawinąć metody write() (bo Stream nie ma dostępnych danych mechaniki)?
- Jeśli strumień jest usuwany() przez komponent B, MultiStream powinien usunąć go z tablicy?
- MultiStream musi wyjątek na read() wymagają użycia GetNewStream()
EDIT: Kinect 1 zapewniają samego Stream ... :-(należy używać wątek pumpit do MultiStream ?
Czy ktoś ma tego rodzaju MultiStream klasy?
Dzięki
W obserwatorze Pub/Sub zapisuję dane ze strumienia na inny za pomocą wątku? To może naprawić problem z urządzeniem Kinect 1, który zapewnia strumień, który mogę przepompować do strumienia pamięci. –
Ale to nie rozwiązuje problemu MultiStream. Po stronie mam strumień w komponencie A, a po drugiej mam czytniki B, C, D, E, które chcą czytać cały strumień. Więc to nie jest problem z blokadą, ale kwestia "odczytania" kursora Próbuję rozwiązać –
W metodzie 'Notify' w' IObservable 'publikujesz odebrane informacje do każdego subskrybenta, więc każdy subskrybent otrzymuje pełną kopię danych pracować nad. Jeśli chcesz zachować historię danych w każdym obserwatorze, to użycie pamięci może trochę wystrzelić ... to chyba kompromis. Możesz * udostępnić * strumień pomiędzy różnymi subskrybentami, jeśli naprawdę chcesz, z obiektem kursora strumieniowego dla każdego subskrybenta, który obsługuje niezależne pozycjonowanie, którego wymagają. Byłoby fajnie napisać, ale wypróbuj Pub/Sub. –
Corey