Klarifikasi untuk opsi input ffmpeg dengan file gambar sebagai input

34

Saya punya beberapa gambar dan saya ingin membuat animasi gif dengan ffmpeg. Gambar memiliki nama sebagai:

837_1.png
838_1.png
...

Saya mencoba untuk memahami opsi baris perintah -i dari ffmpeg tapi saya mengalami beberapa masalah.

Jika saya tidak menentukan apa-apa itu meminta saya untuk mengganti file:

ffmpeg -i * -vcodec libx264 out.mp4

ffmpeg version 1.2.1 Copyright (c) 2000-2013 the FFmpeg developers
  built on Jul 26 2013 20:18:03 with Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/1.2.1 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=cc --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid
  libavutil      52. 18.100 / 52. 18.100
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.104 / 54. 63.104
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 42.103 /  3. 42.103
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
Input #0, image2, from '358_1.png':
  Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: png, rgb24, 550x550, 25 tbr, 25 tbn, 25 tbc
File '359_1.png' already exists. Overwrite ? [y/N]

Dan jika saya mencoba menggunakan salah satu format yang paling sering digunakan (% d) di internet .. ffmpeg tidak menemukan file:

fmpeg -i '%3d_1.png' -vcodec libx264 out.mp4

ffmpeg version 1.2.1 Copyright (c) 2000-2013 the FFmpeg developers
  built on Jul 26 2013 20:18:03 with Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/1.2.1 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=cc --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid
  libavutil      52. 18.100 / 52. 18.100
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.104 / 54. 63.104
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 42.103 /  3. 42.103
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
[image2 @ 0x7f963a006600] Could find no file with with path '%3d_1.png' and index in the range 0-4
%3d_1.png: No such file or directory

Jadi .. ini pertanyaannya, bagaimana cara menggunakan opsi baris perintah -i dengan ffmpg?

Demi kejelasan, saya menggunakan Mac OSX 10.8, ffmpeg versi 1.2.1, zsh 4.3.11

nkint
sumber

Jawaban:

47

Tanpa opsi lebih lanjut, image2demuxer ffmpeg akan mencari urutan yang dimulai dengan 0. Ia juga akan memeriksa sekitar indeks ini, dengan kisaran default 5 (itu sebabnya ia akan mengeluh tentang tidak ada indeks dalam kisaran 0-4). Per dokumentasi , Anda harus mengatur nomor mulai jika Anda ingin memulai pada indeks arbitrer, seperti 837.

ffmpeg -start_number 837 -i '%3d_1.png' -c:v libx264 out.mp4

Ruang warna dalam konversi PNG ke H.264

Karena file PNG menggunakan ruang warna RGB untuk merepresentasikan piksel, konversi ke H.264 akan berakhir menjadi YUV 4: 4: 4 ( non-subsampled ). Video yang dihasilkan mungkin tidak dapat diputar di semua pemain, terutama yang berbasis non-FFmpeg. Pemain Anda hanya akan menampilkan bingkai hitam, atau mungkin macet. Untuk memperbaikinya, ubah format piksel ke YUV 4: 2: 0:

ffmpeg -start_number 837 -i '%3d_1.png' -c:v libx264 -pix_fmt yuv420p out.mp4

Untuk mengontrol kualitas, gunakan -crfopsi. Lihat panduan penyandian x264 untuk info lebih lanjut.

Mengapa *gumpal tidak bekerja

Jangan gunakan *opsi input. Shell akan memperluasnya ke semua file di direktori saat ini sebelum ffmpegmelihatnya, sehingga perintah akan diperluas ke ffmpeg -i file1 file2 … filen. Karena semua file input ffmpegmembutuhkan -iopsi, itu akan mengambil file2 … filenfile output sebagai gantinya dan menimpa mereka. Tidak baik.

slhck
sumber
jawaban yang sangat lengkap! dan apakah Anda juga punya saran tentang animasi gif?
nkint
Untuk GIF animasi, Anda ingin memperbarui ke ffmpeg versi 2.0 dan di atasnya, karena mereka sangat meningkatkan kualitas visual. The Download Halaman memiliki beberapa link untuk statis membangun untuk OS X. Untuk ffmpeg tua, lihat: mualaf ffmpeg flv video ke gif dengan kualitas mengerikan
slhck
Faktanya, ini tidak hanya memeriksa + 0..4 tetapi juga 8,16,32,64 dll. Ini terlihat ketika menggunakan url HTTP. Namun, image2gagal mengenali bahwa 200 OKitu setara dengan "file ditemukan" sehingga tidak berhenti mencari.
MSalters
1
Saya mendapatkan hal yang sama bahkan setelah mencoba menerapkan saran Anda. File saya yang bernama DSCxxxxx.jpgmana xxxxxadalah nomor 5-digit awal dengan nol (catatan saya tidak garis bawah). Namun, setelah menjalankan ffmpeg -r 30 -start_number 04606 -i DSC%d.jpg out.mp4saya mendapatkan kesalahan yang sama seperti pada posting asli di atas
Anonim
@jphollowed Apakah Anda memasukkan pola nama file ke dalam tanda kutip?
slhck
29

Globbing dapat diaktifkan dengan menentukan -pattern_type globopsi:

ffmpeg -pattern_type glob -i '*.png' -vcodec libx264 out.mp4
yohanson
sumber
2
Cara yang jauh lebih baik :)
Gustav
3
Hanya ini yang bekerja untuk saya. Tidak ada cara untuk mendapatkan ini xxx%d.png, xxx%3d.png, 'xxx%d.png'atau 'xxx%3d.png'hal kerja
yPhil
Saya mendapatkan kesalahan yang sama setelah mencoba ini:[image2 @ 0x2552560] Could find no file with path '*.jpg' and index in the range 0-4 *.jpg: No such file or directory
Anonim
Tipe pola 'glob' dipilih tetapi globbing tidak didukung oleh libavformat build ini [menggunakan Windows ffmpeg] [oof, seharusnya sudah menggulirkan ke bawah satu jawaban]
Katastic Voyage
7

Catatan: Pola globbing tidak berfungsi di Windows (dan mungkin tidak pernah karena kurangnya dukungan untuk globbing di libavfilter di Windows.) Jadi, jika Anda melakukan ini di Windows, Anda harus mengganti nama file sehingga diberi nomor urut sehingga berurutan dan tanpa celah.

Anda dapat mengubah nama mereka dengan baris perintah Powershell sederhana:

dir *.jpg | %{$x=0} {Rename-Item $_ -NewName “Base$x”; $x++ }
Bill Westrup
sumber
Ini akan mengembalikan file1.jpg file2.jpg... file10.jpgyang jika Anda mengurutkan secara abjad akan berakhir file1.jpg, file10.jpg...file2.jpg
stib
Bukankah itu seharusnya menjadi basis $ x.jpg? Seperti adanya, milik Anda mengubah nama semua milik saya dan mematikan ekstensi file.
Katastic Voyage
5

cara yang lebih baik untuk mengganti nama dengan PowerShell (simpan pesanan):

dir *.jpg | %{$x=0} {Rename-Item $_ -NewName "Base$($x.tostring('000000')).jpg"; $x++ }
pBac
sumber
Apakah dirselalu mengembalikan file yang diurutkan berdasarkan abjad? Apakah lebih aman untuk menambahkan sort-objectke dalam campuran?
stib