다양한 지속 시간을 가진 FFMPEG 이미지 시퀀스


16

1 분 길이의 mp3 파일이 있다고 가정 해 봅시다. 그리고 20 개의 PNG 이미지가 있습니다. 이 이미지와 오디오를 비디오 파일로 결합하고 싶지만 각 이미지가 화면에서 3 초간 지속되는 것을 원하지 않고 일부 이미지는 5 초간 지속되고 다른 이미지는 1 초간 지속됩니다.

내가 생각할 수있는 유일한 방법은 더 오래 지속되어야하는 이미지를 복사하는 것입니다. 예를 들어 image1, image2, image3을 정확히 동일하게 유지하면 비디오에서 3 배 더 많은 시간을 제공합니다.

그러나 이것은 시간과 공간이 많이 소모됩니다. ffmpeg에 스위치 / 매개 변수가 있습니까?


ffmpeg는 각 이미지를 동일한 길이로 표시해야한다는 것을 알았습니다. 길이를 변경하려면 미리 이미지를 복제하거나 원하는 기간마다 별도의 비디오를 만든 다음 연결해야합니다. 다른 사용자가 더 나은 아이디어를 가지고 있지만 Kdenlive와 같은 편집기를 사용하면 이러한 유형의 작업이 더 쉬울 수 있습니다.
llogan

PHP 스크립트에서하고 있으므로 편집기는 내가 찾고있는 것이 아닙니다.
Flot2011

답변:


21

ffmpeg 2.0을 사용하면 다음과 같은 몇 가지 방법이 있습니다.

  1. 한 가지 방법은 파일 수정 시간을 사용하는 것입니다. 먼저 이미지 파일 의 수정 시간설정하여 각 이미지 파일의 수정 시간이 이전의 수정 시간보다 큼; 시차는 이전 이미지의 지속 시간입니다 (1 초 해상도). 그런 다음 image2 디 먹서 옵션을 사용하십시오 -ts_from_file 1. 예를 들면 다음과 같습니다.

    touch -t 01010000.00 image01.png
    touch -t 01010000.03 image02.png
    touch -t 01010000.08 image03.png
    ...
    ffmpeg -ts_from_file 1 -i image%2d.png -i audio.mp3 -c:a copy -vf fps=25 out.avi
    
  2. 또 다른 방법은 concatdemuxer 를 사용하는 것입니다. demuxer 는 선택적인 기간으로 연결할 파일 목록을 가져옵니다. 먼저 다음과 같은 이미지 및 지속 시간을 나열하는 파일을 작성하십시오.

    ffconcat version 1.0
    file image01.png
    duration 3
    file image02.png
    duration 5
    file image03.png
    

    그런 다음이 파일을 ffmpeg에 대한 입력으로 제공하십시오. 예를 들면 다음과 같습니다.

    ffmpeg -i in.ffconcat -i audio.mp3 -c:a copy -vf fps=25 out.avi
    

최종 지속 시간이 지난 후 마지막 파일을 복제해야 할 수도 있습니다. -c:a copymp3 오디오를있는 그대로 복사합니다. 다른 오디오 코덱으로 변환하려면 대신을 지정할 수 있습니다 copy. 와 같은 다른 비디오 코덱을 지정 -c:v하거나와 -pix_fmt같은 다른 픽셀 형식 을 지정할 수도 있습니다 -c:v libx264 -pix_fmt yuv420p. -vf fps=25출력 프레임 속도를 25fps로 만듭니다. 오디오가 길고 이미지 후에 잘라내려면 -shortest옵션을 사용하십시오 .


왜 이것이 효과가없는 것 같은지 알 수 있습니다 (즉, 두 번째 (및 첫 번째 시도) 옵션을 따라 문자를 보냈지 만 이미지가없는 검은 색 비디오를 출력하거나 이미지가 여러 프레임이 아닌 한 프레임 동안 깜박입니다. ffconcat 파일에 지정된 초
sup

@ sup : 이것은 여전히 ​​나를 위해 작동합니다. 비디오가 검은 색이면 플레이어가 사용중인 비디오 형식을 지원하지 않을 수 있습니다. -c:v libx264 -profile:v baseline -pix_fmt yuv420p out.mp4out.avi 대신에 시도 하거나 mpv 또는 ffplay와 같은 다른 플레이어를 시도하십시오. 또한 현재 버전의 FFmpeg를 사용 중인지 확인하고 최종 지속 시간 후에 마지막 이미지 파일 이름을 복제하십시오.
mark4o

흠, 이상하고 U는 mpv와 ffmpeg.org에서 다운로드 한 ffmpeg 정적 빌드를 사용하며 지속 시간은 무시합니다. 어쨌든, 나는 이것을하는 다른 방법을 찾았으므로 그렇게 중요하지는 않습니다 : ffmpeg.org/pipermail/ffmpeg-user/2015-July/027702.html
sup

1

가정 ffmpeg -i in.ffconcat -vf fps=25 out.avi

(2018 : in.ffconcat 파일 내용)-작동합니다 :

ffconcat 버전 1.0
파일 text.png
지속 시간 30.0
파일 text.png

이 동안하지 않습니다

ffconcat 버전 1.0
파일 text.png
지속 시간 30.0

즉 두 번째 경우

ffprobe out.avi -show_entries format=duration -v 0

[체재]
지속 시간 = 0.040000
[/체재]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.