Ini seharusnya cukup sepele, tetapi saya tidak dapat menemukan cara untuk membuatnya bekerja.
Saya ingin FFmpeg mengambil satu gambar JPEG dan file audio sebagai input dan menghasilkan file video dengan durasi yang sama dengan file audio (dengan merentangkan gambar diam untuk seluruh durasi).
Saya tidak terlalu peduli tentang apa codec video yang digunakan untuk output, tetapi sangat penting bahwa saya dapat menggunakan "copy" sebagai codec audio (yaitu menyalin aliran audio tanpa transcoding itu).
Apa baris perintah yang tepat yang akan melakukan itu?
Saya mencoba:
ffmpeg -i image8.jpg -i sound11.amr -acodec copy test.avi
dan mencoba banyak kombinasi dengan dan tanpa -s 640x360
, -loop_input
, -shortest
, -t xxx
, -r 0.1
(frame rate artifisial rendah dengan harapan bahwa video akan lebih lama) dan-f image2
Entah saya mendapatkan kesalahan atau saya mendapatkan file video dengan durasi satu frame.
Saya telah mencari-cari di sekitar dan menemukan selusin solusi yang diusulkan (seharusnya untuk pertanyaan yang sama) tidak ada yang berhasil.
Adakah yang bisa menyarankan perintah yang berfungsi dan menjelaskan alasan di baliknya?
ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi
Jawaban:
Urutan opsi dalam baris perintah penting. Berikut ini berfungsi untuk kasus saya:
Dalam kasus yang lebih umum, di mana
image.jpg
danaudio.wav
input Anda, Anda dapat menggunakan perintah berikut, diadaptasi dari wiki FFmpeg :Ini akan menggunakan
libx264
encoder dan memberi Anda kompresi yang lebih baik daripada codec MJPEG yang digunakan di atas. Audio adalah AAC, denganffmpeg
encoder AAC bawaan.sumber
Option shortest (finish encoding within shortest input) cannot be applied to input file image.jpg -- you are trying to apply an input option to an output file or vice versa. Move this option before the file it belongs to.
ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi
ini bekerja lebih baik !!!?! ??!?!Kau membuatnya cara lebih sulit daripada itu harus. FFmpeg jauh lebih pintar daripada Anda memberikannya - ia tahu Anda ingin video memiliki panjang yang sama dengan trek audio Anda.
Satu-satunya atribut Anda harus menentukan adalah
input filenames
, yangoutput codecs
, danoutput filename
(yang eo ipso meliputioutput container
,).Tentu saja, masuk akal untuk memulai dengan gambar diam yang berbagi dimensi yang sama dengan video akhirnya Anda; jika Anda menggunakan editor gambar khusus alih-alih menentukan dimensi output untuk FFmpeg untuk dipenuhi, Anda perlu memastikan dimensi input Anda adalah angka genap .
Ukuran output adalah salah satu hang-up FFmpeg yang paling umum; beberapa codec lebih terbatas dalam dimensi output daripada yang lain, tetapi tidak ada output yang dapat memiliki atribut ganjil-tinggi atau lebar.
The
pause
perintah pada akhir file batch terus terbuka CLI - yang cara terbaik untuk debug baris perintah Anda adalah dengan membaca pesan kesalahan yang dihasilkannya. Mereka sangat spesifik - dan dokumentasi terbaik yang dimiliki FFmpeg - tetapi kerja keras pengembang terbuang sia-sia jika Anda membiarkan jendela ditutup sebelum Anda dapat membacanya.Shell perintah memiliki saklar
cmd /k
yang mempertahankan jendela terbuka di mana Anda dapat menjalankan instruksi yang sama dari skrip batch Anda pada prompt perintah.FFmpeg dan avconv akan membuat Anda menggunakan
-c:a
untuk-acodec
dan-c:v
untuk-vcodec
akhirnya, tetapi instruksi lama berfungsi dengan baik di build yang saya gunakan.Nota Bene: Setiap komit memiliki kekhasan. Jika baris perintah Anda gagal tanpa alasan yang jelas, sering kali membantu untuk mencoba build lain - atau ikuti fork ke libav , tempat pengembang paling aktif FFmpeg selama beberapa tahun terakhir. Alat transcoding mereka telah diganti nama avconv tetapi file batch Anda harus bekerja dengan salah satunya.
sumber
Mine is a win-64 ffmpeg build compiled on: Jan 6 2013, at: 16:16:53
Baik solusi Anda maupun solusi @matteo bekerja untuk saya. Juga, saya mengunduh file Anda dari Google Drive, tetapi tidak memberikan output yang diharapkan (file output hitam hanya berisi audio). Tolong bantu saya dalam mencari tahu perintah yang tepat untuk digunakan.Lebih mudah lagi:
ffmpeg -i ep1.png -i ep1.wav ep1.flv
FFmpeg akan mencoba untuk mengambil codec terbaik secara otomatis, tergantung pada ekstensi file output Anda.
Pembaruan: Saya perhatikan YouTube mengalami kesulitan memproses video (macet pada 95%) Saya pikir karena hanya ada satu bingkai. Solusi yang saya temukan untuk membuat YouTube bahagia: tambahkan lebih banyak bingkai. Saya juga menambahkan
-acodec copy
untuk menjaga kualitas audio. Anda perlu-shortest
atau itu loop selamanya. (Ini berhenti di ujung aliran terpendek, yaitu audio, karena loop gambar tidak terbatas.) Urutan opsi Anda sangat penting untuk kecepatan, karena filter (dan semacamnya) diproses dalam urutan yang Anda tentukan. Jika Anda mengubah urutan parameter ini, hasilnya sangat berbeda.ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:720 ep1.flv
Perhatikan juga bahwa saya mengatur frame rate dua kali, itu bukan kecelakaan - frame rate pertama adalah untuk input, kedua untuk output. Jika Anda melakukan ini dengan benar, seharusnya hanya ada satu frame per detik dari video, yang berarti itu mengkodekan relatif cepat. Saya juga mengatur resolusi ke 720p di sini, yang berarti Anda harus mendapatkan audio HD di YouTube :-)
sumber
No pixel format specified, yuvj420p for H.264 encoding chosen. Use -pix_fmt yuv420p for compatibility with outdated media players. [libx264 @ 0x2b5c940] height not divisible by 2 (700x457)
... ini berfungsi:ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:-2 video.mp4
Versi yang berfungsi untuk saya:
Checkout opsi
-shortest
harus di depan file output jika saya tidak mendapatkan kesalahan di bawah ini:Opsi terpendek (menyelesaikan pengkodean dalam input terpendek) tidak dapat diterapkan ke file input pic.jpg - Anda mencoba menerapkan opsi input ke file output atau sebaliknya. Pindahkan opsi ini sebelum file miliknya. Galat opsi penguraian untuk file input pic.jpg.
sumber
Dari halaman ffmpeg:
Ketika Anda menemukan, opsi infile harus datang sebelum infile yang mereka terapkan.
Namun, ini bukan bug, hanya sebuah mekanisme yang dengannya Anda dapat menentukan argumen infile mana yang berlaku.
sumber
Ini berhasil untuk saya
Saya menemukan vcodec
libx264
menciptakan file yang jauh lebih kecil daripadampjeg
(10 MB daripada 100 MB).sumber
-shortest
adalah opsi keluaran dan dapat diabaikan sebagai opsi input saat Anda menggunakannya.Saya mencoba melakukan sebagai @matteo , tetapi tanpa audio, dan solusi @Colonel Panic bekerja paling baik:
Saya hanya perlu menambahkan argumen durasi dalam detik (
-t 10
).sumber
-shortest
adalah opsi keluaran, tetapi Anda menggunakannya sebagai opsi input. Pindahkan sebelum file output dan Anda dapat menghilangkannya-t 10
, tetapi kemudian jawaban Anda akan hampir sama dengan yang lain.ffmpeg -loop 1 -i img.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest out.mp4
sumber
Jika seseorang ingin mengonversi secara berkelompok, coba ini.
Anda dapat mengatur folder input dan output, dan juga format di mana Anda ingin video berada. Dalam hal ini saya mengaturnya ke AVI.
Jawaban ini Gabungkan satu gambar + satu file audio untuk membuat satu video menggunakan FFmpeg sangat membantu saya.
sumber
Coba perintah ini. Ini bekerja untuk saya.
sumber