내 질문의 첫 번째 부분:
나는 읽었다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_index
25, 100 end_index
, increment
5.
먼저 시퀀스 이름을 바꾸지 않고도 위와 같은 이미지 시퀀스를 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
이 문자열을 파일 이름의 특수 패턴으로 인식하지 않습니다.