Strona 1 z 1

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

: 12 sie 2010, 10:56
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.

Odp: wynik z FFMPEG w skrypcie Bash

: 12 sie 2010, 14:00
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)

Odp: wynik z FFMPEG w skrypcie Bash

: 12 sie 2010, 19:36
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.

Odp: wynik z FFMPEG w skrypcie Bash

: 12 sie 2010, 21:22
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..

Odp: wynik z FFMPEG w skrypcie Bash

: 12 sie 2010, 22:23
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!

Odp: wynik z FFMPEG w skrypcie Bash

: 12 sie 2010, 22:23
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ś

Odp: wynik z FFMPEG w skrypcie Bash

: 12 sie 2010, 22:29
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] :(