태그 보관물: ffmpeg

ffmpeg

이미지 + 오디오 = mp4 : 비디오를 더 작게 만드는 방법? -loop 1 -i image.jpg -i audio.mp3 -shortest

ffmpeg를 사용하여 MP4에 JPG를 추가하여 MP4를 만듭니다.

비디오를 만들 이미지가 하나뿐이므로 비디오 크기를 줄일 수있는 방법이 있는지 궁금합니다.

명령:

$ ffmpeg -loop 1 -i image.jpg -i audio.mp3 -shortest -c:a copy output.mp4

결과 :

  • image.jpg = 26.7K (이미지가 명확하지 않음)
  • audio.mp3 = 64.6M (54 분)
  • output.mp4 = 80.6M (비디오 결과가 명확하지 않고 음악이 여전히 좋습니다)

MP4에 적합한 크기입니까?



답변

YouTube에 업로드

H.264 : 가장 작은 파일

이 방법은 libx264를 사용하여 H.264 비디오를 인코딩합니다. 아래의 스트림 복사 방법보다 느리지 만 잠재적으로 더 작은 파일 크기를 출력합니다.

ffmpeg -loop 1 -framerate 1 -i image.jpg -i music.mp3 \
-c:v libx264 -preset veryslow -crf 0 -c:a copy -shortest output.mkv

스트림 복사 : 가장 빠른 프로세스

이 방법 은 이미지를 MKV 컨테이너로 스트리밍 (인코딩하지 않음)합니다. 매우 빠르지 만 위의 방법보다 크기가 중요한 경우 더 작은 파일을 생성 할 수 있습니다.

ffmpeg -loop 1 -framerate 1 -i image.jpg -i music.mp3 -c copy -shortest output.mkv
  • YouTube는 거의 모든 것을 받아들이므로이 명령은 몇 가지 트릭을 사용하여 인코딩 속도를 높이거나 파일 크기를 작게 만들고 YouTube는 사용자가 제공 한 모든 것을 다시 인코딩하므로 품질을 높게 유지합니다. 플레이어는 아마 마음에 들지 않지만 YouTube는 좋아할 것입니다.

  • 이 예에서는 기본 25fps보다 빠르게 처리해야하는 매우 낮은 프레임 속도가 사용됩니다.


모든 플레이어를위한 가장 넓은 호환성

ffmpeg -loop 1 -i image.png -i music.mp3 -vf "scale='min(1280,iw)':-2,format=yuv420p" \
-c:v libx264 -preset medium -profile:v main -c:a aac -shortest -movflags +faststart output.mp4
  • 이것은 매우 오래된 장치를 제외한 거의 모든 장치 -profile:v main에서 -profile:v baseline작동해야 합니다 ( 이 경우 변경 ).

  • 오디오 입력이 이미 AAC의 경우, 변경 -c:a aac하는 -c:a copy불필요한 재 인코딩을 피하기 위해.

  • 인코딩 시간이 길어지고 파일 크기가 위의 YouTube 명령보다 큽니다.

  • 자세한 정보는 FFmpeg Wiki : H.264 를 참조하십시오.


답변

내가 생각할 수있는 정보 만 제공했습니다.

조각으로 가자 :

비디오에 하나의 이미지 만 추가되었으므로. 비디오 크기를 줄이는 방법이 있는지 궁금합니다. 예를 들어 28 대신 강제 비트 레이트 / 초 = 1입니까?

정지 이미지이므로 변경할 필요가 없습니다. 그냥있어

당신이 말하는 것은 비트 레이트가 아닌 초당 프레임 (fps) 입니다. 그리고 당신은 개념에 맞습니다. 정지 이미지 1fps 하나만 문제가되지 않습니다.

mp4에 적합한 크기입니까? 이미지 크기가 중요합니까?

이 경우 하나의 스틸 사진 만 처리하므로 이미지 크기는 큰 무게를 갖지 않습니다. 고화질 비디오라면 다른 문제입니다.

jpg의 크기를 1080 * 720으로 조정하고 ffmpeg의 추가 설정을 720p로 출력해야합니까 (ffmpeg 설정은 무엇입니까 :)?

당신이 말하는 해상도는 1280×720입니다.

-loop 1여기서 옵션 의 요점을 보지 못하면 프로세스 속도가 느려집니다. -shortest파일에 둘 이상의 입력 스트림이 있기 때문에 사용 했습니까 ? 그렇지 않다면 그것을 사용할 이유가 없습니다. 당신이 사용했기 때문에 -acodec copy나는 당신이 그것을 다시 인코딩하고 싶지 않다고 가정해야합니다.

다시 인코딩하지 않고 비트 전송률에 닿지 않는 720p 1fps 출력의 경우 :

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -s 1280x720 output.mp4

입력 스트림이 두 개 이상이고 ffmpeg가 가장 짧은 스트림에서 인코딩을 완료하려는 경우를 생각해보십시오.

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -s 1280x720 -shortest output.mp4

이제 비트 전송률을 변경해야하는 경우 (예를 들어 1024k라고 가정)

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -b:v 1024k -bufsize 1024k -s 1280x720 output.mp4

참조 : 출력 비트 레이트 제한

-c : a copy = 입력 오디오 스트림을 복사하여 다시 인코딩하지 않도록합니다.

-b : v = (정확하지는 않음) 일정하도록 지정된 비트 전송률.

-bufsize = 평균 비트 전송률을 계산하는 간격입니다. -b : v에 지정된 손실 품질 이미지는 가장 낮지 만 비트 전송률은 더 정확합니다 .

-s = 비디오 출력의 실제 크기.

-framerate = 출력에서 ​​사용할 입력 프레임 속도.

한 지점에서 더 작은 크기의 비디오를 계속 원한다면이를 달성하기 위해 품질을 희생해야합니다. 그리고 다른 방법으로는 손실 압축으로 다시 인코딩하는 것이 포함됩니다.

당신이 말하는 것, 당신이 제공하는 정보, 그리고 당신이하려고하는 것은 앨범 아트를 mp3에 포함시키는 것 같습니다. 그것이 당신의 목표라면 이것은 당신의 요구 사항에 더 잘 맞을 것입니다 :

ffmpeg -i input.mp3 -i cover.jpg -map_metadata 0 -map 0 -map 1 output.mp3

-map_metadata = 파일에서 파일을 출력하는 ffmpeg 메타 데이터 지정자 이 경우 글로벌 메타 데이터 ( 0 )입니다.

-map 0 = 입력 스트림 1 (오디오).

-map 1 = 입력 스트림 2 (이미지).

여기에 귀하의 요청에 맞는 것이 없으면 추가 정보를 제공하십시오.


답변