Wpis z mikrobloga

Czołem, Nocne Mirki!
Dziś mam pytanie głównie do Linuchmajstrów:
SYTUACJA:
Rozpoczynam jednoczesne nagrywanie audio i video z pomocą dwóch bashowych skryptów w oparciu o avconv (ffmpeg), procedura dzieje się w tle. Użytkownik widzi w tym czasie 3-sekundowe odliczanie w postaci pliku video (countdown.mp4), po czym pokazuje się mu podgląd z wycelowanej w niego kamery (stream z pomocą mplayera). Po 30 sekundach (a dokładnie 34s, licząc wraz z momentem odliczania) użytkownikowi wyświetla się podziękowanie, a nagrane pliki audio i video są sklejane avconvem(ffmpegiem) do postaci jednego pliku mp4.

PROBLEMY:
1. skrypty nie chcą działać jednocześnie (tzn. jednoczesne nagrywanie audio i video działa, ale jeśli układ komend w głównym skrypcie wygląda następująco:
bash countdown.sh &
bash preview.sh &
bash recvideo.sh &
bash rec
audio.sh &
bash AVmerge.sh &

... to skrypty nie działają jednocześnie - nagrywanie odbywa się dopiero po wykonaniu countdown.sh i preview.sh.
Jak sprawić, aby nagrywanie rozpoczęło się w tle, tj. wraz z rozpoczęciem wykonywania countdown.sh i preview.sh?

#kiciochpyta #linux #bash #programowanie #raspberrypi
  • 18
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@fervi: nie mam w tym szczególnego celu - ot, wywołuję skrypt po skrypcie. Są jakieś wady takiego rozwiązania? Słabo u mnie z bashem, więc jest to zapewne jedna z wielu moich wpadek w tym temacie ( ͡° ʖ̯ ͡°)
  • Odpowiedz
@rethil: No właśnie nie wiem, czy mogę wywołać jednocześnie recaudio i recvideo - ja robię to następująco:

recvideo.sh:

avconv -threads auto -f video4linux2 -i /dev/video0 -s 800x600 -t 30 -r 20 -b:v 6M -y
  • Odpowiedz
@Lord_Gerwazy: pobierałem audio + video przy pomocy ffmpeg w ten sposób:

ffmpeg -f alsa -thread_queue_size 1024 \
-ac 1 -ar 44100 -i hw:3,0 \
-standard ntsc \
-f v4l2 -thread_queue_size 1024 -i
  • Odpowiedz
@rethil: zaczynam nagrywanie już w momencie startu odliczania (zapewniając sobie "rozbiegówkę" na wypadek spatków framerate'a itp.).
Próbowałem zrobić to z wykorzystaniem Alsy, problem w tym, że RPi 2b+ zdaje się być na tyle słabiutki, że Alsa zaczyna pluć błędami o zapchanym buforze mimo, że ręcznie ustawiłem jej go wystarczająco duży. Na domiar złego, występowały liczne problemy z synchronizacją i inne temu podobne błędy. Dlatego zdecydowałem się na osobne nagrywanie dźwięku
  • Odpowiedz
@Lord_Gerwazy W linku ktory wcześniej wrzuciłem widzę że nie da się nagrywac i robić podgląd z 1 urządzenia. :/

You can’t record and play at the same time because there is only one /dev/video1 device, and once either mencoder or mplayer is using it, the device is “busy” to any other program that wants to read the video stream.
  • Odpowiedz
@Lord_Gerwazy: jeśli będziesz nagrywać osobno stream audio i video, to zawsze będziesz mieć problem z synchronizacją (różny moment startu, rożny rzeczywisty bitrate, itp).

Osobiście robiłem niedawno coś podobnego na RPi camera + karta dźwiękowa na USB. Bardzo pomocny jest w tym wypadku projekt: https://github.com/iizukanao/picam (streamowanie na żywo/zapis do plików dobrze zsynchronizowanego audio + wideo i sterowanie hook'ami przez tworzenie plików - więc łatwo zintegrować to z jakimiś skryptami). Całość zrobiona sensownie
  • Odpowiedz
nie widzę możliwości używania kamerki internetowej zamiast oficjalnej RasPi Cam - istnieje w ogóle taka możliwość?


@Lord_Gerwazy: Niestety nie, samo przepychanie obrazu z v4l do sprzętowego enkodera H264 nie byłoby takie trudne (tu przykładowy kod który to robi: https://www.raspberrypi.org/forums/viewtopic.php?f=38&t=41844&start=50), ale trzeba by ogarnąć też różne tryby/ustawienia które takie kamery mogą obsługiwać. Wydaje mi się, że mechanizm synchronizacji audio-wideo zaimplementowany teraz w picam by wystarczył. Tyle że trzeba by to do
  • Odpowiedz
  • 0
@nalajcie36 audio nagrywam arecordem, równolegle z nagraniem video i muszę ze zdziwieniem przyznać, że nie mam problemu z synchronizacją mimo, iż plik video pozostawia sporo do życzenia (gubione klatki, artefakty, bardzo niski fps mimo niskiego bitrate'u). Obecnie wojuję z gstreamerem gdyż czytałem o obsługiwanym przez niego sprzętowym enkodowaniu. Niestety, nie udało mi się znaleźć praktycznych informacji co do pipeline'a, który oferowałby taką możliwość bez litanii błędów ;)
  • Odpowiedz