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
@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 ( ͡° ʖ̯ ͡°)
@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 /media/video.avi
recaudio.sh:
#usuwanie poprzednio nagranego strumienia audio
rm /media/audio.wav
#nagrywanie nowego strumienia audio
arecord -f dat -D plughw:Camera --duration=30 /media/audio.wav

natomiast preview robię z pomocą mplayera:

mplayer tv:///dev/video0 -ss 0 -endpos 30
a AVmerge.sh wygląda tak:

name=vidgot
@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 /dev/video1 \
-c:v libx264 -preset medium -q 18 \
-c:a aac -b:a 256k \
-movflags +faststart \
output.mp4

Może dasz rade przerobić to na avconv'a i pozbedziesz sie 2 skryptów.
countdown.sh nie powinien być wykonany bez & (jako że
@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 przez
@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.
@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
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 picam
@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 ;)