Bagaimana cara mengekstrak gambar JPEG berkualitas baik dari file video H264 dengan ffmpeg?

108

Saat ini saya menggunakan perintah ini untuk mengekstrak gambar:

ffmpeg.exe -i 10fps.h264 -r 10 -f image2 10fps.h264_% 03d.jpeg

Tetapi bagaimana saya dapat meningkatkan kualitas gambar JPEG?

Daniel Gartmann
sumber
1
Apa yang salah dengan kualitas saat ini, selain itu juga tidak "baik"?
bjoernz

Jawaban:

215

Menggunakan -qscale:v

Gunakan -qscale:v(atau alias -q:v) sebagai opsi keluaran. Rentang efektif untuk JPEG adalah 2-31 dengan 31 sebagai kualitas terburuk. Saya sarankan mencoba nilai 2-5.

Untuk menghasilkan serangkaian gambar:

ffmpeg -i input.mp4 -qscale:v 2 output_%03d.jpg

Untuk menghasilkan gambar tunggal dengan durasi ~ 60 detik:

ffmpeg -ss 60 -i input.mp4 -qscale:v 4 -frames:v 1 output.jpg

Ini akan bekerja dengan input video apa pun. Lihat di bawah jika masukan Anda adalah MJPEG.


MJPEG

Jika input Anda adalah MJPEG (Motion JPEG) maka gambar dapat diekstraksi tanpa kehilangan kualitas.

The ffmpegatau ffprobekonsol keluaran dapat memberitahu Anda jika Anda adalah masukan MJPEG:

$ ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=nw=1 input.avi
codec_name=mjpeg

Kemudian Anda dapat mengekstrak bingkai menggunakan mjpeg2jpegfilter bitstream :

$ ffmpeg -i input.avi -codec:v copy -bsf:v mjpeg2jpeg output_%03d.jpg

Lihat juga

llogan
sumber
Ini tampaknya tidak berpengaruh bagi saya - qscale 1 dan 2 memberikan ukuran file yang identik dan (secara kasat mata) tampak sama seperti tanpa qscale sama sekali.
felwithe
Dapatkah Anda memposting baris perintah lengkap yang Anda gunakan? Juga kirimkan keluaran lengkap yang belum dipotong dari ffmpeg pada baris perintah. Perhatikan bahwa penempatan opsi relevan, jadi -qscale: v 2 perlu ditempatkan setelah opsi -i inputfile, tetapi sebelum opsi file output, untuk memiliki efek.
Ronald S. Bultje
1
Bagi saya menambahkan -qmin 1 -qmax 1selain -q:v 1menggandakan ukuran file. Dan saya juga bisa melihat sedikit peningkatan.
complistic
1
@complistic: -qmin 1 -qmax 1menghasilkan file yang lebih besar, tetapi memberi saya gambar yang sama persis. Saya memvalidasi ini melalui photoshop, 2 layer dan filter perbedaan. Pikselnya sama.
cherouvim
@Kostan Anda dapat mencoba -qmin 1 -q:v 1.
llogan
0

Keluarkan gambar dalam format lossless seperti PNG:

ffmpeg.exe -i 10fps.h264 -r 10 -f image2 10fps.h264_%03d.png

Kemudian gunakan program lain (di mana Anda dapat lebih tepat menentukan kualitas, subsampling dan metode DCT - misalnya GIMP) untuk mengonversi PNG yang Anda inginkan ke JPEG.

Dimungkinkan untuk mendapatkan gambar yang sedikit lebih tajam dalam format JPEG dengan cara ini daripada yang dimungkinkan dengan -qmin 1 -q:v 1dan dikeluarkan sebagai JPEG langsung dari ffmpeg.

Jake
sumber
ffmpegmengeluarkan PNG8file yang hanya menggunakan 256 warna (sama seperti GIF). jadi sebenarnya sangat merugikan.
lapin
@lapin PNG yang saya ekstrak menggunakan metode ini adalah 24 bit (bahkan untuk bingkai dengan kurang dari 256 warna, meskipun yang lain memiliki lebih banyak warna). Ini menggunakan versi 4.2.1 x64 di Windows. Juga tertulis di sini adalah: "Jika saya menarik png dari mp4, dengan ffmpegperintah [ ] ini, saya mendapatkan png kualitas tinggi yang kualitasnya identik dengan video aslinya." Versi apa ffmpegyang Anda gunakan yang mengeluarkan PNG8file, dan apa format input Anda?
Jake
Sebenarnya saya pikir Anda benar, masalahnya adalah yang identify image.pngmemberikan hasil "8-bit" padahal sebenarnya bukan saluran tunggal 8-bit, tetapi 8-bit untuk R, G dan B. IDK bagaimana identifypengguna rata-rata seharusnya memahami itu tho.
lapin