Format video universal lossless

14

Saya mencoba menemukan format video lossless paling cocok untuk video 1280x720 25fps. Video ini memiliki 4 menit. Suara akan menjadi 320 kbps mp3, itu bukan masalah besar. Kondisi ideal:

  • Lossless (bisa secara lossless)
  • Container + codec dapat dimainkan di sebagian besar platform
  • Container + codec dapat dimainkan pada pemutar DVD modern (mendukung format lain selain DVD)
  • Ukurannya kurang dari 700 MB

Apakah itu mungkin? Sudah berjuang tiga hari, tanpa hasil yang memuaskan, bahkan mendapatkan file 12 GB (sepertinya banyak - 3 GB / menit).

mrkva
sumber
1
Untuk perbandingan, lihat en.wikipedia.org/wiki/List_of_codecs#Lossless_compression
artistoex
4
Maaf, tetapi Anda praktis tidak bisa mendapatkan video 720p (visual) lossless 4 menit dari 4 menit dikompresi menjadi kurang dari 700 MB (saya berasumsi Megabyte di sini, bukan "mb" yang berarti "sedikit"). Mengapa Anda memiliki kendala seperti itu? Tidak bisakah video dikodekan h.264?
slhck
ya, MB, maaf soal kebingungannya. Saya harus memasukkan video cca 5 x 4 menit menjadi 4 GB (batasan sedang).
mrkva
2
Karena Anda mendapatkan file 12GiB saya berasumsi bahwa Anda menggunakan kedalaman warna 24Bit. Aliran data video terkompresi adalah sekitar 4GiB per menit. Itu sejumlah besar data. Yang Anda inginkan adalah sekitar 170MiB per menit. Terlepas dari codec yang Anda pilih, Anda hanya dapat mencapainya dengan adegan statis tanpa banyak gerakan. Saya khawatir Anda harus mengendurkan kendala agar tidak hilang, mengurangi frame rate atau mentolerir ukuran file yang lebih besar.
Marco
Bisakah Anda mengklarifikasi, "Container + codec dapat diputar di pemutar DVD modern (mendukung format selain DVD)"?
llogan

Jawaban:

24

Sebenarnya, format matematis lossless terbaik yang saya tahu adalah huffyuv, tetapi itu akan menghasilkan file besar yang meriah, dan tidak akan kompatibel dengan banyak. Sebagai catatan, ffmpeg dapat melakukannya dengan:

ffmpeg -i input -c:v huffyuv -c:a libmp3lame -b:a 320k output.avi

X264, sumber terbuka h.264 encoder, memiliki mode lossless. Ini bisa masuk ke dalam wadah MP4, dan harus kompatibel dengan sebagian besar perangkat keras yang dibuat dalam beberapa tahun terakhir. Perintah pertama akan memberikan kecepatan encode cepat, tetapi file besar; perintah kedua akan memakan waktu lebih lama, tetapi file harus sekitar setengah ukuran dari yang dikodekan cepat (itu masih akan cukup besar):

ffmpeg -i input -c:v libx264 -crf 0 -preset ultrafast -c:a libmp3lame -b:a 320k output.mp4

ffmpeg -i input -c:v libx264 -crf 0 -preset veryslow -c:a libmp3lame -b:a 320k output.mp4

Jika itu tidak memberi Anda file yang cukup kecil, crf dari 18 umumnya dianggap 'visual lossless':

ffmpeg -i input -c:v libx264 -crf 18 -preset veryfast -c:a libmp3lame -b:a 320k output.mp4

Saya biasanya merekomendasikan preset sangat cepat untuk encoding dengan x264, dalam pengalaman saya ini menawarkan kecepatan / ukuran tradeoff terbaik (ada penurunan besar dalam ukuran file antara supercepat dan sangat cepat, ada yang lebih lambat dari itu dan itu lebih bertahap). Saran umum adalah menggunakan preset paling lambat yang bisa Anda tangani, presetnya adalah: ultrafast, superfast, veryfast, lebih cepat, cepat, sedang, lambat, lebih lambat, sangat lambat.

Lihat di sini untuk panduan yang lebih mendalam tentang penyandian x264.

Evilsoup
sumber
2
Jangan menyarankan veryfastsebagai default yang baik untuk x264 lossy. mediumadalah jalan tengah yang baik, tetapi saya biasanya menggunakan veryslowuntuk pengkodean akhir dari apa pun. Juga huffyuvtidak terlalu cepat, saya tidak akan merekomendasikan hal ini selain kompatibilitas.
Peter Cordes
ffmpeg memiliki beberapa codec lossless lain yang mungkin layak untuk dicoba [FFv1 terlintas dalam pikiran] juga. GL!
rogerdpack
Bukankah libx264 menurunkan dua saluran warna (dalam YUV UV) setengahnya pada kedua arah bahkan jika Anda menggunakan CRF 0 sehingga tidak benar-benar lossless. Juga, dengan kesalahan pembulatan, data tidak dijamin indentis bit-for-bit setelah putaran kompresi x264.
Adisak
1
Dalam percobaan saya dengan ffmpeg 3.4.1, libx264 menggunakan format pixel yuv444, di mana "444" berarti "jangan downsample bagian U, V". Dan, OP secara eksplisit tidak keberatan membulatkan kesalahan: "bisa jadi tanpa kerugian". Jadi, @Adisak, kekhawatiran Anda masuk akal, tetapi tidak berlaku untuk jawaban ini.
Jim DeLaHunt
ffmpeg dan libx264 dalam mode YUV akan menegosiasikan format piksel YUV berdasarkan input. Jadi, jika inputnya YUV 4: 2: 0 maka format output pixelnya juga. Jika inputnya YUV 4: 4: 4 atau RGB, maka outputnya adalah YUV 4: 4: 4.
Gyan
2

Hari ini saya suka webm :

ffmpeg -i input.avi -c:v libvpx-vp9 -lossless 1 output.webm

Untuk mengkonversi lebih cepat, dengan prosesor multi-core, saya telah membacanya, disarankan untuk menggunakan satu utas yang lebih sedikit daripada yang Anda miliki dari inti sebenarnya. Jadi, dengan 8 inti Anda dapat menentukan 7 utas seperti ini:

ffmpeg -i input.avi -c:v libvpx-vp9 -threads 7 -lossless 1 output.webm
LonnieBest
sumber
1
Saya suka menggunakan variabel lingkungan% NUMBER_OF_PROCESSORS% untuk menentukan jumlah utas yang digunakan. Jika hitungannya 1 atau 2, saya menggunakan semua prosesor. Jika hitungannya 3 atau 4, saya menggunakan semua kecuali satu prosesor. Dan jika penghitungan lebih tinggi, saya menggunakan semua kecuali dua prosesor untuk penghitungan utas.
Adisak
1
Sebagai ekspresi DOS, akan terlihat seperti ini: jika "% ADJUSTED_CPUCOUNT%" EQU "" (jika% NUMBER_OF_PROCESSORS% EQU 1 (atur ADJUSTED_CPUCOUNT = 1) lain jika% NUMBER_OF_PROCESSORS% EQU 2 (atur ADJUSTED_CPU% ANGKA% EQU 3 (atur ADJUSTED_CPUCOUNT = 2) lain jika% NUMBER_OF_PROCESSORS% EQU 4 (atur ADJUSTED_CPUCOUNT = 3) lain (atur / A ADJUSTED_CPUCOUNT =% NUMBER_OF_PROCESSORS% -2))
Adisak
1
superuser.com/questions/155305/… mengatakan bahwa ffmpeg sudah memilih jumlah utas yang optimal
Boris
Pilihan yang lebih baik daripada webm (hari ini) mungkin adalah format av1 .
LonnieBest
-1
# CONTAINER

untuk memiliki kompatibilitas penuh dengan pemutar DVD, Anda harus menggunakan format MPEG-2, wadah, batasan, codec. Saya kira, "pemain modern" berarti kompatibilitas "mp4", yang pada dasarnya dan sebagian besar merupakan pemutar file mp4 - H.264, MPEG-4, AVC => libx264
baca selengkapnya: https://de.wikipedia.org/wiki /H.264

# VIDEO

Lihat https://trac.ffmpeg.org/wiki/Encode/H.264 , terutama bagian tentang "profil" dan "level", untuk kompatibilitas
Penggunaan -profile:v high -level 4.0harus melakukannya

# AUDIO

Hindari pengkodean ulang trek audio dengan codec lossy - format mp3 apa pun lossy, bahkan 320kbps.
Gunakan -c:a copysebagai gantinya.

Sejauh ini, itu melakukan pekerjaan yang cukup baik bagi saya. tidak ada masalah sinkronisasi.
Streaming audio tidak terikat pada bingkai kunci. Pemotongan yang akurat dimungkinkan.
Jika audio-track Anda direkam pada laju sampling 44kHz, gunakan maks. 256kbps

Gunakan codec lossy hanya untuk penyandian akhir video Anda, jika Anda perlu menyesuaikan prasyarat tertentu.

Saya pernah mendengar tentang beberapa masalah sinkronisasi audio, tetapi sepertinya masalah utama yang ada, materi yang dilindungi (!).

# Akhirnya

Saya lebih suka yang seperti ini:
ffmpeg -i input -c:v libx264 -crf 5 -preset faster -profile:v high -level 4.0 -c:a copy output.mp4

d'oh
sumber
Opsi "-level 4.0" tidak diperlukan. Level dalam x264 ditentukan berdasarkan resolusi dan FPS, jadi biasanya tidak ada titik untuk mengaturnya secara manual, ini tidak akan memperbaiki apa pun. Sejauh yang saya tahu ffmpeg dapat mengatur level yang benar secara otomatis, jadi kecuali Anda memiliki alasan yang sangat bagus untuk memaksanya dan sepenuhnya memahami cara memilih level berdasarkan FPS dan resolusi, Anda tidak boleh menggunakan opsi "-level". Jika Anda peduli dengan kompatibilitas tertinggi, gunakan profil "baseline" sebagai gantinya "tinggi".
Lissanro Rayen