Nowe posty

Autor Wątek: Przechwytywanie z karty telewizyjnej  (Przeczytany 5652 razy)

Offline

  • Users
  • Stały bywalec
  • ***
  • Wiadomości: 170
    • Zobacz profil
Przechwytywanie z karty telewizyjnej
« dnia: 2009-06-22, 21:33:43 »
Moje eksperymenty z przechwytywaniem z karty telewizyjnej

Próbuję zapisać film jako nieskompresowane klatki. Niestety podczas nagrywania idzie bardzo skokami naprzód. Da się to jakoś zrobić żeby szło płynnie?

Nagrywam to w ten sposób

mencoder tv:// -tv channel=0:driver=v4l2:device=/dev/video0:normid=5:input=1:width=768:height=576: -oac pcm -ovc raw -o /multimedia/Torrent/test.avi
Nie wiem czy to do czegoś może się przydać
Specyfikacja komputera

Procesor Intel Core i7 920
Dysk twardy Maxtor® DiamondMax® 23 1TB (STM31000528AS)
RAM 3GB DDR3
Karta telewizyjna Aver Media 303 (czy jakoś tak) Na chipsecie cx8800
OS Mandriva 2009.1 64bit

Czy da się na tym sprzęcie nagrać w sposób płynny nieskompresowane klatki?

arctgx

  • Gość
Przechwytywanie z karty telewizyjnej
« Odpowiedź #1 dnia: 2009-06-22, 22:25:19 »
Też nie mam pomysłu co by móc dodać do parametrów mencodera, ale na pewno przyjrzałbym się ogólnemu zużyciu zasobów (np. top i d.3), szczególnie pola wa (czyli traceniu przerwań na operacje dyskowe). Pamiętam sprzed miesiąca jak paskudnie szybko rośnie rozmiar takiego surowego materiału, więc i dysk może mieć sporo do przeszkadzania.

Jeśli masz wystarczająco dużo pamięci RAM wolnej, spróbuj zamontować system plików tmpfs i tam zrzucać obraz (nawet jeśli to za mało, to krótkie materiały dla eksperymentów), np.
sudo mount -t tmpfs -o size=150M,mode=777 none /jakis/pusty/katalog
Możesz spróbować skompilować MPlayera wraz z MEncoderem pod własny procesor i zobaczyć czy da to jakieś różnice. Nie wiem jednak czy wystarczy samo to, czy też niektóre zależne biblioteki przy okazji.

Offline

  • Users
  • Stały bywalec
  • ***
  • Wiadomości: 170
    • Zobacz profil
Przechwytywanie z karty telewizyjnej
« Odpowiedź #2 dnia: 2009-06-23, 00:03:08 »
Cytat: arctgx
Też nie mam pomysłu co by móc dodać do parametrów mencodera, ale na pewno przyjrzałbym się ogólnemu zużyciu zasobów (np. top i d.3), szczególnie pola wa (czyli traceniu przerwań na operacje dyskowe). Pamiętam sprzed miesiąca jak paskudnie szybko rośnie rozmiar takiego surowego materiału, więc i dysk może mieć sporo do przeszkadzania.

Jeśli masz wystarczająco dużo pamięci RAM wolnej, spróbuj zamontować system plików tmpfs i tam zrzucać obraz (nawet jeśli to za mało, to krótkie materiały dla eksperymentów), np.
sudo mount -t tmpfs -o size=150M,mode=777 none /jakis/pusty/katalog
Możesz spróbować skompilować MPlayera wraz z MEncoderem pod własny procesor i zobaczyć czy da to jakieś różnice. Nie wiem jednak czy wystarczy samo to, czy też niektóre zależne biblioteki przy okazji.
Procesor wyrabia się bez najmniejszego problemu.  Jak przechwytuję z kompresją w locie to jest wszystko w porządku.

Jeśli bez kompresji to wygląda to tak jakby na dysk dane były przekazywane dużymi paczkami. Co pewien czas zapala się dioda od dysku i właśnie wtedy zatrzymuje się obraz. Zbyt często dane nie są ładowane na dysk. Dysk na który zapisuję strumień nie jest dyskiem systemowym.

arctgx

  • Gość
Przechwytywanie z karty telewizyjnej
« Odpowiedź #3 dnia: 2009-06-23, 01:25:17 »
...i jak się można spodziewać, pole "wa" (iowait) rośnie wtedy blisko setki, bo prędzej dane gromadzone były do buforów: zrzut z nich wydaje się wąskim gardłem. Albo więc tyle potrzebujesz RAM-u, żeby uniknąć pracy dysku podczas nagrywania, albo szybciej działający dysk. Może ktoś inny pomysł będzie miał.

Na mojej wolnej przestrzeni z połowy gigabajta zarejestrowałbym w tym czasie niecałą minutę, z tego co pamiętam. Ze sprzętową za to kompresją MJPEG pół godziny nagrania z kamery zajęło mi około 700 MB.

Swego czasu można było poeksperymentować z optymalizowaniem pracy dysków za pomocą polecenia hdparm. Od czasu, kiedy na miejsce sterownika ide wchodzi libata, nie zdążyłem do końca zorientować się na temat odpowiedników.

Możesz jeszcze wypróbować jakiś szybki system plików. Za taki uchodzi np. XFS, ale znam to nie z doświadczenia, a z obiegowej opinii (masz okazję do zweryfikowania, a świat się nie zawali gdy przywołam obiegówkę :)).

Jest jeszcze taki mechanizm jak planowanie kolejki żądań wejścia-wyjścia dla danego dysku, a jądro oferuje kilka różnych planistów
 #cat /sys/block/sda/queue/scheduler
noop [anticipatory] deadline cfq
(zamiast sda - Twój dysk, bieżący algorytm ujęto w kwadratowy nawias). Dla jednego z takich sposobów kolejkowania (CFQ) (wybierasz przez
echo cfq >/sys/block/sda/queue/scheduler
) istnieje narzędzie ionice do różnicowania, na ile żądanie I/O danego procesu jest ważne w kolejce, np.
ionice -c 1 mencoder ...
Jeśli chcesz eksperymentować, przyda Ci się może trochę materiałów na start:
1. Dokumentacja w źródłach jądra przede wszystkim (Documentation/block/*).
2. http://www.fizyka.umk.pl/~jkob/diagopt.pdf (od str. 238 w bieżącym wydaniu)
3. http://www.linuxjournal.com/article/6931 (jeszcze bez CFQ)
4. http://blog.mgorny.alt.pl/2008/07/06/ionice-priorytetyzacja-operacji-i-o/ (mały opis ionice po polsku).

Jeśli nie masz ochoty rozgryzać teorii, to przynajmniej popróbuj różnych kombinacji systemów plików i planistów wejścia-wyjścia. Nie wiadomo, która z nich będzie dobra dla Ciebie.

Dalej, mencodera można użyć poza środowiskiem graficznym (mplayera również, z -vo fbdev lub fbdev2). Może w ten sposób odciążysz zapis na dysku od konkurencyjnych, przypadkowych żądań i dasz systemowi trochę pamięci.

Offline

  • Users
  • Stały bywalec
  • ***
  • Wiadomości: 170
    • Zobacz profil
Przechwytywanie z karty telewizyjnej
« Odpowiedź #4 dnia: 2009-06-23, 08:28:53 »
Cytat: arctgx
Dalej, mencodera można użyć poza środowiskiem graficznym (mplayera również, z -vo fbdev lub fbdev2). Może w ten sposób odciążysz zapis na dysku od konkurencyjnych, przypadkowych żądań i dasz systemowi trochę pamięci.
Pomimo iż dysk posiada sprzętowe kolejkowanie i szybki interfejs SATA II to przypuszczam, że i tak nie wyrobi się z przyjęciem takiej ilości danych. W RAID na razie nie będę inwestował.

Próbuję cały czas z lekką kompresją ale obraz jest jakiś taki "mdły" moim zdaniem za słabej jakości.

Źródła podają, że przy przechwytywaniu najlepiej użyć mało stratny kodek MJPEG.

 mencoder tv:// -tv channel=0:driver=v4l2:device=/dev/video0:normid=5:input=1:width=768:height=576 -oac copy -ovc lavc -lavcopts vcodec=mjpeg:vbitrate=10000 -o /multimedia/Torrent/test.avi
Gdy używam vbitrate powyżej 10000 to już kodek nie chce przyjmować i ustawia jakąś małą wartość domyślną. Co w powyższym poleceniu można zmienić?

EDIT

Jak mencoderem przechwytywać sam obraz bez dźwięku?

Próbuję zrobić to tak:
[gienek@stacjonarny ~]$ mencoder -noaudio tv:// -tv channel=0:driver=v4l2:device=/dev/video0:normid=5:input=1:width=768:height=576:  -ovc raw -o /multimedia/Torrent/test.avi
MEncoder SVN-1.rc2.23.r28791.2plf2009.1-4.3.2 (C) 2000-2009 MPlayer Team
-noaudio is not an MEncoder option

Exiting... (error parsing command line)
Niestety nic nie wychodzi

arctgx

  • Gość
Przechwytywanie z karty telewizyjnej
« Odpowiedź #5 dnia: 2009-06-24, 13:50:24 »
Zobacz do man -P 'less -p "-tv"' mplayer na temat dwóch opcji dla parametru -tv: noaudio i mjpeg. Ta druga może odciążyć CPU, jeśli karta potrafi sama kompresować - tak to na chłopski rozum interpretuję. Można zresztą porównać. Zamiast noaudio możesz spróbować immediatemode=1.

Offline

  • Users
  • Stały bywalec
  • ***
  • Wiadomości: 170
    • Zobacz profil
Przechwytywanie z karty telewizyjnej
« Odpowiedź #6 dnia: 2009-06-25, 07:41:49 »
-noadio to jest w mplayerze. W mencoderze jest -nosound. Doszukałem się w manualu. Dzięki


EDIT

Co oznacza jeśli w czasie przechwytywania mencoderem pojawia się co jakiś czas takie coś?

ODML: Starting new RIFF chunk at 7166MB.   0min   0mb  A-V:0.000 [49167:128]

arctgx

  • Gość
Przechwytywanie z karty telewizyjnej
« Odpowiedź #7 dnia: 2009-06-25, 15:25:33 »
Chyba słabo szukałeś na temat noaudio (zresztą dałem wprost namiar, czego tu szukać...) ;) Ale nie będę powtarzał, szczególnie czegoś co pogrubiłem.