Ai đang làm công việc: ffmpeg hoặc shell?


8

Phần đầu tiên của câu hỏi của tôi:

Tôi đọc tài liệu ffmpeg ( section 3.2 How do I encode single pictures into movies?) như sau:

Để mã hóa các ảnh đơn thành phim, hãy chạy lệnh:

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

Lưu ý rằng `% d 'được thay thế bằng số hình ảnh: img% 03d.jpg có nghĩa là chuỗi img001.jpg, img002.jpg, v.v ...

Câu hỏi của tôi là: Ai đang thực hiện việc dịch giữa img%03d.jpgimg001.jpg, img002.jpg, etc? Nó là vỏ hay ffmpeg?

Phần thứ hai:

Tôi muốn yêu cầu ffmpeg mã hóa một chuỗi hình ảnh thành video. Tuy nhiên, các chuỗi của tôi thường bắt đầu bằng một chỉ mục khác với 1, (ví dụ: chúng ta có thể gọi nó start_index) và kết thúc trên một chỉ mục mà chúng ta có thể gọi end_index. Hơn nữa, chuỗi sử dụng gia số của giá trị increment, ví dụ:

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

nơi start_indexlà 25, end_indexlà 100, và incrementlà 5.

Tôi muốn cung cấp một chuỗi hình ảnh như trên để ffmpeg mà không phải đổi tên chuỗi đầu tiên. Tài liệu giải thích cách thực hiện điều này với các liên kết tượng trưng, ​​nhưng tôi đã tự hỏi liệu có cách nào để tránh chúng hoàn toàn không, có thể sử dụng tính năng tạo hình nâng cao trên zsh.

Câu trả lời:


8

Phần 1: % không phải là một nhân vật đặc biệt, do đó, cuộc img%d.jpgtranh luận được thông qua như là cách ffmpegmà thực hiện công việc của chính mình.

Phần 2: Nhìn vào ffmpegtài liệu, tôi không nghĩ có một cách khác để cung cấp các tệp đầu vào, vì vậy bạn có thể phải sử dụng các liên kết tượng trưng hoặc chờ đợi bản sửa lỗi của Wap:

Nếu mẫu chứa "% d" hoặc "% 0Nd", tên tệp đầu tiên của danh sách tệp được chỉ định bởi mẫu phải chứa một số bao gồm từ 0 đến 4, tất cả các số sau phải là tuần tự. Hạn chế này có thể được hy vọng sửa chữa.


5

Nó có thể được thực hiện bằng cách sử dụng ống chỉ, tức là. không đổi tên và không có liên kết tượng trưng.

Đây là một kịch bản tôi đặt lại với nhau, ý kiến ​​và tất cả.
Tôi đã thiết lập nó để chơi ở tốc độ 1 khung hình mỗi giây.
Việc xử lý ảnh sử dụng góinetpbm

ví dụ: 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
}

Cảm ơn @fered, điều này rất hữu ích. Kịch bản của bạn thậm chí còn nhiều hơn những gì tôi muốn, điều đó thật tuyệt. Bây giờ tôi đang cố gắng điều chỉnh kịch bản theo nhu cầu của mình. Nếu tôi thay thế vòng lặp while bằng một vòng lặp đơn giản, điều đó không đặt trước cũng như không thêm màu nền: while IFS= read -d $'\0' -r file ;do pnmcomp -align=center -valign=middle <(anytopnm "$file" 2>/devnull) donetập lệnh sẽ ngừng hoạt động (tức là tôi nhận được pipe: could not find codec parameters). Bạn có biết tại sao? Tôi có nhất thiết phải pnmscalehoặc ppmmakeđể nuôi ffmpegbằng pnmhình ảnh?
Amelio Vazquez-Reina

1
@intrpc. Việc đóng khung các bức ảnh kích thước khác nhau chỉ là vấn đề cá nhân của tôi. Tôi đã muốn làm điều đó kể từ khi tôi mất khả năng sử dụng avisynth(một môi trường kịch bản video mạnh mẽ - avisynth chỉ là Windows :( Lý do chính tôi sử dụng một netpbmđịnh dạng là tôi liên tục thấy các bài đăng về vấn đề đưa jpeg vào đường ống, Vì vậy, tôi chỉ chọn con đường ít kháng cự nhất. Mã hóa video sẽ là bước gây giảm chất lượng, nhưng tăng kích thước khung hình giúp ... Tôi cho rằng bạn có lý do cụ thể của mình khi sử dụng video, nhưng trình chiếu đơn giản có thể làm việc cho bạn.
Peter.O

3

Chỉ dành cho phần đầu tiên: Đó là ffmpeg đang thực hiện công việc. Shell không hiểu %dchuỗi là một mẫu đặc biệt trong tên tệp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.