FFmpeg를 사용하여 하나의 이미지와 하나의 오디오 파일을 결합하여 하나의 비디오를 만듭니다.


183

이것은 사소한 것이지만 작동시키는 방법을 찾을 수 없습니다.

FFmpeg가 하나의 JPEG 이미지와 오디오 파일을 입력으로 사용하고 오디오 파일과 동일한 지속 시간의 비디오 파일을 생성하려고합니다 (정지 이미지를 전체 지속 시간 동안 늘림).

출력에 사용되는 비디오 코덱에 대해서는별로 신경 쓰지 않지만 오디오 코덱으로 "복사"를 사용할 수 있어야합니다 (예 : 트랜스 코딩없이 오디오 스트림 복사).

그렇게하는 올바른 명령 줄은 무엇입니까?

나는 시도했다 :

ffmpeg -i image8.jpg -i sound11.amr -acodec copy test.avi

와 함께 및없이 조합을 많이 시도 -s 640x360, -loop_input, -shortest, -t xxx, -r 0.1(비디오가 이상이 될 것이라는 희망에서 인위적으로 낮은 프레임 속도) 및-f image2

오류가 발생하거나 한 프레임 지속 시간의 비디오 파일을 얻습니다.

나는 구글을 둘러 보았고 수십 개의 제안 된 솔루션 (아마도 같은 질문에 해당)이 작동하지 않는다는 것을 발견했다.

아무도 작업 명령을 제안하고 그 근본 이유를 설명 할 수 있습니까?


방금 명령 줄을 시도했지만 예상대로 작동했습니다. 사운드 형식에 문제가있을 수 있습니다. 사운드 트랜스 코딩이 작동합니까?
기린 선장

"예상대로"란 결과 비디오의 오디오 입력 시간이 동일하다는 것을 의미합니까? 당신은 그것을 연주 했습니까? 한 프레임 길이 아닌가요?
matteo

사운드 포맷은 문제가되지 않습니다. 사운드를 코드 변환하십시오
matteo

나도 params 문제가 있었고 시간이 걸렸습니다! 이런 종류의 문제는 도움이되지 않습니다. gregoire.org/2009/12/05/fun-with-ffmpeg
Paul Gregoire

3
이것은 선택된 답변보다 낫습니다. 나는 실험했고 빠르며 파일 크기는 작습니다 ..ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi
Muhammad Umer

답변:


145

명령 행의 옵션 순서가 중요합니다. 내 경우에는 다음이 작동합니다.

ffmpeg -loop 1 -y -i image8.jpg -i sound11.amr -shortest -acodec copy -vcodec mjpeg result.avi

보다 일반적인 경우, 입력 위치 image.jpg및 위치 는 FFmpeg Wikiaudio.wav 에서 다음 명령을 사용할 수 있습니다 .

ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -shortest out.mp4

이것은 libx264인코더를 사용하며 위에서 사용한 MJPEG 코덱보다 더 나은 압축을 제공합니다. 오디오는 ffmpegAAC 인코더 가 내장 된 AAC입니다.


5
파일이 [이미지 크기] + [오디오 파일 크기]보다 훨씬 더 큰 결과는 무엇입니까? 비디오 압축이 일정한 프레임으로 미치게 될 것으로 예상합니까?
Alec Jacobson

2
사용하는 비디오 코덱에 따라 다릅니다. 내 예제에서 명령을 복사하는 경우 각 프레임을 개별적으로 압축하는 코덱으로 mjpeg를 사용하고 있으므로 모든 프레임이 동일하다는 사실을 이용하지 않습니다. 또한 다른 코덱조차도 한 번에 한 번씩, 즉 N 번째 프레임마다 전체 프레임을 다시 코딩한다고 생각하므로 파일 크기는 훨씬 작지만 이미지 + 사운드 크기보다 훨씬 큽니다. (a) 그렇지 않으면 디코더는 마지막 프레임으로
건너

2
Option shortest (finish encoding within shortest input) cannot be applied to input file image.jpg -- you are trying to apply an input option to an output file or vice versa. Move this option before the file it belongs to.
wim

2
ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi이것을 사용 하면 더 잘 작동합니다 !!!?! ??!?!
Muhammad Umer

2
이 답변은 현재 메타 에 대해 논의 중 입니다.
DavidPostill

41

당신이해야 할 보다 훨씬 어렵게 만들고 있습니다. FFmpeg는 당신이 생각하는 것보다 훨씬 영리합니다. 그것은 비디오가 오디오 트랙과 길이가 같기를 원한다는 것을 알고 있습니다.

ffmpeg -i still.png -i narrate.wav -acodec libvo_aacenc -vcodec libx264 final.flv

pause

유일한 속성 지정이되어 input filenamesoutput codecs, 그리고는 output filename(이 EO IPSO는 을 포함 output container).

물론 최종 비디오와 동일한 크기를 공유하는 스틸 이미지로 시작하는 것이 좋습니다. FFmpeg의 출력 크기를 지정하는 대신 전용 이미지 편집기를 사용하는 경우 입력 크기가 짝수인지 확인해야합니다 .

출력 크기는 FFmpeg의 가장 일반적인 끊기 중 하나입니다. 일부 코덱은 다른 코덱보다 출력 크기가 더 제한적이지만 출력에 홀수-높이 또는 너비 속성이있을 수는 없습니다.

pause배치 파일의 끝에 있는 명령 은 CLI를 열린 상태로 유지 합니다. 명령 줄을 디버그 하는 가장 좋은 방법은 생성 된 오류 메시지를 읽는 것입니다. 그것들은 매우 구체적이며 FFmpeg가 가지고있는 최고의 문서이지만, 읽기 전에 창을 닫으면 개발자의 노력이 낭비됩니다.

명령 셸 에는 cmd /k명령 프롬프트에서 배치 스크립트와 동일한 지침을 실행할 수있는 열린 창을 유지하는 스위치 가 있습니다.

는 FFmpegavconv은 모두 사용하게됩니다 -c:a에 대한 -acodec-c:v위해 -vcodec결국,하지만 내가 사용하는 빌드에서 이전 명령은 잘 작동합니다.

참고 : 모든 커밋에는 고유 한 특성이 있습니다. 명령 행이 명백한 이유없이 실패하는 경우, 다른 빌드를 시도하거나 FFmpeg의 가장 활발한 개발자가 지난 몇 년 동안 libav로 분기하는 것이 도움이 될 수 있습니다. 트랜스 코딩 도구의 이름이 avconv 로 바뀌 었지만 배치 파일이 둘 중 하나와 작동해야합니다.


질문에서 이미 언급했듯이 이미 동일한 명령을 시도했으며 지속 시간의 비디오를 얻기 때문에 youurs와 다른 버전을 사용해야합니다 (명령을 시도했지만 설명대로 작동하는 경우) 오디오 파일의 지속 시간이 아닌 1 프레임 (1 분의 1 초)입니다. 나는 그것이 지능적이라고 기대했지만 (내 버전에서는) 그렇지 않은 것으로 판명되었습니다.
matteo

2
이봐 Matteo , 그래, 나는 그 코드를 실행했고, 그래, 그것은 광고 된대로 작동합니다. 나는 그러한 주장을 테스트하지 않고 부주의하게 쓸만한 반값이 많이 있다고 확신하므로 기분 나빠하지 않도록 노력할 것입니다 :) 입력 파일 및 최종 출력 파일의 데이터. 내 입력 파일, 배치 파일 및 출력 파일은 FFmpeg 빌드에 대해 테스트하려는 경우 자유롭게 다운로드 할 수 있는 GoogleDrive 에 있습니다.

@ShinMuraoka Mine is a win-64 ffmpeg build compiled on: Jan 6 2013, at: 16:16:53귀하의 솔루션이나 @matteo 솔루션 모두 저에게 효과적 이지 않았습니다. 또한 Google 드라이브에서 파일을 다운로드했지만 예상 출력을 얻지 못했습니다 (출력 파일에는 오디오 만 포함 된 검은 색이었습니다). 올바른 명령을 사용할 수 있도록 도와주세요.
coding_idiot

2
"출력이 홀수의 높이 또는 너비 속성을 가질 수 없음"참이 아닙니다. rpix24 또는 yuv444p와 같이 크로마 서브 샘플링이없는 것으로 pix_fmt를 설정 한 다음 코덱과 컨테이너가이를 지원하고 추가 제한이 없는지 확인하십시오. pix_fmt와 관련하여 FFmpeg는 지능적이지 않습니다. 달리 언급하지 않는 한 yuv420p (채도 서브 샘플링이 있음)로 가정합니다.
조나단 볼드윈

여러 이미지는 어떻습니까? 특정 시간에 다른 이미지로 변경하려면 이미지가 필요합니다. 명령 줄에서 각각에 대한 시간 매개 변수를 사용하여 지정할 수 있기를 원합니다.

36

더 쉬운 방법 :

ffmpeg -i ep1.png -i ep1.wav ep1.flv

FFmpeg는 출력 파일의 확장자에 따라 최상의 코덱을 자동으로 선택합니다.

업데이트 : YouTube에 프레임이 하나 밖에 없기 때문에 비디오 처리에 어려움이 있음을 알았습니다 (95 %로 멈춤). YouTube를 행복하게 만드는 해결책 : 더 많은 프레임 추가. 또한 -acodec copy오디오 품질을 유지하기 위해 추가 했습니다. 필요 -shortest하거나 영원히 반복됩니다. (이미지 루프가 무한하므로 가장 짧은 스트림의 끝에서 오디오가 중지됩니다.) 필터 (및 기타)가 지정한 순서대로 처리되므로 옵션 순서는 속도에 매우 중요합니다. 이러한 매개 변수의 순서를 변경하면 결과가 크게 다릅니다.

ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:720 ep1.flv

또한 프레임 속도를 두 번 설정했습니다. 우연이 아닙니다. 첫 번째 프레임 속도는 입력, 두 번째는 출력입니다. 이 작업을 올바르게 수행하면 초당 비디오 프레임이 하나만 있어야하므로 비교적 빠르게 인코딩됩니다. 또한 해상도를 720p로 설정했는데 YouTube에서 HD 오디오를 가져와야합니다.


또한 오디오 파일이 .flv 컨테이너와 호환되지 않을 수 있습니다. 이 경우 오디오 파일과 호환되는 컨테이너 형식을 찾을 때까지 .webm, .avi 또는 다른 형식과 같은 다른 (출력) 컨테이너를 사용해보십시오.
PJ Brunet

1
MP4가 완벽하게 작동하도록 .JPG 및 .MP3에 사용했습니다. JPG / MP3에서 만든 FLV가 작동하지 않는 것 같습니다. 이는 이전 설명 경고에 따른 것일 수 있습니다.

2
업데이트 된 버전이 Youtube에서 작동합니다. 나는 그것이 95 %에 붙어 있다고 생각했지만 마침내 효과가있었습니다.
Basj

이것을 얻었다 : No pixel format specified, yuvj420p for H.264 encoding chosen. Use -pix_fmt yuv420p for compatibility with outdated media players. [libx264 @ 0x2b5c940] height not divisible by 2 (700x457)... 이것은 작동한다 :ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:-2 video.mp4
NineCattoRules

여러 이미지는 어떻습니까? 특정 시간에 다른 이미지로 변경하려면 이미지가 필요합니다. 명령 줄에서 각각에 대한 시간 매개 변수를 사용하여 지정할 수 있기를 원합니다.

14

나를 위해 일한 버전 :

 ffmpeg -loop 1 -y -i pic.jpg -i sound.amr -shortest video.mp4

-shortest아래 오류가 발생하지 않으면 옵션 이 출력 파일 앞에 있어야합니다.

가장 짧은 옵션 (가장 짧은 입력 내에서 마무리 인코딩)을 입력 파일 pic.jpg에 적용 할 수 없습니다. 입력 옵션을 출력 파일에 적용하려고하거나 그 반대의 경우도 마찬가지입니다. 이 옵션을 속한 파일보다 먼저 이동하십시오. 입력 파일 pic.jpg의 구문 분석 옵션 오류가 발생했습니다.


고마워 다른 답변의 대부분은 나를 위해 작동하지 않았습니다 (Alpine Linux에서 ffmpeg 사용). 이 답변에는 완벽하게 작동하는 가장 짧은 명령이 있습니다.
DannyB

8

ffmpeg 맨 페이지에서 :

ffmpeg [[infile options][-i infile]]... {[outfile options] outfile}...

발견 한대로 파일 옵션은 적용 할 파일 앞에 와야합니다.

그러나 이것은 버그가 아니며 적용 할 파일 인수를 지정할 수있는 메커니즘 일뿐입니다.


여러 이미지는 어떻습니까? 특정 시간에 다른 이미지로 변경하려면 이미지가 필요합니다. 명령 줄에서 각각에 대한 시간 매개 변수를 사용하여 지정할 수 있기를 원합니다.

4

이것은 나를 위해 일했다

ffmpeg-루프 1-최단 -y -i image.jpg -i audio.mp3 -acodec 복사 -vcodec libx264 video.avi

vcodec libx264mpjeg(100MB가 아닌 10MB)보다 훨씬 작은 파일을 생성했습니다 .


1
-shortest는 출력 옵션이며 사용중인 입력 옵션으로 무시 될 수 있습니다.
llogan

1

나는 @matteo 하려고 했지만 오디오는 없었고 @Colonel Panic 의 솔루션이 가장 효과적이었습니다 .

ffmpeg -loop 1 -shortest -y -i still.png -vcodec libx264 -t 10 video.avi

지속 시간 인수를 초 ( -t 10) 로 추가해야했습니다 .


-shortest출력 옵션이지만 입력 옵션으로 사용하고 있습니다. 출력 파일보다 먼저 이동하면을 제거 할 수 -t 10있지만 대답은 다른 것과 거의 동일합니다.
llogan

0

ffmpeg -loop 1 -i img.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest out.mp4


5
추가 한 명령이 어떻게 작동하는지 설명 할 수 있습니까?
neelsg

이 답변은 다른 간단한 "댓글-답변"과 크게 다르지 않습니다.
llogan

0

누군가 일괄 변환을 원한다면 이것을 시도하십시오.

입력 및 출력 폴더와 비디오를 넣을 형식을 설정할 수 있습니다.이 경우에는 AVI로 설정했습니다.

이 답변 FFmpeg를 사용하여 하나의 이미지와 하나의 오디오 파일을 결합하여 하나의 비디오를 만들면 많은 도움이되었습니다.

 @echo off
 set "sourcedir=C:\Users\CodeHard\Desktop\BOX\Newfolder"  
 set "outputdir=C:\Users\CodeHard\Desktop\BOX\Converted" 

 PUSHD "%sourcedir%"

 for %%F in (*.mp3) DO ffmpeg -r 1 -loop 1 -i abc.jpeg -i "%%F" -acodec copy -r 1 -shortest -vf scale=1280:720 "%outputdir%\%%F.avi"  

 POPD

-1

이 명령을 시도하십시오. 그것은 나를 위해 일했습니다.

-y -i /storage/emulated/0/images.jpg -i /storage/emulated/0/audio.wav -acodec aac -vcodec mpeg4 -s 480*320 -f mp4 -r 2 /storage/emulated/0/output.mp4"

2
이 명령은 작동하지 않는 불완전한 명령입니다. 명령을 수정하고 디버깅 할 수는 있지만 귀하의 작업은 수행하지 않으므로 답변을 수정하여 직접 수정하십시오. 또한 귀하의 비디오 크기가 matteo가 ​​원하지 않는 것으로 나타났습니다.
karel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.