Saya mencoba untuk menyandikan video .mp4 dari serangkaian bingkai menggunakan FFMPEG menggunakan codec libx264.
Ini adalah perintah yang saya jalankan:
/usr/local/bin/ffmpeg -r 24 -i frame_%05d.jpg -vcodec libx264 -y -an video.mp4
Saya terkadang mendapatkan kesalahan berikut:
[libx264 @ 0xa3b85a0] height not divisible by 2 (520x369)
Setelah mencari-cari sedikit sepertinya masalah ini ada hubungannya dengan algoritma penskalaan dan dapat diperbaiki dengan menambahkan argumen -vf.
Namun, dalam kasus saya, saya tidak ingin melakukan penskalaan. Idealnya, saya ingin menjaga dimensi persis sama dengan bingkai. Ada saran? Apakah ada semacam rasio aspek yang diberlakukan H264?
-vf pad="width=ceil(iw/2)*2:height=ceil(ih/2)*2"
, yang bahkan bukan salah satu jawabannya. Jawaban yang benar untuk pertanyaan semua orang adalah milik LordNeckbeard."scale="
alih-alih"pad="
jika dia tidak ingin piksel padatan berwarna?Jawaban:
Jawaban atas pertanyaan awal yang tidak ingin membuat skala video adalah:
Perintah:
Pada dasarnya, .h264 membutuhkan dimensi genap sehingga filter ini akan:
Anda dapat mengubah warna padding dengan menambahkan parameter filter
:color=white
. Lihat dokumentasi pad .sumber
-vf pad="width=iw:height=ih+1:x=0:y=0:color=white"
. Dokumentasi ffmpeg pad ada di sini: ffmpeg.org/ffmpeg-filters.html#pad-1 .-vf pad="width=ceil(iw/2)*2:height=ceil(ih/2)*2"
.Gunakan saja
-2
Dari dokumentasi filter skala :
Contohnya
Setel lebar menjadi 1280, dan tinggi akan secara otomatis dihitung untuk mempertahankan rasio aspek, dan tinggi akan dapat dibagi 2:
Sama seperti di atas, tetapi dengan tinggi yang dinyatakan sebagai gantinya; meninggalkan lebar untuk ditangani oleh filter:
"habis dibagi 2"
Seperti yang disyaratkan oleh x264, "habis dibagi 2 untuk lebar dan tinggi" diperlukan untuk YUV 4: 2: 0 output yang di-subsampel kroma. 4: 2: 2 akan membutuhkan "dibagi 2 untuk lebar", dan 4: 4: 4 tidak memiliki batasan ini. Namun, sebagian besar pemain berbasis non-FFmpeg hanya dapat mendekode dengan benar 4: 2: 0, jadi itu sebabnya Anda sering melihat
ffmpeg
perintah dengan-pix_fmt yuv420p
opsi saat menghasilkan video H.264.Peringatan
Sayangnya Anda tidak dapat menggunakan
-2
untuk lebar dan tinggi, tetapi jika Anda sudah menentukan satu dimensi maka menggunakan-2
adalah solusi sederhana.sumber
-vf scale=-2:-2
tidak berhasil? Dalam kasus saya, saya ingin mempertahankan ukuran file asli sebanyak mungkin. Apa yang berhasil untuk saya adalah-vf scale=-2:ih
. Tapi itu tidak berhasil jika keduanya h / w tidak merata.-2
tergantung pada nilai yang dinyatakan dari dimensi lain.Size values less than -1 are not acceptable.
tetapi jawaban dari @Zbyszek bekerja dengan sempurna.ffmpeg
. Anda dapat mengunduh bangunan statis .Jika Anda ingin mengatur beberapa lebar keluaran dan memiliki keluaran dengan rasio yang sama seperti aslinya
dan jangan sampai jatuh dengan masalah ini maka Anda bisa menggunakannya
(Hanya untuk orang yang mencari cara melakukannya dengan penskalaan)
sumber
scale="trunc(oh*a/2)*2:720"
Masalah dengan
scale
solusi di sini adalah bahwa mereka mengubah sumber gambar / video yang hampir tidak pernah seperti yang Anda inginkan.Sebagai gantinya, saya telah menemukan solusi terbaik adalah menambahkan pad 1-pixel ke dimensi aneh. (Secara default, pading adalah hitam dan sulit untuk dilihat.)
Masalah dengan
pad
solusi lain adalah bahwa mereka tidak menyamaratakan dimensi sewenang-wenang karena mereka selalu pad.Solusi ini hanya menambahkan pad 1-pixel untuk tinggi dan / atau lebar jika mereka aneh:
Ini ideal karena selalu melakukan hal yang benar bahkan ketika padding tidak diperlukan.
sumber
scale=iw+mod(iw,2):ih+mod(ih,2):flags=neighbor
. Ini hanya dapat meningkatkan setiap dimensi dengan 1, jika diperlukan, dan akan menduplikasi baris / kolom terakhir.Kemungkinan karena fakta bahwa video H264 biasanya dikonversi dari RGB ke ruang YUV sebagai 4: 2: 0 sebelum menerapkan kompresi (meskipun konversi format itu sendiri adalah algoritma kompresi lossy yang menghasilkan penghematan ruang 50%).
YUV-420 dimulai dengan gambar RGB (Merah Hijau Biru) dan mengubahnya menjadi YUV (pada dasarnya satu saluran intensitas dan dua saluran "rona"). Saluran Hue kemudian dicampurkan dengan membuat satu sampel rona untuk setiap 2X2 kotak rona itu.
Jika Anda memiliki jumlah piksel RGB ganjil baik secara horizontal maupun vertikal, Anda akan memiliki data yang tidak lengkap untuk kolom atau baris piksel terakhir dalam ruang rona yang disampelkan pada bingkai YUV.
sumber
LordNeckbeard memiliki jawaban yang benar, sangat cepat
Untuk android, jangan lupa tambahkan
sumber
--disable-asm
-nya . Ini menghasilkan kelambatan yang tidak perlu dan signifikan (Anda dapat memeriksa log ffmpeg dan jika itu menunjukkan maka itu buruk). Saya tidak yakin mengapa mereka menambahkan itu, tapi saya bukan pengembang Android.using cpu capabilties: none!
Anda juga dapat menggunakan
bitand
fungsi alih-alihtrunc
:bitand (x, 65534)
akan melakukan hal yang sama
trunc(x/2)*2
dan lebih transparan menurut saya.(Pertimbangkan 65534 angka ajaib di sini;))
Tugas saya adalah untuk skala banyak file video secara otomatis hingga setengah resolusi .
scale=-2,ih/2
menyebabkan gambar sedikit kaburalasan:
scale
skala dimensi bingkai nyatalarutan:
penjelasan:
setsar=1
berarti output_dimensions sekarang final, tidak ada koreksi rasio aspek yang harus diterapkanSeseorang mungkin menganggap ini bermanfaat.
sumber