Jak mogę przesyłać dane wyjściowe z ffmpeg do ffplay?

22

Jak mogę przesyłać dane wyjściowe z ffmpeg do ffplay?

W tej chwili używam obejścia w bash:

mkfifo spam
(ffplay spam 2> /dev/null &) ; capture /dev/stdout | ffmpeg -i - spam
wim
źródło

Odpowiedzi:

18

Nie wiem, czy to nie jest w ffmpegstanie wyprowadzić danych na standardowe wyjście lub ffplayże nie może pobrać danych wejściowych ze standardowego wejścia.

Jeśli tak ffmpeg, to nie może wyprowadzić swoich danych na standardowe wyjście:

capture /dev/stdout | ffmpeg -i - >(ffplay 2> /dev/null)

(Musisz dodać -argument, aby pobierał ffplaydane wejściowe ze standardowego wejścia.)

Jeśli tak ffplay, to nie może pobrać danych wejściowych ze standardowego wejścia:

ffplay <(capture /dev/stdout | ffmpeg -i -) 2> /dev/null

Aby uzyskać więcej informacji na temat <(command)i >(command)konstrukcji, zobacz sekcję Podstawianie procesów w podręczniku bash.

jfg956
źródło
4
dla mnie to nie działało bez wyraźnego określenia formatu wyjściowego za pomocą „-f”. jak określono na ffmpeg.org/ffmpeg.html : „format jest zwykle automatycznie wykrywany dla plików wejściowych i domyślany z rozszerzenia pliku wyjściowego”. w podanej odpowiedzi ffmpeg nie będzie w stanie odgadnąć formatu wyjściowego. więc myślę, że ffmpeg powinien mieć dodane „-f fmt”.
Pavel K.,
1
ffmpeg 2.8.6 obsługuje wejście stdin, jak wspomniano w innych odpowiedziach. Możesz sprawdzić, czy wsparcie to: stackoverflow.com/questions/12999674/...
Ciro Santilli 新疆 新疆 中心 法轮功 六四 事件
17
ffmpeg -i input.avi <options> -f matroska - | ffplay -

będzie działać; musisz ustawić format kontenera dla danych wyjściowych. Zwykle jest to ustawiane przez ffmpeg patrząc na rozszerzenie, które podajesz, ale tutaj musisz ustawić je ręcznie za pomocą -f. Polecam matroska (MKV), ponieważ może zawierać prawie każdy film, więc wszystko, co go transkodujesz, powinno działać idealnie.

Zauważ, że jeśli używasz Ubuntu 12.04, ffmpeg został zastąpiony przez libav fork i powinieneś użyć avconvi avplayzamiast niego; w przeciwnym razie składnia jest identyczna. Jest tam coś w rodzaju ffmpeg, ale jest sparaliżowane przez projekt.

zła
źródło
Win10: Występuje błąd jak pipe:: Invalid data found when processing inputKw Power Shell, ale działa dobrze w wierszu poleceń
John
11

ffmpeg obsługuje operacje rurociągów. Zobacz tę sekcję dokumentacji tutaj .

Nie wiem, jak działa ffplay, ale aby przesłać dane wyjściowe ffmpeg do standardowego wyjścia, możesz dodać polecenie pip na końcu polecenia ffmpeg. Przykład:

ffmpeg -i input.flv pipe:1 | ffplay -i -
matzahboy
źródło
1
dzięki, jakoś przegapiłem tę sekcję stron podręcznika .. jednak nie mogłem uruchomić tej konstrukcji, nazwa pliku wyjściowego musi zostać usunięta z ffmpeg, a rurka wejściowa dodana do argumentów ffplay. odpowiednio zmodyfikuję twój post.
wim
Dzięki. Jak powiedziałem, nigdy wcześniej nie korzystałem z ffplay, ale znam ffmpeg.
matzahboy
W moim man ffplayprzypadku nie widzę ffplaywsparcia dla -iprzełącznika - czy to może ffmpegtylko?
sdaau
1
pipe:1kontra -? -działa na ffmpeg 2.8.6.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
9

wygląda jak normalne rury działające (przynajmniej w systemie Windows):

ffmpeg -i sintel.mpg -pix_fmt yuv420p -f rawvideo - | ffplay -f rawvideo -pix_fmt yuv420p -s 720x480 -

chociaż nie próbowałem tego z bardziej skomplikowanymi wejściami / wyjściami ...

ffmpeg -f dshow -i video=screen-capture-recorder -pix_fmt yuv420p -f mpegts - | ffplay -analyzeduration 10 -f mpegts -

jest nieco szybszy start

rogerdpack
źródło
5
Dostawałem Unable to find a suitable output format for 'pipe:'- musiałem podać kodek -f.
i336_
Działa, ale bardzo niska jakość obrazu
John
Jeśli jest to niska jakość obrazu, upewnij się, że to, co początkowo rejestrujesz, to wysoka jakość obrazu (najpierw zapisz go w pliku itp.), „Powinna” być normalnej jakości ...
rogerdpack