Saya sudah mencoba mencari tahu sendiri, tetapi banyak sekali pilihan yang membuat saya bingung.
Saya ingin menggunakan idealnya ffmpeg
atau mencoder
(atau sesuatu yang lain, tetapi dua yang saya tahu telah saya kerjakan) untuk mengonversi video yang masuk ke ukuran layar tetap.
Jika video lebih lebar atau terlalu pendek, potong bagian tengah video. Jika itu bukan ukuran yang tepat, ubah ukurannya ke atas atau ke bawah untuk menjadikannya ukuran layar yang tepat.
Hal terakhir yang saya butuhkan adalah 720x480 dalam XVid AVI dengan trek audio MP3.
Saya telah menemukan banyak halaman yang menunjukkan cara mengubah ukuran ke resolusi maksimum, tetapi saya membutuhkan video dengan resolusi yang sama (dengan bagian tambahan terpotong, tanpa bilah hitam).
Adakah yang bisa memberi tahu saya baris perintah untuk dijalankan - atau setidaknya berikan saya sebagian/sebagian besar perjalanan ke sana? Jika perlu beberapa baris perintah (jalankan X untuk mendapatkan resolusi, lakukan perhitungan ini dan kemudian jalankan Y dengan output dari perhitungan itu) saya dapat membuat skrip itu.
Jawaban yang Diterima:
Saya bukan guru ffmpeg, tetapi ini akan berhasil.
Pertama-tama, Anda bisa mendapatkan ukuran video input seperti ini:
ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width in.mp4
Dengan ffmpeg yang cukup baru, Anda dapat mengubah ukuran video dengan opsi berikut:
ffmpeg -i in.mp4 -vf scale=720:480 out.mp4
Anda dapat mengatur lebar atau tinggi ke -1
untuk membiarkan ffmpeg
mengubah ukuran video menjaga rasio aspek. Sebenarnya, -2
adalah pilihan yang lebih baik karena nilai yang dihitung harus genap. Jadi Anda bisa mengetik:
ffmpeg -i in.mp4 -vf scale=720:-2 out.mp4
Setelah Anda mendapatkan videonya, mungkin lebih besar dari yang diharapkan 720x480
karena Anda membiarkan ffmpeg
hitung tingginya, jadi Anda harus memotongnya. Ini dapat dilakukan seperti ini:
ffmpeg -i in.mp4 -filter:v "crop=in_w:480" out.mp4
Terakhir, Anda dapat menulis skrip seperti ini (dapat dengan mudah dioptimalkan, tetapi saya membuatnya sederhana agar mudah dibaca):
#!/bin/bash
FILE="//eadn-wc01-5196795.nxedge.io/tmp/test.mp4"
TMP="//eadn-wc01-5196795.nxedge.io/tmp/tmp.mp4"
OUT="//eadn-wc01-5196795.nxedge.io/tmp/out.mp4"
OUT_WIDTH=720
OUT_HEIGHT=480
# Get the size of input video:
eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width ${FILE})
IN_WIDTH=${streams_stream_0_width}
IN_HEIGHT=${streams_stream_0_height}
# Get the difference between actual and desired size
W_DIFF=$[ ${OUT_WIDTH} - ${IN_WIDTH} ]
H_DIFF=$[ ${OUT_HEIGHT} - ${IN_HEIGHT} ]
# Let's take the shorter side, so the video will be at least as big
# as the desired size:
CROP_SIDE="n"
if [ ${W_DIFF} -lt ${H_DIFF} ] ; then
SCALE="-2:${OUT_HEIGHT}"
CROP_SIDE="w"
else
SCALE="${OUT_WIDTH}:-2"
CROP_SIDE="h"
fi
# Then perform a first resizing
ffmpeg -i ${FILE} -vf scale=${SCALE} ${TMP}
# Now get the temporary video size
eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width ${TMP})
IN_WIDTH=${streams_stream_0_width}
IN_HEIGHT=${streams_stream_0_height}
# Calculate how much we should crop
if [ "z${CROP_SIDE}" = "zh" ] ; then
DIFF=$[ ${IN_HEIGHT} - ${OUT_HEIGHT} ]
CROP="in_w:in_h-${DIFF}"
elif [ "z${CROP_SIDE}" = "zw" ] ; then
DIFF=$[ ${IN_WIDTH} - ${OUT_WIDTH} ]
CROP="in_w-${DIFF}:in_h"
fi
# Then crop...
ffmpeg -i ${TMP} -filter:v "crop=${CROP}" ${OUT}