Bagaimana cara mengubah ukuran bingkai, menjaga lebar (menggunakan ffmpeg)?


21

Saya baru ke situs StackExchange ini, dan menggunakan enkoder FFmpeg. Saya memiliki video 720x480 (3: 2) yang ingin saya ubah menjadi 720x406 (16: 9) agar sesuai dengan video lain yang saya miliki untuk sebuah situs. Saya telah mencoba berbagai kombinasi perintah, termasuk:

ffmpeg -i myfile.mv4 -s 720x406 outfile.mp4
ffmpeg -i myfile.m4v -c copy -aspect 16:9 outfile.mp4

Yang akhirnya saya dapatkan adalah video yang diperkecil hingga ketinggian tertentu, tetapi tidak mempertahankan lebarnya. Itu berakhir di 608x406 atau sekitar itu. Saya telah bermain dengan berbagai versi GUI dari FFmpeg hari ini, dan mereka tampaknya melakukan hal yang sama.

Apa yang akan menjadi opsi / parameter yang tepat untuk dilewati (dengan asumsi saya akan memiliki lebih banyak kontrol melalui baris perintah) untuk mencapai ukuran bingkai yang diinginkan?

Jawaban:


36

menggunakan filter skala akan melakukannya, tetapi ada sedikit lebih banyak untuk itu.

ffmpeg -i input.mov -vf scale=720x406 output.mov 

akan membuat film dengan dimensi piksel yang diperlukan, tetapi jika Anda melihat outputnya, Anda akan menemukan bahwa itu menambahkan informasi ke dalam metadata sehingga akan diputar ulang pada rasio aspek yang sama seperti aslinya, dengan menggunakan piksel non-persegi. Jadi jika Anda ingin meregangkan film secara anamorphically ke aspek rasio baru Anda perlu secara manual mengatur rasio aspek piksel, disebut SAR untuk "Rasio Aspek Sampel", sehingga untuk penggunaan piksel persegi:

ffmpeg -i input.mov -vf scale=720x406,setsar=1:1 output.mov

Atau Anda dapat mengatur rasio aspek tampilan ke apa pun yang Anda inginkan, dengan demikian:

ffmpeg -i input.mov -vf scale=720x406,setdar=16:9 output.mov

Apa yang saya lakukan dengan perintah -vf dan x = y, z = ekspresi yang mengikuti adalah membuat rantai filter . Filter bisa sangat kompleks, tetapi dalam penggunaan paling sederhana mereka mengambil formulir effect=parameter,nexteffect=anotherparameter, dan mereka diproses sesuai urutan Anda menulisnya.

Anda mungkin ingin menempatkan perintah tambahan untuk codec dan sebagainya, misalnya -c:v libx264untuk menggunakan encoder x264 mp4, dan sesuatu seperti -crf 20mengatur faktor laju konstan menjadi 20 (biasanya kompromi yang cukup bagus antara ukuran dan kualitas). Jadi, perintah yang cukup lengkap akan terlihat seperti:

ffmpeg -i input.mov -vf scale=720x406,setdar=16:9 -c:v libx264 -preset slow -profile:v main -crf 20 output.mov

Profil utama bagus untuk kompatibilitas perangkat, slowpreset untuk libx264 encoder adalah keseimbangan kecepatan dan kualitas yang cukup bagus, jadi ini adalah kuda yang bekerja dengan baik untuk penyandian web secara umum. Anda dapat membuatnya lebih cepat dengan menggunakan fastatau veryfastatau lebih lambat dengan veryslowdan placeboakan membuatnya sedikit lebih baik daripada veryslowdengan mengorbankan lebih banyak waktu pemrosesan (karenanya namanya).

BTW Jangan gunakan -c copy , itu artinya cukup salin video dan stream audio tanpa melakukan apa-apa sama sekali , jadi tidak ada yang Anda lakukan dalam hal skala, codec, bitrate dll akan memiliki efek.


1
Jika Anda menggunakan ffmpeg versi terbaru, Anda tidak perlu lagi menetapkan x264 sebagai codec, tetapi masih mungkin layak untuk melihat pengaturan apa yang Anda inginkan.
stib

1
Saya pikir metadata hanya memiliki bidang DAR. Jadi menggunakan setsarhanya pengaturan DAR secara tidak langsung?
jiggunjer

Saya harus menggunakan "-c copy", tetapi di sisi lain saya ingin mengubah ukuran layar. Bagaimana saya bisa mencapai ini?
Dr.jacky

1
@ Mr.Hyde Anda harus menanyakan ini sebagai pertanyaan baru alih-alih bertanya dalam komentar
stib
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.