image + audio = mp4: bagaimana cara membuat video lebih kecil?

12

Saya menggunakan ffmpeg untuk menambahkan JPG ke MP4 untuk membuat MP4.

Karena hanya ada satu gambar untuk membuat video saya bertanya-tanya apakah ada cara untuk mengurangi ukuran video?

Perintah:

$ ffmpeg -loop 1 -i image.jpg -i audio.mp3 -shortest -c:a copy output.mp4

Hasil:

  • image.jpg = 26.7K (gambar tidak begitu jelas)
  • audio.mp3 = 64.6M (54 menit)
  • output.mp4 = 80.6M (hasil video tidak begitu jelas, musik masih bagus)

Apakah ini ukuran yang wajar untuk MP4?

SIDU
sumber
Bisakah Anda memposting perintah ffmpeg yang Anda gunakan?
ridgy
Tolong jangan membuat gambar dari (sebagian dari) teks, tetapi salin dan tempel saja. Gambar berukuran besar, tidak dapat dicari, dan tidak dapat disalin.
Logan
oops ya pak. saya telah menutup jendela cmd, jadi saya tidak bisa menempelkan teksnya sekarang: |
SIDU
Saya ingin tahu apakah mungkin untuk meta mp4 sehingga hanya memutar mp3 dan menjaga layar tetap pada satu jpg untuk menghemat ukuran :)
SIDU
Apa target pemain, perangkat, atau situs untuk output?
Logan

Jawaban:

18

Untuk mengunggah ke YouTube

H.264: file terkecil

Metode ini menggunakan libx264 untuk menyandikan video H.264. Ini lebih lambat daripada metode salin aliran di bawah ini, tetapi berpotensi menghasilkan ukuran file yang lebih kecil.

ffmpeg -loop 1 -framerate 1 -i image.jpg -i music.mp3 \
-c:v libx264 -preset veryslow -crf 0 -c:a copy -shortest output.mkv

Stream copy: proses tercepat

Metode ini hanya mengalirkan salinan (tanpa enkode) gambar ke wadah MKV. Ini super cepat, tetapi jika ukuran lebih penting daripada metode di atas dapat menghasilkan file yang lebih kecil.

ffmpeg -loop 1 -framerate 1 -i image.jpg -i music.mp3 -c copy -shortest output.mkv
  • YouTube menerima apa saja sehingga perintah ini menggunakan beberapa trik untuk membuat penyandian lebih cepat, atau membuat ukuran file kecil, dan menjaga kualitas tinggi karena YouTube akan menyandikan ulang apa pun yang Anda berikan. Pemain Anda mungkin tidak akan menyukainya tetapi YouTube akan melakukannya.

  • Dalam contoh-contoh ini frame rate yang sangat rendah digunakan yang seharusnya memproses lebih cepat dari standar 25 fps.


Kompatibilitas terluas untuk semua pemain

ffmpeg -loop 1 -i image.png -i music.mp3 -vf "scale='min(1280,iw)':-2,format=yuv420p" \
-c:v libx264 -preset medium -profile:v main -c:a aac -shortest -movflags +faststart output.mp4
  • Ini harus dimainkan pada apa saja kecuali perangkat yang sangat kuno (ubah -profile:v mainke -profile:v baselinejika itu masalahnya).

  • Jika input audio Anda sudah AAC maka ubah -c:a aacke -c:a copyuntuk menghindari pengkodean ulang yang tidak perlu.

  • Waktu penyandian akan lebih lama dan ukuran file akan lebih besar dari perintah YouTube di atas.

  • Lihat FFmpeg Wiki: H.264 untuk info lebih lanjut.

llogan
sumber
Bisakah Anda memberikan sederet kode untuk membuat a.jpg + a.mp3 = a.mp4 di 1280 * 720 dengan bingkai / detik terendah yang diizinkan oleh youtube? Juga karena hanya ada satu pekerjaan, apakah saya harus menghapus "-loop 1"? Terima kasih sebelumnya.
SIDU
@ SIDU Perintah yang ada melakukan apa yang Anda minta (selain menghasilkan MKV bukan MP4), tapi saya tidak tahu frame rate terendah yang didukung oleh YouTube. Anda hanya perlu bereksperimen. Mengapa Anda memerlukan MP4 saat Anda baru saja mengunggah ke YouTube?
Logan
Saya mencobanya tetapi dikatakan:Unrecognized option 'preset'. Error splitting the argument list: Option not found
NineCattoRules
@NineCattoRules Sulit dikatakan tanpa info lebih lanjut. Gunakan situs pastebin untuk menampilkan ffmpegperintah lengkap dan output konsol lengkap dari perintah, lalu berikan tautan dalam komentar.
llogan
Terima kasih, saya menginstal ulang FFMPEG menggunakan repositori mc3man dan sekarang berfungsi dengan baik!
NineCattoRules
3

Dengan hanya informasi yang Anda berikan ini, apa yang dapat saya pikirkan.

Mari kita berkeping-keping:

Karena hanya ada satu gambar yang ditambahkan ke video. Saya bertanya-tanya apakah ada cara untuk mengurangi ukuran video misalnya, memaksa bit rate / detik = 1 bukannya 28?

Karena ini adalah gambar diam, tidak perlu diubah. diam saja.

Apa yang Anda bicarakan di sana itu frame per detik (fps) tidak bitrate. Dan Anda benar dalam konsep itu. Beign hanya satu gambar diam 1 fps tidak akan menjadi masalah.

Apakah ini ukuran yang wajar untuk mp4? Apakah ukuran gambar sangat penting?

Dalam hal ini ukuran gambar tidak akan memiliki bobot yang signifikan karena kita hanya berurusan dengan satu gambar diam. Jika itu adalah video berkualitas tinggi maka itu masalah yang berbeda.

Haruskah saya mengubah ukuran jpg ke 1080 * 720, dan membuat pengaturan tambahan di ffmpeg menjadi output sebagai 720p (apa pengaturan ffmpeg kalau begitu :)?

Resolusi yang Anda katakan adalah 1280x720.

Saya tidak melihat titik pada -loop 1opsi di sini, itu hanya akan memperlambat proses. Apakah Anda menggunakan -shortestkarena file memiliki lebih dari 1 aliran input? Jika tidak maka tidak ada alasan untuk menggunakannya. Karena Anda menggunakan -acodec copysaya harus berasumsi bahwa Anda tidak ingin menyandikan ulang.

Untuk output 720p 1fps tanpa pengkodean ulang dan tidak menyentuh bitrate:

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -s 1280x720 output.mp4

Beign case yang memiliki lebih dari satu input stream dan Anda ingin ffmpeg menyelesaikan pengkodean pada stream terpendek kemudian:

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -s 1280x720 -shortest output.mp4

Sekarang jika Anda harus mengubah bitrate (misalkan 1024k sebagai contoh);

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -b:v 1024k -bufsize 1024k -s 1280x720 output.mp4

Lihat: Batasi bitrate output

-c: a copy = Salin aliran audio input sehingga kami tidak menyandikan ulang.

-b: v = Bitrate yang ditentukan sebagai konstan (tidak tepat).

-bufsize = Ini interval di mana menghitung bitrate rata-rata. Berarti lebih rendah kualitas gambar kerugian tetapi bitrate lebih akurat sesuai dengan yang ditentukan dalam -b: v .

-s = Ukuran aktual dari output video.

-framerate = Frame rate input yang kita inginkan agar output akan digunakan.

Perhatikan bahwa jika Anda masih menginginkan video ukuran lebih kecil pada satu titik Anda harus mengorbankan kualitas untuk mencapai itu. Dan cara lain untuk melakukannya melibatkan pengodean ulang dengan kompresi lossy.

Dari apa yang Anda katakan, informasi yang Anda berikan dan apa yang Anda coba lakukan, saya pikir tampaknya target Anda adalah menanamkan album-art ke mp3. Jika itu tujuan Anda, ini akan lebih sesuai dengan kebutuhan Anda:

ffmpeg -i input.mp3 -i cover.jpg -map_metadata 0 -map 0 -map 1 output.mp3

-map_metadata = Penentu metadata ffmpeg untuk menghasilkan file dari infile. Dalam hal ini ( nol ) metadata global.

-map 0 = Input stream 1 (audio).

-map 1 = Input stream 2 (gambar).

Jika tidak ada yang sesuai dengan permintaan Anda, beri informasi lebih lanjut.

Fenrir
sumber
Pertimbangkan untuk menggunakan -frameratesebagai opsi input dan menghapus output -r: jika tidak, framerate input default 25 akan digunakan dan kemudian ffmpegakan menjatuhkan frame untuk mencapai -r 1. Jika Anda hanya mendeklarasikan frame rate input maka output akan menggunakan frame rate yang sama.
Logan
Terima kasih. Tidak tahu itu. Diedit untuk mencerminkan perubahan yang disarankan.
Fenrir
Terima kasih untuk tutorialnya. Baris kode ffmpeg origianl saya adalah copy-paste dari pencarian google, yang saya tidak tahu apa itu apa.
SIDU