Přehrávání a záznam audio streamu, FIFO buffer

Přehrávání a záznam audio streamu, FIFO buffer
« kdy: 21. 04. 2023, 11:25:50 »
Potřebuju přehrávat síťový audio stream a souběžně ukládat do bufferu např. 30-50 sec zpětně.
Ve chvíli, kdy bych potřeboval nahrávku, uložit ZPĚTNĚ i část z bufferu, tedy aktuální čas -30 sec.
Celé to potřebuju udělat v terminálu, bez GUI...

Pro jednoduchost předpokládám použít mplayer, ale není to podmínkou.
Budu rád za každý inspirativní návrh...
« Poslední změna: 21. 04. 2023, 13:39:36 od Petr Krčmář »
PMD85 -> Didaktik Gama -> PC XT -> ... x86/x51/ARM
Basic -> Turbo Pascal -> C++ -> Turbo ASM -> C# -> PHP -> Bash -> Go :-)


Svatopluk Vít

  • *
  • 36
  • Nekuřák, nepiják a nemrava
    • Zobrazit profil
    • Různé info
    • E-mail
Re:Přehrávání && záznam audio streamu, FIFO buffer
« Odpověď #1 kdy: 21. 04. 2023, 12:50:19 »
Streamlink by nepomohl?

RDa

  • *****
  • 3 067
    • Zobrazit profil
    • E-mail
Re:Přehrávání a záznam audio streamu, FIFO buffer
« Odpověď #2 kdy: 21. 04. 2023, 14:36:57 »
Jsem o necem podobnem premyslel, mam pusteno Radio1 pres net ze streamu a nekdy me fakt zaujme dobrej song.. ale to by chtelo fyzicke tlacitko jako v televiznich soutezich, at to proste cinknes a ono se to omarkuje. Me reseni bylo spise ze bych nahraval treba 24h smycku, pripadne vice dle kapacity. Ono to audio zas tolik nezere.

Re:Přehrávání a záznam audio streamu, FIFO buffer
« Odpověď #3 kdy: 21. 04. 2023, 14:53:43 »
Přesně o tohle se taky snažím ;-) Rozdíl je v tom, že ideálně bych chtěl přepínat mezi několika oblíbenýma stanicema a celý to táhnout na RPI.
PMD85 -> Didaktik Gama -> PC XT -> ... x86/x51/ARM
Basic -> Turbo Pascal -> C++ -> Turbo ASM -> C# -> PHP -> Bash -> Go :-)

Re:Přehrávání a záznam audio streamu, FIFO buffer
« Odpověď #4 kdy: 21. 04. 2023, 15:55:03 »
Už jsem párkrát do Rádio 1 psal, že jsem někdy v ten podobný čas slyšel něco co mě zaujmulo. Vždy ochotně poslali playlist a rozklíčovali jsme ten "kravál" :)

Pak jsem si nainstaloval do founu Shazam a od té doby mám hudební svrbění ukojené ;)
kliknu, vidím, mám většinou i texty, youtube link a ještě historii co kdy kde jsem slyšel...


Re:Přehrávání a záznam audio streamu, FIFO buffer
« Odpověď #5 kdy: 21. 04. 2023, 15:55:54 »
Určitě to půjde nějak přes gstreamer (např. element tee). U složitejší pipeliny bývá snazší napíchnout se do ní přes python a Gst a odladit si to pohodlně debuggerem a breakpointy v IDE (např. PyCharmu) - zde např. ukázka nahrávání https://github.com/GStreamer/gst-python/tree/master/examples
« Poslední změna: 21. 04. 2023, 15:57:25 od redustin »

_Jenda

  • *****
  • 1 638
    • Zobrazit profil
    • https://jenda.hrach.eu/
    • E-mail
Re:Přehrávání a záznam audio streamu, FIFO buffer
« Odpověď #6 kdy: 21. 04. 2023, 16:11:35 »
Jak složité by bylo řešit to na úrovni sítě, kdy bys napsal „proxy“ (třeba v Pythonu), která by se připojila na cílový socket, přeposílala data, a držela si posledních X MB provozu?

Jinak mpv má příkaz pro dumpnutí cache na disk a v cache zůstává historie. Ale když jsem to zkoušel u youtube videí, tak mi to pořádně nefungovalo.

Re:Přehrávání a záznam audio streamu, FIFO buffer
« Odpověď #7 kdy: 21. 04. 2023, 16:26:12 »
Cache v mpv/mplayeru by měla fungovat jako buffer mezi vstupem a processingem. Takže pokud bych v ní chtěl držet 90 sekund, předpokládám, že bych musel stream rádia (který má rychlost omezenou na bitrate) přehrávat s odpovídajícím zpožděním, aby se do keše těch 90 sekund nejdříve načetlo.

IMO by to mělo fungovat tak, že se kešuje posledních 90 sekund bokem, mimo hlavní pipelinu.

Re:Přehrávání a záznam audio streamu, FIFO buffer
« Odpověď #8 kdy: 21. 04. 2023, 16:38:42 »
Samozřejmě by to šlo také zařídit přes standardní roury  do arecord a příkaz tee, ale má to mouchy.

Z hloupého bajtstreamu není patrno, kde začíná audioframe, takže pokud se rozhodí synchronizace se začátkem streamu, už se neobnoví. Gstreamer si interně samozřejmě posílá správně zarovnané pakety, takže nic takového nehrozí.

Jako player do roury by to stejně chtělo něco, co dělá adaptivní resampling mezi příchozím streamem a hodinami zvukovky. gstreamer/mplayer/asi mpd by to měly umět, všechny umí výstup přímo do stdout.

Ale i tak jsou roury + tee čuňárna, korektní řešení je napojit se do nějaké pipeliny zpracovávající audiostream (gstreamer, ale asi by to šlo i přes pipewire nebo pulseaudio). Vlastní nahrávadlo, které kešuje x sekund audia a nahraje to na disk do korektního formátu (aspoň wav, lepší flac), asi bude nutné napsat. Jak jsem již zmínil, v pythonu by to nemělo být nic zásadně složitého, na vše z toho jsou knihovny a ukázky.

Možná nakonfigurovat odbočku v pipewire/pulseaudiu a nahrávat v pythonu z ní by nemuselo byt tak složité, jako gst v pythonu (s tím jsem musel docela divoce laborovat, dokumentace detailů je spíše formou mailinglistu gstreameru :-) ).

_Jenda

  • *****
  • 1 638
    • Zobrazit profil
    • https://jenda.hrach.eu/
    • E-mail
Re:Přehrávání a záznam audio streamu, FIFO buffer
« Odpověď #9 kdy: 21. 04. 2023, 17:13:43 »
Cache v mpv/mplayeru by měla fungovat jako buffer mezi vstupem a processingem. Takže pokud bych v ní chtěl držet 90 sekund, předpokládám, že bych musel stream rádia (který má rychlost omezenou na bitrate) přehrávat s odpovídajícím zpožděním, aby se do keše těch 90 sekund nejdříve načetlo.
Mně při přehrávání youtube (přes v podstatě mpv `youtube-dl -f 18 -g ...`) funguje seekování z cache i dozadu. Když máš video (nebo obecně obrazový výstup), tak se nakešované věci ukazují na časové liště s takovou čárou uprostřed.

Re:Přehrávání a záznam audio streamu, FIFO buffer
« Odpověď #10 kdy: 21. 04. 2023, 18:37:43 »
Jj, to možná bude parametr --demuxer-max-back-bytes https://github.com/mpv-player/mpv/blob/master/DOCS/man/options.rst