Saya memiliki sejumlah besar jpg yang ingin saya konversi menjadi video lossless (atau, paling tidak, sangat dekat dengan lossless selama waktu penyandian tidak jauh lebih tinggi daripada yang lain).
Secara naif, saya akan berpikir bahwa harus ada beberapa codec yang dapat menyimpan setiap frame jpg individu apa adanya (tanpa recompression), dan mungkin mencapai beberapa kompresi yang bagus dengan mengganti beberapa frame hanya dengan informasi pada delta dari frame sebelumnya. Dalam kasus saya ada banyak urutan frame yang identik satu sama lain, atau yang memiliki perbedaan kecil di antara mereka.
Apakah ada beberapa pengaturan codec dan cocok untuk ffmpeg yang dapat mencapai ini?
Jawaban:
Hanya mux gambar
Anda dapat dengan mudah mux gambar JPG untuk membuat video:
Perhatikan bahwa jika Anda menghilangkan
-framerate
maka default-framerate 25
akan diterapkan pada input.Optimalisasi lossless
Anda dapat menggunakan
jpegtran
untuk melakukan optimasi lossless pada setiap frame yang dapat memberikan penghematan ukuran file yang signifikan:Sekarang mux dengan
ffmpeg
seperti yang ditunjukkan di atas.Memeriksa bahwa itu sebenarnya lossless
The framehash muxer dapat digunakan untuk membandingkan hash unik setiap frame untuk memastikan bahwa hasilnya adalah benar-benar lossless:
Dalam contoh di atas setiap frame terkait untuk input dan output berbagi hash yang sama memastikan bahwa frame identik dan bahwa output adalah lossless.
Lihat juga
sumber
framemd5
yang seharusnya dicapai oleh kedua perintah itu di luar daftar hash? bagaimana saya mendapatkan kompresi tambahan ketika frame identik diidentifikasi?Ini akan menghasilkan video H.264 lossless di mana frame akan menggunakan informasi dari frame lain
ffmpeg -f image2 -r 30 -i %09d.jpg -vcodec libx264 -profile:v high444 -refs 16 -crf 0 -preset ultrafast a.mp4
Penjelasan opsi:
-f image2
- Memberitahu ffmpeg untuk memilih grup gambar-r 30
- Memberitahu ffmpeg untuk mengkodekan pada 30 frame (atau gambar) per detik (ubah ini ke framerate yang Anda inginkan)-i %09d.jpg
- Memberitahu ffmpeg untuk menggunakan gambar 000000000.jpg hingga 999999999.jpg sebagai input. Ubah9
in%09d.jpg
menjadi berapa banyak nol yang dimiliki nama-nama urutan gambar Anda. Jika nama file Anda, misalnya, img0001.jpg, maka ini akan dinyatakan sebagai img% 04d.jpg-vcodec libx264
- Memberitahu ffmpeg untuk menampilkan ke file yang kompatibel dengan H.264-profile:v high444
- memberitahu libx264 untuk menggunakan profil Prediksi Lossless 4: 4: 4 Tinggi, memungkinkan penyandian lossless-refs 16
- memberitahu libx264 untuk menyimpan 16 gambar dalam buffer, sehingga dapat dirujuk oleh gambar lain dalam video-crf 0
- memberitahu libx264 untuk melakukan penyandian lossless-preset ultrafast
- Memberitahu libx264 untuk memprioritaskan kecepatan encoding di atas ukuran file outputa.mp4
- Memberitahu ffmpeg untuk menyimpan output dalam file MP4 bernama a.mp4. Ubah ini ke nama file dan format yang ingin Anda gunakansumber
-f image2
berlebihan di sini. The file gambar demuxer harus menggunakan-framerate
bukan-r
. libx264 akan secara otomatis memilih yang sesuai-profile
untuk lossless, dan-preset
akan menangani-refs
.-refs 5
di MOST, kecuali Anda tahu konten Anda memiliki gambar yang identik dipisahkan oleh beberapa yang lain, yang mungkin menyebabkan x264 kehilangan referensi sebelum sampai ke duplikat. Lebih tinggi daripadaultrafast
membuat sedikit berbeda dalam mode lossless, selain CABAC ~ 10% keuntungan atas CAVLC (untuk biaya cpu tinggi pada bitrate yang diperlukan untuk lossless). Serius, pada beberapa live-action 720x480p60 (output deinterlace),superfast
adalah 28GB,slower
adalah 27GB. Jika waktu enkode tidak masalah, tetapi waktu decode tidak, pastikan Anda menghindari CABAC. Bahkan mungkin-tune fastdecode
. Hitungan ref moderat seharusnya tidak sakit.-preset placebo
beberapa persen ekstra persen.-vcodec libx265 -x265-params lossless=1
adalah opsi yang setara. (Tapi dalam pengalaman saya (= merekam presentasi slideshow Powerpoint), itu belum tentu lebih baik, dan jauh lebih lambat daripada h264) Tetap selaras untuk AV1 / IETF tahun depan dari AOMedia, NETVC1 / IETF, Daala Xiph / apa pun yang akan diubah namanya saat itu ... Mode losslessAnda dapat membuat
avi
animasi sebagai serangkaianpng
gambar (tidakpng
ada kerugian sehinggajpeg => png
konversi tidak boleh menurunkan gambar Anda):jika gambar Anda bernama
img_0001.jpg
di mana "25" adalah frame rate yang Anda inginkan dalam video yang dihasilkan.
-start_number
tidak diperlukan jika 1, tetapi berguna jika nomor video pertama Anda bukan 1.Jika Anda ingin menyandikan
mjpeg
dengan baris perintah kualitas tertinggi adalah:Dan keindahannya adalah Anda dapat mengonversi video kembali ke seri gambar:
dll ...
sumber
Untuk memperluas jawaban LordNeckbeard, ya, cukup masukkan data JPEG ke dalam aliran video MJPEG. Itu akan menjadi representasi terkecil dari urutan yang tepat dari gambar output, meskipun MJPEG adalah codec yang sangat tidak efisien menurut standar saat ini. (tidak ada redundansi temporal, dan bahkan tidak ada prediksi intra.
Anda dapat membuat video MJPEG variabel-framerate untuk mengambil keuntungan dari gambar duplikat di input Anda.
Hrm, ini tidak akan berfungsi, karena mpdecimate tidak akan bekerja pada data terkompresi, dan kami tidak dapat membiarkan ffmpeg mendekode dan kemudian kembali jpeg data gambar tanpa kehilangan dan biaya CPU.
Mungkin jika Anda mengganti duplikat file sumber jpg dengan file kosong dengan nomor urut itu, atau sesuatu?
Karena pertanyaan ini bahkan tidak baru, saya tidak akan meluangkan waktu untuk mencari tahu bagaimana melakukannya kecuali seseorang menjawab untuk bertanya bagaimana. Tapi karena MJPEG dapat masuk ke wadah mkv, saya yakin mungkin untuk memiliki file yang tidak menduplikasi data jpeg untuk frame berulang, tetapi sebaliknya tidak memiliki frame output untuk memecahkan kode sampai urutan duplikat adalah lebih.
Oh, ini ide:
Kemudian hapus (atau minggir) semua jpeg untuk frame yang ingin dijatuhkan mpdecimate (mungkin ia memiliki beberapa opsi logging? Atau -vf showinfo, dan parsing itu, dan pindahkan atau hardlink hanya frame yang muncul di outputnya, meninggalkan JPEG yang dijatuhkan?). mux yang ke MJPEG.mkv, lalu lakukan sesuatu dengan mkvmerge untuk mengganti frame timestamp di dalamnya dengan timestamps dari
mpdecimate.timestamps
.Jika Anda xcoding, bukan hanya muxing data jpeg ke MJPEG, ini akan jauh lebih mudah, karena Anda hanya akan menggunakan perintah pertama saya dengan mpdecimate dan codec selain
copy
, dan itu hanya akan berfungsi (tm).Saya belum mencoba semua ini, karena ini adalah pertanyaan lama. Juga alasan saya belum mengisi celah bagaimana sebenarnya menyaring direktori jpeg Anda berdasarkan pada output mpdecimate, atau bagaimana cara benar-benar menggunakan aliran cap waktu.
sumber