Siapa yang melakukan pekerjaan: ffmpeg atau shell?


8

Bagian pertama dari pertanyaan saya:

Saya membaca dokumentasi ffmpeg ( section 3.2 How do I encode single pictures into movies?) berikut ini:

Untuk menyandikan gambar tunggal ke dalam film, jalankan perintah:

  ffmpeg -f image2 -i img%d.jpg movie.mpg    

Perhatikan bahwa `% d 'diganti dengan nomor gambar: img% 03d.jpg berarti urutan img001.jpg, img002.jpg, dll ...

Pertanyaan saya adalah: Siapa yang melakukan terjemahan antara img%03d.jpgdan img001.jpg, img002.jpg, etc? Apakah itu shell atau ffmpeg?

Bagian kedua:

Saya ingin meminta ffmpeg untuk menyandikan urutan gambar ke dalam video. Namun, urutan saya sering dimulai dengan indeks yang berbeda dari 1, (misalnya kita dapat menyebutnya start_index) dan berakhir pada indeks yang dapat kita panggil end_index. Selain itu, urutan menggunakan peningkatan nilai increment, misalnya:

img_0025.png, img_0030.png, img_0035.png, ... img_0100.png

Dimana start_index25, end_index100, dan increment5.

Saya ingin memberi makan urutan gambar seperti di atas ke ffmpeg tanpa harus mengubah nama urutan terlebih dahulu. Dokumentasi menjelaskan bagaimana melakukan ini dengan tautan simbolik, tapi saya bertanya-tanya apakah ada cara untuk menghindarinya sama sekali, mungkin menggunakan globbing lanjutan di zsh.

Jawaban:


8

Bagian 1: % bukan karakter khusus, jadi img%d.jpgargumennya disampaikan seperti ffmpeg“melakukan pekerjaan” itu sendiri.

Bagian 2: Melihat ffmpegdokumentasi, saya tidak berpikir ada cara lain untuk memberikan file input, jadi Anda mungkin harus menggunakan symlink atau menunggu "perbaikan":

Jika polanya berisi "% d" atau "% 0Nd", nama file pertama dari daftar file yang ditentukan oleh pola harus berisi angka yang secara inklusif berisi antara 0 dan 4, semua angka berikut harus berurutan. Keterbatasan ini semoga dapat diperbaiki.


5

Ini dapat dilakukan dengan menggunakan pipa saja, yaitu. tanpa mengganti nama dan tanpa symlink.

Berikut adalah skrip yang saya kumpulkan, komentar dan semuanya.
Saya sudah mengaturnya untuk bermain pada 1 frame per detik.
Pemrosesan gambar menggunakan paketnetpbm

misalnya: images-to-vid '$HOME/images" '\./img_[0-9]{4}[^/0-9]*' 1024 768

# Make a video from images whose sizes and aspect-ratios may vary.
# 
# Each image is resized to fit maximized within the video frame.  
# The images are positioned centrally and padded (when required) 
#     
# Images are sourced using 'find'.  
# They are selected according to a regular expression.   
# Symbolic links are ignored.  
#
# Output from 'find' is sorted by path, ie. not by name alone,
#  but with a -maxlevel 1, this is typically the same...
#  You will need to customize the sort if this is not suitable.       
#
# Note about 'find':  
#    This script uses 'find -regex' instead of 'find -name'. 
#    The pattern must match the whole returned path, 
#       from ^ to $ inclusive  
#    The -regextype option is: posix-extended 
#
srceD="${1}"        # Source Directory
srceR="${2}"        # Source imaage extended Regex pattern
targW="${3:-800}"   # Target pixel Width
targH="${4:-600}"   # Target pixel Height
targB="${5:-black}" # Target Background colour (X11 colours)
targM="${6:-4}"     # Target screen geometry Modulo (as required by Target codec)
TARGw=$((targW-(targW%targM))); ((TARGw==targW)) || { echo "Target Width  must be divisible by $targM. Rounding down to $TARGw" 1>&2 ; targW=$TARGw; }
TARGh=$((targH-(targH%targM))); ((TARGh==targH)) || { echo "Target Height must be divisible by $targM. Rounding down to $TARGh" 1>&2 ; targH=$TARGh; }
# TODO: test for W/H == 0

cd "$srceD" || exit 2
find . -maxdepth 1 \
    \( -type f \) -and -not \
    \( -type l \) \
       -regextype posix-extended \
       -regex "$srceR" \
       -print0 | 
  sort -z | 
{ 
  while IFS= read -d $'\0' -r file ;do
      # make Composite image on coloured Background
      pnmcomp -align=center -valign=middle \
              <(anytopnm "$file" 2>/dev/null |
                pnmscale -xysize $targW $targH) \
              <(ppmmake "$targB" $targW $targH) 
  done |
  ffmpeg -r 1 \
         -f image2pipe \
         -vcodec ppm \
         -i - \
         -y -s ${targW}x${targH} \
         -vcodec mjpeg \
          images.avi
}

Terima kasih @fered, ini sangat membantu. Script Anda bahkan melebihi apa yang saya inginkan, yang hebat Sekarang saya mencoba menyesuaikan naskah dengan kebutuhan saya. Jika saya mengganti loop sementara dengan loop sederhana, itu tidak menentukan atau menambahkan warna latar:, while IFS= read -d $'\0' -r file ;do pnmcomp -align=center -valign=middle <(anytopnm "$file" 2>/devnull) doneskrip berhenti bekerja (yaitu saya dapatkan pipe: could not find codec parameters). Apa kamu tahu kenapa? Apakah saya perlu pnmscaleatau ppmmakememberi makan ffmpegdengan pnmgambar?
Amelio Vazquez-Reina

1
@ intrpc. Membingkai foto dengan ukuran berbeda hanya masalah pribadi saya. Saya sudah ingin melakukan itu sejak saya kehilangan kemampuan untuk menggunakan avisynth(lingkungan skrip video yang kuat - avisynth hanya untuk Windows :( Alasan utama saya menggunakan netpbmformat adalah karena saya terus melihat posting tentang masalah memasukkan jpeg ke pipa, jadi saya hanya memilih jalur yang paling tidak resistansi. Pengkodean video akan menjadi langkah yang menyebabkan hilangnya kualitas, tetapi meningkatkan ukuran bingkai membantu ... Saya kira Anda memiliki alasan spesifik untuk menggunakan video, tetapi peragaan slide sederhana dapat bekerja untuk Anda
Peter.O

3

Untuk bagian pertama saja: Ini ffmpeg melakukan pekerjaan. Shell tidak memahami %dstring sebagai pola khusus dalam nama file.

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.