[SOLVED][Bash]wynik z FFMPEG w skrypcie Bash

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
uggp
Piegowaty Guziec
Piegowaty Guziec
Posty: 17
Rejestracja: 27 gru 2006, 18:15
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME

[SOLVED][Bash]wynik z FFMPEG w skrypcie Bash

Post autor: uggp »

Taki problem. Chcę w skrypcie bash wydobyć parametry filmu. Dokładnie jego szerokość, wysokość, fps i proporcje.

W konsoli polecenie:
ffmpeg -i film.ts
wyświetla mi:

Kod: Zaznacz cały

FFmpeg version SVN-r0.5.1-4:0.5.1-1ubuntu1, Copyright (c) 2000-2009 Fabrice Bellard, et al.
  configuration: --extra-version=4:0.5.1-1ubuntu1 --prefix=/usr --enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --disable-stripping --disable-vhook --enable-runtime-cpudetect --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --enable-shared --disable-static
  libavutil     49.15. 0 / 49.15. 0
  libavcodec    52.20. 1 / 52.20. 1
  libavformat   52.31. 0 / 52.31. 0
  libavdevice   52. 1. 0 / 52. 1. 0
  libavfilter    0. 4. 0 /  0. 4. 0
  libswscale     0. 7. 1 /  0. 7. 1
  libpostproc   51. 2. 0 / 51. 2. 0
  built on Mar  4 2010 12:35:30, gcc: 4.4.3

Seems stream 0 codec frame rate differs from container frame rate: 50.00 (50/1) -> 25.00 (25/1)
Input #0, mpegts, from 'film.ts':
  Duration: 00:01:31.87, start: 0.700000, bitrate: 2482 kb/s
  Program 1 Service01
    Stream #0.0[0x100]: Video: mpeg2video, yuv420p, 720x576 [PAR 16:15 DAR 4:3], 8000 kb/s, 25 tbr, 90k tbn, 50 tbc
    Stream #0.1[0x101]: Audio: mp2, 48000 Hz, stereo, s16, 160 kb/s
At least one output file must be specified
Kombinuje z grep ale nie umiem go wykorzystać.
Tak naprawdę interesuje mnie linijka z Video. Jakby ktoś podał mi fragment skryptu, który wydobędzie mi do osobnych zmiennych:
kodek - tu mpeg2video
szerokosc - tu 720
wysokosc -tu 576
par - tu 16:15
dar - 4:3
tbr - tu 25

to było by super. Mi coś nie wychodzi. Jakby ffmpeg na siłę wysyłał na konsolę ale nie do dowolnego strumienia.
Awatar użytkownika
borzole
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 127
Rejestracja: 10 sie 2010, 11:48
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: wynik z FFMPEG w skrypcie Bash

Post autor: borzole »

1. załaduj wynik do zmiennej:

Kod: Zaznacz cały

tmp=`ffmpeg -i film.ts`
2. wyłuskuj wyniki za pomocą awk:

Kod: Zaznacz cały

kodek=$(awk '/Video/ {print $4}' <<<"$tmp")
oczywiście tam mogą się jeszcze jakieś drobne śmieci przemycać, ale to już wystarczy odciąć np. za pomocą "cut"

Kod: Zaznacz cały

kodek=$(awk '/Video/ {print $4}' <<<"$tmp" | cut -d',' -f1)
uggp
Piegowaty Guziec
Piegowaty Guziec
Posty: 17
Rejestracja: 27 gru 2006, 18:15
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME

Odp: wynik z FFMPEG w skrypcie Bash

Post autor: uggp »

borzole pisze:1. załaduj wynik do zmiennej:

Kod: Zaznacz cały

tmp=`ffmpeg -i film.ts`
coś nie działa, tmp jest puste, mało tego ffmpeg popisał mi po ekranie a nie do zmiennej tmp,
nie kumam tego, może ffmpeg jakiś sknocony jest

kolejne linijki wyglądają dla mnie ciekawie, bo awk nie znam, pogoogluje bo widzę, że to ma większe możliwości jak grep

edit:
znalazłem coś takiego na sieci:

Kod: Zaznacz cały

fps=( $(ffmpeg -i "$moviefile" 2>&1 | sed -n "s/.*, \(.*\) tbr.*/\1/p") )
i faktycznie do fps wpada 25. Dlaczego to nie mam pojęcia. Co u diabła znaczy to 2>&1. Bo dalej to się domyślam, że jakieś szyfry SEDa.
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: wynik z FFMPEG w skrypcie Bash

Post autor: beluosus »

uggp pisze:Co u diabła znaczy to 2>&1. Bo dalej to się domyślam, że jakieś szyfry SEDa.
To element bash, przekierowuje stderr na stdout (wyjście błędów na standardowe wyjście). ffmpeg właśnie wypluwa informacje na stderr, a programy zazwyczaj czytają ze stdout..
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
uggp
Piegowaty Guziec
Piegowaty Guziec
Posty: 17
Rejestracja: 27 gru 2006, 18:15
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME

Odp: wynik z FFMPEG w skrypcie Bash

Post autor: uggp »

@borzole @beluosus
Dzięki DOBRODZIEJE. DZIAŁA!

Po wielu bojach zrobiłem takie coś

Kod: Zaznacz cały

#!/bin/bash

moviefile="film.ts"
video=$(ffmpeg -i "$moviefile" 2>&1 | awk '/Video/ {print $0}')
fps=$(awk '{print $13}' <<<"$video")
kodek=$(awk '{print $4}' <<<"$video" | cut -d',' -f1)
szerokosc=$(awk '{print $6}' <<<"$video" | cut -d'x' -f1)
wysokosc=$(awk '{print $6}' <<<"$video" | cut -d'x' -f2)
parl=$(awk '{print $8}' <<<"$video" | cut -d':' -f1)
parm=$(awk '{print $8}' <<<"$video" | cut -d':' -f2)
darl=$(awk '{print $10}' <<<"$video" | cut -d':' -f1)
darm=$(awk '{print $10}' <<<"$video" | cut -d':' -f2)
echo "$video"
echo "FPS = $fps"
echo "Kodek = $kodek"
echo "Szerokosc = $szerokosc"
echo "Wysokosc = $wysokosc"
echo "PAR = ( $parl / $parm )"
echo "DAR = ( $darl / $darm )"

i mam to co chciałem. Ten AWK jest genialny. GREP czy też SED to jakimiś szyframi trzeba dawać. A ten AWK to jak normalny C. Czyli jesteśmy w domu.

Dzięki!
Awatar użytkownika
borzole
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 127
Rejestracja: 10 sie 2010, 11:48
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: wynik z FFMPEG w skrypcie Bash

Post autor: borzole »

...hymm, czyli w tym szczególnym przypadku będzie

Kod: Zaznacz cały

tmp=`ffmpeg -i film.ts 2>&1`
Sed jest dość nieczytelny w tym przypadku. Tutaj zdecydowanie lepiej użyć awk.

[EDYCJA]
oj spóźniony post, widzę że już sobie poradziłeś
uggp
Piegowaty Guziec
Piegowaty Guziec
Posty: 17
Rejestracja: 27 gru 2006, 18:15
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME

Odp: wynik z FFMPEG w skrypcie Bash

Post autor: uggp »

Jeszcze takie info, że kombinowałem ze zwykłym shellem i coś nie szło (czepiał się o <<<). W bashu poszło.

Temat do zamknięcia.

p.s. Głupio się przyznać ale nie wiem jak oznaczyć tytuł [solved] :(
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 11 gości