mencoder script

Van egy scriptem, mely két log-ot is készít egy-egy fájlba.
mencoder (sok minden) -o film_neve.avi 2>/film_neve_error.log 1>film_neve_uzenet.log
De emiatt nem tudom hogy éppen hol tart a felvétel, mivel nem jelenít meg semmit a parancssorban.
Milyen módon lehetne megoldani, hogy a mencoder egy bizonyos sora megjelenjen a parancssorban? Egyfajta számlálóként.
A scriptben meg van adva az is hogy mennyi ideig tartson a felvétel. 90 perc, 3 óra, stb.

Vagy egy visszaszámláló kéne, vagy egy olyasmi amit végül is ő is kiír de az mindig lefut a képernyőről.

Jó lenne ha nem futna le a képernyőről, és adott sorban jelenítené meg de csak EZT:
Pos: 1.0s 22f ( 0%) 20.09fps Trem: 0min 0mb A-V:0.000 [0:0]
Ebből elég lenne ha csak a másodpercenkénti értékeket jelenítené meg, anélkül hogy az lefutna a képernyőről. (noscroll)
Pos: 1.0s
Ebből tudnánk hogy éppen hol tart a kódolás. Egy külső óra (stopper) nem biztos hogy jó lenne, mivel van olyan hogy 1 perc felvétel a valóságban 1,5 perc alatt készül el.
(kódolási opciók)

Hozzászólások

tee?

mencoder -o film_neve.avi 2>/film_neve_error.log | tee film_neve_uzenet.log

Nekem nem fut le a képernyőről, hanem a Pos:... kezdetű mindig felülírja magát (\r, gondolnám naívan). Ha neked lefut, akkor kipróbálnám másik terminállal. Én az xterm-et favorizálom.

Így nekem sem fut le, de a sallang nem kéne csak a Pos: kezdetű sor. Az is kivetelezhető talán valahogy?

Amúgy a konsole-ben próbálgattam.
Egy csomó parancs van amit nem is ismerek. Ez a tee frankó. Mert elkészíti a log fájlt is meg ki is írja.
Ezt lehet esetleg grep-elni? MIndjárt kipróbálom.

OT: kijavítanád a szálkezdő felvetésben a code tag lezárását? Baromira ronda így az egész szál :)
bocsi. Elnéztem.
Természetesen, ebben az esetben a képernyőn már csak a szűrt üzenet fog látszani (a logfájlba írást ne akard grep-pel kezelni).
No igen . No de akkor hogy adjam meg neki? Mert ugye ez így egyszerre nem megy.
Csak utólag szűrhetem meg, de ennek jelen esetben semmi értelme. Ahogy veszi a a filmet, úgy kéne kiírnia hogy hol tart.
Amit meg is tesz, de a script is ír ki pár dolgot a képernyőre és ennek tartalma elvész, ha a mencoder logja megjelenik teljes terjedelmében.

MEncoder SVN-1.rc2.23.r28791.1plf2008.1-4.2.3 (C) 2000-2009 MPlayer Team
success: format: 9 data: 0x0 - 0x0
TV file format detected.
Selected driver: v4l2
name: Video 4 Linux 2 input
author: Martin Olschewski

comment: first try, more to come ;-)
Selected device: Pinnacle PCTV 40i/50i/110i (saa
Tuner cap: STEREO LANG1 LANG2
Tuner rxs: MONO
Capabilites: video capture video overlay VBI capture device tuner read/write streaming
supported norms: 0 = NTSC; 1 = NTSC-M; 2 = NTSC-M-JP; 3 = NTSC-M-KR; 4 = PAL; 5 = PAL-BG; 6 = PAL-H; 7 = PAL-I; 8 = PAL-DK; 9 = PAL-M; 10 = PAL-N; 11 = PAL-Nc; 12 = PAL-60; 13 = SECAM; 14 = SECAM-B; 15 = SECAM-G; 16 = SECAM-H; 17 = SECAM-DK; 18 = SECAM-L; 19 = SECAM-Lc;
inputs: 0 = Television; 1 = Composite1; 2 = Composite2; 3 = S-Video;
Current input: 0
Current format: BGR24
v4l2: current audio mode is : STEREO
Selected channel: SE16 (freq: 266.250)
[V] filefmt:9 fourcc:0x32315659 size:720x576 fps:25.000 ftime:=0.0400
==========================================================================
Opening audio decoder: [pcm] Uncompressed PCM audio decoder
AUDIO: 44100 Hz, 2 ch, s16le, 1411.2 kbit/100.00% (ratio: 176400->176400)
Selected audio codec: [pcm] afm: pcm (Uncompressed PCM)
==========================================================================
xvid: using library version 1.1.3 (build xvid-1.1.3)
Opening video filter: [expand osd=1]
Expand: -1 x -1, -1 ; -1, osd: 1, aspect: 0.000000, round: 1
Opening video filter: [crop w=672 h=544 x=24 y=16]
Crop: 672 x 544, 24 ; 16
==========================================================================
Opening video decoder: [raw] RAW Uncompressed Video
VDec: vo config request - 720 x 576 (preferred colorspace: Planar YV12)
VDec: using Planar YV12 as output csp (no 0)
Movie-Aspect is undefined - no prescaling applied.
videocodec: XviD (672x544 fourcc=44495658 [XVID])
xvid: par=68/63 (ext), displayed=672x544, sampled=672x544
xvid: CBR Rate Control -- bitrate=1800kbit/s
Selected video codec: [rawyv12] vfm: raw (RAW YV12)
==========================================================================
MP3 audio selected.
Pos: 0.0s 1f ( 0%) 0.00fps Trem: 0min 0mb A-V:0.000 [0:0]
Writing header...
ODML: vprp aspect is 16384:13263.
Setting audio delay to 0.052s.
Writing header...
ODML: vprp aspect is 16384:13263.
Setting audio delay to 0.052s.

Ez a sallang nem kéne hogy megjelenjen, csak ez a Pos: sor

Pos: 1.0s 27f ( 0%) 20.00fps Trem: 0min 0mb A-V:0.000 [2822:95]


mencoder -o film_neve.avi 2>/film_neve_error.log | tee film_neve_uzenet.log | grep '^Pos:'

Lévén multitaszkos oprendszerről beszélünk, így a mencoder, a tee és a grep kb párhuzamosan futnak, azaz egy-két millisec-en belül megjelenik a grep kimenetén is az, amit a mencoder kiköpött.

Hát ezt már én is próbáltam, bár nem tettem bele hatványjelet, de sem azzal sem nélküle nem jó a kijelzés.
./mintaproba1

Writing header...1f ( 0%) 0.00fps Trem: 0min 0mb A-V:0.000 [0:0]
Pos: 90.0s 2249f ( 0%) 24.93fps Trem: 0min 0mb A-V:0.000 [1823:96]

Csak ezt látom, ezt is két sorban, és semmi frissülés nem jelentkezik a Pos:. másodpercek terén. Ezt szeretném ha számolna.
De mégcsak a scriptből sem lép ki. Nekem kell CTRL-C-vel megszakítanom.
Próbálkoztam mencoder -o ... & watch "cat ${film_neve}_uzenet.log | tail -n 1" -gyel is de az még rosszabb volt.

mencoder -o TEST.MP4 1>1.txt 2>2.txt & watch tail -c 100 1.txt

a -c 100 egy sacc érték. (utolsó 100 karakter)
a -n azért nemjó mert a mencoder clearline okat használ és nem newlineokat, tehát az egész egy sor...

jaigen csak hogy ne legyen aknnyira jó... Ctrl-c csak a második részt zárjaa be.... szóval a mencoder kilövéséhez kell egy
$fg
meg még egy Ctrl+c

### ()__))____________)~~~ ###
#"Ha én veletek, ki ellenetek?"
#ASUS eee 900 //Ubuntu9.04//Xfce//

>> a -n azért nemjó mert a mencoder clearline okat használ és nem newlineokat, tehát az egész egy sor...

Ilyenkor jó az awk, amelynekek egyrészt van egy RS változója, másrészt egy "beépített grepje".


mencoder (sok minden) -o film_neve.avi 2>/film_neve_error.log | tee film_neve_uzenet.log | awk -vRS='\r' -vORS='\r' '/^Pos:/ {print $2}'

Húúú! Te egy úr vagy!

Ez jó, már tényleg csak szépészeti beavatkozás kellene.
A script miután megtudta az adatokat, kiírja hogy :

echo -e ${CYAN} "A felvétel elkezdődött. "

Az lenne a hab a tortán, ha kihagynánk egy szóközt, és ott pörögne a számláló a szöveg után. Mert jelenleg egy új sor legelején teszi.
Azt is egy fekete, zöld, sárga, (kinek mi) tele téglalapban, és abban kezd el számolni.

Ha echo -ne -t használok, akkor ugyan ott kezdődik el ahol szeretném, de aztán a sor elejére ugrik, és elmaszálja a "A felvétel elkezdődött" szöveg elejét.

Ez egy parancssoros interaktív "videómagnó" tvkártyához.
Most már így is publikálható, de ott van az kis de.. :-)

De most ki is próbáltam, és kiegészítetem ezt így:
echo -e ${CYAN} " innen kivettem a szöveget.
És betettem ide:

| awk -vRS='\r' -vORS='\r' '/^Pos:/ {print "A felvétel elkezdődött: " $2}'

Tökéletes. Ma holnap publikálom is. Helyet keresek neki.
Köszönöm az eddigi segítséget is.

Nos sajna van egy számomra érthetetlen jelenség ezzel az awk-os sorral.
Ha elérte a 999-et a másodperc, akkor onnantól kezdve a frame-k számát írja ki, és nem a másodperc számlálást mutatja.
Ez vajon mitől lehet? Lehetne ezt orvosolni?
Azt már kinyomoztam, hogy mi micsoda, de nekem ez még sajna kínai.

RS: bemeneti rekordhatároló
ORS: Kimeneti rekordhatároló
Az is jó lenne ha valaki elmagyarázná mi micsoda ebben a sorban. Az a $2 mit takar a sor végén?

De alighanem ott van a kutya elásva, hogy a 999 előtt még van szóköz, az 1000 előtt meg már nincs.
Pos: 999.9s 24994f ( 0%) 24.99fps Trem: 0min 0mb A-V:0.000 [1802:96]
Pos:1000.0s 24995f ( 0%) 25.00fps Trem: 0min 0mb A-V:0.000 [1802:96]

De akkor ezt most én hogyan oldjam meg? Az awk ezek szerint az első szóközt keresi, és onnan írja ki a dolgot.
Lehet hogy egy :-ot kellene neki megadni mintakarakternek? Lehet ilyet? Hol?
Mert ekkor a Pos: utáni részt írná ki, és az már jó is lenne.

| awk ... " $2}'
helyett
| awk ... ":$2}' így? Mindjárt kipróbálom.

nem teljesen látom át a gondjaidat, de:
- log file bámulásra a tail -f -et javaslom
- a szám kivágására meg a cut -ds -f 1 | cut -d: -f 2 sort. Ha nagyon kell, akkor tegyél elé egy grep '^Pos' -t
- ha nem tetszik, hogy a mencoder cr-t használ sorvége jelnek, tr-rel le lehet cserélni. Ha jól emlékszem, \r-et kell cserélni \n-re, de ebben nem vagyok teljesen biztos.

Ez egy interaktív "videómagnó" script. A tail benne is van. Olvasd az elejétől a topic-ot. S nem csak azt akarom hogy leszűrjem utólag a grep-pel, mert nem erre van szükségem, hanem arra, hogy valósidőben mutassa a mencoder által generált sor egy részét.
Tehát a script megkapta az adatokat, elindul, de hogy tudjam is hogy éppen hol tart a felvétel, anélkül hogy lefutna képernyőről az üzenet, látnom kellene a mencoder számlálóját.
De csak azt!
Tehát a videómagnó script kiírja hogy a A felvétel aktuális ideje: ...
S a ... helyére az awk-kal be kellene szúrni a mencoder által időközben folyamatosan generált log-ból a Pos: utáni számláló értékét.
Ez működik is addig, amíg a számláló nem éri el az 1000-es értéket. Ugyanis az awk-os rutin a szóközt veszi figyelembe rekord választóként, ha jól értem.
Viszont a mencoder az 1000. másodpercben eltünteti a szóközt, ezért a mezőrekord áttolódik a frame számlálóra ami viszont nekem nem jó.
A parancs:
mencoder sok sok minden...
-o ${film_neve}.avi 2>${film_neve}_error.log | tee ${film_neve}_uzenet.log | awk -vRS='\r' -vORS='\r' '/^Pos:/ {print "A felvétel aktuális ideje: " $2}'

A mencoder logja így néz ki amiből dolgozik:
Pos: 0.1s 2f ( 0%) 0.00fps Trem: 0min 0mb A-V:0.000 [0:0]
Pos: 60.7s 1516f ( 0%) 24.93fps Trem: 0min 0mb A-V:0.000 [1808:96]
Pos: 108.1s 2701f ( 0%) 24.96fps Trem: 0min 0mb A-V:0.000 [1809:95]
Pos: 999.9s 24994f ( 0%) 24.99fps Trem: 0min 0mb A-V:0.000 [1801:96]
Pos:1000.0s 24995f ( 0%) 25.00fps Trem: 0min 0mb A-V:0.000 [1801:96]

Eltűnik a szóköz mint határoló karakter a Pos: után.
No ez a gondom.
A script 0.2-es verziója letölthető a linuxfórumról. Ez az első scriptem, de itt megakadtam. Vannak még persze hiányosságai, melyeket tudásomhoz mérten próbálok foltozgatni...

A legrövidebb megoldás tán az, hogy aszondod az awk-nak, hogy a mezőelválasztó nem 1/több (fehér) szóköz (alapértelmezett), hanem 1/több kettőspont vagy (az egyszerűség kedvéért) szóköz. A paraméterlistát ki kell egészíteni ezzel:

-F'[: ]+'

a többi változatlan.

VIGYÁZAT! Kivételesen nem próbáltam ki. :)

Esetleg így:
mencoder ...... -o $1.mpg 2>$1_err.log | tee $1_msg.log | awk -vFS='s' -vRS='\r' -vORS='\r' '/^Po/ {print "A felvétel aktuális ideje [mp]" $2}'

Az a trükk, hogy a mezőelválasztónak az 's' betűt használjuk, és a második mezőt iratjuk ki.
Első mező: Po
Mezőelválasztó: s
Második mező: : xxx
Mezőelválasztó: s

A Második mező része lesz a ':' is, így azt nem kell kiíratni. Hátránya: 1000-től nincs szóköz a : és a szám között. De az mencoder kimenetében sincs!

Ha ragaszkodsz a : és a szám közötti szóközhöz:

mencoder ... 2>$1_err.log | tee $1_msg.log | awk -vFS='[s:]' -vRS='\r' -vORS='\r' '/^Po/ {print "A felvétel aktuális ideje [mp]: " $3}'

Most az 's' és a ':' a mezőelválasztó, így a harmadik mezőt kell kiíratni, és természetesen a kettőspontot is.

Csak lesek mint Jenő a moziban. De közben tanulok is. Jó hogy van hozzá magyarázat. Köszi.
Innentől kezdve hogy adjunk a processzornak több munkát, akár át is konvertálhatnánk a másodperces kijelzést normális hh:mm:ss formátummá.
Elvetemült programozók biztos hogy ezt is megoldanák. :-)
De nekem ez így is nagyon nagyon megfelel.
Mégegyszer köszi mindenkinek.

Ha nagyon akarod :-)
Csak a vége:
... {print "A felvétel aktuális ideje: " int($3/3600) " óra " int($3/60%60) " perc " int($3%60) " mp " }'
A végén (" mp ") az mp után három szóköz kell (de lehet hogy 2 is elég).
vagy:
... {print "A felvétel aktuális ideje: " int($3/3600) ":" int($3/60%60) ":" int($3%60) ": " }'