누가 이 일을 하고 있나요? ffmpeg인가요, 아니면 쉘인가요?

누가 이 일을 하고 있나요? ffmpeg인가요, 아니면 쉘인가요?

내 질문의 첫 번째 부분:

나는 읽었다ffmpeg 문서( section 3.2 How do I encode single pictures into movies?) 다음과 같은:

단일 이미지를 동영상으로 인코딩하려면 다음 명령을 실행하십시오.

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

"%d"는 이미지 번호로 대체됩니다. img%03d.jpg는 img001.jpg, img002.jpg 등의 시퀀스를 의미합니다.

img%03d.jpg내 질문은: 누가 와 사이의 번역을 하고 있습니까 img001.jpg, img002.jpg, etc? 쉘인가요 아니면 ffmpeg인가요?

두 번째 부분:

ffmpeg에 일련의 이미지를 비디오로 인코딩하도록 요청하고 싶습니다. 그러나 내 시퀀스는 일반적으로 1이 아닌 다른 인덱스에서 시작하여(예: 호출할 수 있음 start_index) 호출할 수 있는 인덱스에서 끝납니다 end_index. 또한 시퀀스는 value 의 증분을 사용합니다 increment. 예를 들면 다음과 같습니다.

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

그 중 start_index25, 100 end_index, increment5.

먼저 시퀀스 이름을 바꾸지 않고도 위와 같은 이미지 시퀀스를 ffmpeg에 공급하고 싶습니다. 문서에서는 심볼릭 링크를 사용하여 이 작업을 수행하는 방법을 설명하지만 zsh에서 고급 와일드카드를 사용하여 심볼릭 링크를 완전히 피할 수 있는 방법이 있는지 궁금합니다.

답변1

1 부: %특수 문자가 아니므로 인수는 img%d.jpg그대로 ffmpeg"get-job" 자체에 전달됩니다.

2 부:문서를 보면 ffmpeg입력 파일을 제공하는 다른 방법이 없다고 생각하므로 심볼릭 링크를 사용하거나 "수정"을 기다려야 할 수도 있습니다.

패턴에 "%d" 또는 "%0Nd"가 포함된 경우 패턴에서 지정한 파일 목록의 첫 번째 파일 이름은 0~4 사이의 숫자를 포함해야 하며 이후의 모든 숫자는 연속되어야 합니다. 이 제한사항은 해결될 것으로 예상됩니다.

답변2

즉, 파이프만 사용하여 수행할 수 있습니다. 이름을 바꿀 필요도 없고 심볼릭 링크도 필요하지 않습니다.

여기에 제가 정리한 대본, 해설, 모든 것이 있습니다.
초당 1프레임으로 재생되도록 설정했습니다.
이미지 처리 사용 패키지netpbm

예를 들어: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
}

답변3

첫 번째 부분에서는 ffmpeg가 작업을 수행합니다. 쉘은 %d이 문자열을 파일 이름의 특수 패턴으로 인식하지 않습니다.

관련 정보