Bagaimana saya bisa mengirim output ffmpeg ke ffplay?

22

Bagaimana saya bisa mem-pipe output dari ffmpeg ke ffplay?

Saat ini saya menggunakan solusi di bash:

mkfifo spam
(ffplay spam 2> /dev/null &) ; capture /dev/stdout | ffmpeg -i - spam
wim
sumber

Jawaban:

18

Saya tidak tahu apakah itu ffmpegyang tidak dapat menampilkan datanya ke stdout, atau ffplayyang tidak dapat mengambil input dari stdin.

Jika itu ffmpegyang tidak bisa menampilkan data ke stdout:

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

(Anda perlu menambahkan -argumen ffplaysehingga dibutuhkan input dari stdin.)

Jika itu ffplaytidak dapat mengambil input dari stdin:

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

Untuk informasi lebih lanjut tentang <(command)dan >(command)konstruksi, lihat bagian Pergantian Proses dari manual bash.

jfg956
sumber
4
bagi saya ini tidak berhasil tanpa secara khusus menentukan format output dengan "-f". seperti yang ditentukan pada ffmpeg.org/ffmpeg.html : "format biasanya terdeteksi secara otomatis untuk file input dan ditebak dari ekstensi file untuk file output". dalam jawaban yang diberikan ffmpeg tidak akan bisa menebak format output. jadi saya pikir ffmpeg harus memiliki "-f fmt" ditambahkan padanya.
Pavel K.
1
ffmpeg 2.8.6 mendukung input stdin sebagaimana disebutkan dalam jawaban lain. Anda dapat memeriksa dukungan itu dengan: stackoverflow.com/questions/12999674/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
17
ffmpeg -i input.avi <options> -f matroska - | ffplay -

akan bekerja; Anda perlu mengatur format wadah untuk output. Ini biasanya diatur dengan ffmpeg melihat ekstensi yang Anda berikan output, tetapi di sini Anda harus mengaturnya secara manual -f. Saya merekomendasikan matroska (MKV) karena dapat berisi hampir semua video, jadi apa pun yang Anda transcoding harus bekerja dengan baik.

Perhatikan bahwa jika Anda menggunakan Ubuntu 12.04, ffmpeg telah digantikan oleh garpu libav, dan Anda harus menggunakan avconvdan avplaysebagai gantinya; sintaksnya identik. Ada semacam ffmpeg di sana, tapi itu lumpuh karena desain.

Evilsoup
sumber
Win10: Kesalahan terjadi seperti pipe:: Invalid data found when processing inputKpada Power Shell, tetapi bekerja dengan baik di command prompt
John
11

ffmpeg mendukung operasi perpipaan. Lihat bagian dokumentasi itu di sini .

Saya tidak tahu bagaimana ffplay bekerja, tetapi untuk mem-pipe output dari ffmpeg ke output standar, Anda dapat menambahkan perintah pipe ke akhir perintah ffmpeg. Contoh:

ffmpeg -i input.flv pipe:1 | ffplay -i -
matzahboy
sumber
1
terima kasih, saya entah bagaimana melewatkan bagian halaman man .. namun saya tidak dapat membuat konstruk ini berfungsi, nama file keluaran perlu dihapus dari ffmpeg dan pipa input ditambahkan ke ffplay args. saya akan mengedit posting Anda sesuai ..
wim
Terima kasih. Seperti yang saya katakan, saya belum pernah menggunakan ffplay sebelumnya, tapi saya tahu ffmpeg.
matzahboy
Di saya man ffplay, saya tidak bisa melihat ffplaymendukung -isaklar - apakah itu mungkin ffmpegsaja?
sdaau
1
pipe:1vs -? -bekerja pada ffmpeg 2.8.6.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
9

sepertinya pipa normal berfungsi (setidaknya di windows):

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

belum mencobanya dengan input / output yang lebih rumit ...

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

adalah startup yang sedikit lebih cepat

rogerdpack
sumber
5
Saya mendapatkan Unable to find a suitable output format for 'pipe:'- saya perlu menentukan codec dengan -f.
i336_
Bekerja, tetapi kualitas gambar sangat rendah
John
Jika kualitas gambar rendah maka pastikan bahwa apa yang Anda tangkap awalnya adalah kualitas gambar tinggi (simpan terlebih dahulu ke file, dll.) Itu "harus" menjadi kualitas normal ...
rogerdpack