jpg 이미지 시퀀스를 ffmpeg의 비디오로 손실없이 인코딩하는 방법은 무엇입니까?


21

비디오로 무손실로 변환하려는 큰 jpg 세트가 있습니다 (또는 인코딩 시간이 다른 것보다 훨씬 높지 않으면 최소한 무손실에 가깝습니다).

순진하게, 나는 각각의 개별 jpg 프레임을 그대로 (재 압축없이) 저장할 수있는 코덱이 있어야한다고 생각하고 이전 프레임의 델타에 대한 정보로 일부 프레임을 교체하여 멋진 압축을 얻을 수 있습니다. 필자의 경우 서로 동일하거나 서로 약간의 차이가있는 많은 프레임 시퀀스가 ​​있습니다.

이것을 달성 할 수있는 ffmpeg에 대한 코덱과 적절한 설정이 있습니까?




1
JPEG 시퀀스는 오랫동안 코덱으로 사용되었습니다. h.264를 사용하지 않는 디지털 카메라는 항상 MJPEG를 기록하고 그것을 사용하는 데 사용되는 비디오 캡처 카드는 생각합니다.
Peter Cordes

답변:


24

그냥 이미지를 mux

JPG 이미지를 간단히 mux하여 비디오를 만들 수 있습니다.

ffmpeg -framerate 30 -i input%03d.jpg -codec copy output.mkv

생략 -framerate하면 기본값 -framerate 25이 입력에 적용됩니다.

무손실 최적화

당신이 사용할 수있는 jpegtran각 프레임에 손실 최적화를 수행 할 수 있습니다 중요한 파일 크기 절감 효과를 제공합니다 :

mkdir outputdir
for f in *.jpg; do jpegtran -optimize -copy none -perfect -v "$f" > "outputdir/$f"; done

이제 ffmpeg위와 같이 mux를 사용하십시오 .

실제로 무손실인지 확인

framehash의 먹서는 결과가 진정한 무손실 있는지 확인하기 위해 각 프레임의 고유 한 해시를 비교하는 데 사용할 수 있습니다 :

$ ffmpeg -i input%03d.jpg -f framehash -
stream_index, packet_dts, packet_pts, packet_duration, packet_size, hash
0,          0,          0,        1,   460800, 29bcc2db3726c7dfec1826c5740f603f
0,          1,          1,        1,   460800, b5fdc23d93cbd043dc2b9290dc8378f0
0,          2,          2,        1,   460800, ee0709942f24b458fd2380d134dcb59d
...

$ ffmpeg -i output.mkv -map 0:v -f framehash -
stream_index, packet_dts, packet_pts, packet_duration, packet_size, hash
0,          0,          0,        1,   460800, 29bcc2db3726c7dfec1826c5740f603f
0,          1,          1,        1,   460800, b5fdc23d93cbd043dc2b9290dc8378f0
0,          2,          2,        1,   460800, ee0709942f24b458fd2380d134dcb59d
...

상기 예에서, 입력 및 출력에 대한 각각의 연관된 프레임은 동일한 해시를 공유하여 프레임이 동일하고 출력이 무손실임을 보장한다.

참조


framemd5해시를 나열하는 것 이상으로 두 명령이 무엇 을 달성 해야하는지 명확히 설명해 주시겠습니까? 동일한 프레임이 식별 될 때 어떻게 추가 압축을 얻습니까?
GJ.

1
해시는 프레임이 개별 이미지와 동일하다는 것을 보여주기 위해 포함되었으므로 "각 개별 jpg 프레임을 그대로 (압축없이)"저장해야합니다.
llogan

VFR MJPEG.mkv로 끝나기 위해 중복 프레임을 삭제하는 테스트되지 않은 아이디어로 내 자신의 답변을 게시했습니다. VFR은 MJPEG에서 시간 중복성을 활용하는 유일한 방법입니다. : P
Peter Cordes

SSIM은 충실도를 비교하는 더 빠른 방법 일 수 있습니다.
Gyan

11

프레임이 다른 프레임의 정보를 사용하는 무손실 H.264 비디오를 출력합니다.

ffmpeg -f image2 -r 30 -i %09d.jpg -vcodec libx264 -profile:v high444 -refs 16 -crf 0 -preset ultrafast a.mp4

옵션 설명 :

  • -f image2 -이미지 그룹을 선택하도록 ffmpeg에 지시합니다.
  • -r 30 -ffmpeg가 초당 30 프레임 (또는 이미지)으로 인코딩하도록 지시합니다 (원하는 프레임 속도로 변경).
  • -i %09d.jpg-ffmpeg에게 000000000.jpg ~ 999999999.jpg의 이미지를 입력으로 사용하도록 지시합니다. 변경 9%09d.jpg이미지 시퀀스의 이름이 얼마나 많은 제로에. 파일 이름이 예를 들어 img0001.jpg 인 경우 img % 04d.jpg로 표시됩니다.
  • -vcodec libx264 -ffmpeg에게 H.264 호환 파일로 출력하도록 지시
  • -profile:v high444 -libx264에 High 4 : 4 : 4 Predictive Lossless 프로파일을 사용하여 무손실 인코딩을 허용합니다.
  • -refs 16 -libx264가 16 개의 이미지를 버퍼에 저장하도록하여 비디오의 다른 이미지에서 참조 할 수 있도록합니다.
  • -crf 0 -손실없는 인코딩을 수행하도록 libx264에 지시
  • -preset ultrafast -출력 파일 크기보다 인코딩 속도를 우선시하도록 libx264에 지시
  • a.mp4-ffmpeg에게 a.mp4라는 MP4 파일에 출력을 저장하도록 지시합니다. 이것을 사용하려는 파일 이름 및 형식으로 변경하십시오.

3
몇 가지 참고 사항 -f image2은 여기에 불필요한 것입니다. 이미지 파일 디멀티플렉서를 사용해야합니다 -framerate대신 -r. libx264는 -profile무손실에 적합한 것을 자동으로 선택하고 -preset처리합니다 -refs.
llogan

-refs 5대부분의 경우 콘텐츠에 다른 이미지로 구분 된 동일한 이미지가 있다는 것을 알지 못하면 x264가 복제본에 도달하기 전에 참조를 잃을 수 있습니다. 보다 높은 ultrafast(무손실에 필요한 비트율에서 높은 CPU 비용) CAVLC 이상 CABAC의 ~ 10 % 증가 이외의 무손실 모드에서 약간의 다른 점은. 실제로 일부 라이브 액션 720x480p60 (인터레이스 출력)에서 superfast28GB slower는 27GB였습니다. 인코딩 시간이 중요하지 않지만 디코딩 시간이 중요하다면 CABAC을 피하십시오. 아마조차 -tune fastdecode. 보통 심판 횟수는 아프지 않아야합니다.
Peter Cordes

그리고 CPU를 구울 -preset placebo경우 몇 퍼센트를 추가로 시도 할 수도 있습니다 .
DrYak

또한 완전성을 위해 h265에는 자체 무손실 모드가 있습니다. -vcodec libx265 -x265-params lossless=1동등한 옵션입니다. (그러나 내 경험 (= Powerpoint 슬라이드 쇼 프레젠테이션 기록), 반드시 더 좋은 것은 아니며 h264보다 훨씬 느립니다.) 내년 AOMedia의 AV1 / IETF의 NETVC1 / Xiph의 Daala에 대한 조정을 유지하십시오. ...의 무손실 모드
DrYak

5

당신이 만들 수있는 avi일련의 애니메이션 png이미지 ( png 손실이 너무 jpeg => png변환이 사진을 저하 안) :

이미지 이름이 img_0001.jpg

ffmpeg -r 25 -start_number 1 -f image2 -i "img_%04d.jpg" -vcodec png video.avi

여기서 "25"는 결과 비디오에서 원하는 프레임 속도입니다. -start_number1 인 경우 필요하지 않지만 첫 번째 동영상 번호가 1이 아닌 경우 유용합니다.

mjpeg최고 품질의 명령 행 으로 인코딩하려면 다음을 수행하십시오.

ffmpeg -r 25 -start_number 1 -f image2 -i "img_%04d.jpg" -vcodec mjpeg -qscale 1 video.avi

그리고 그 장점은 비디오를 일련의 그림으로 다시 변환 할 수 있다는 것입니다.

ffmpeg -i video.avi "img_series_%04d.png"
ffmpeg -i video.avi "img_series_%04d.jpg"

기타...


이것은 실제로 요청자의 요구를 충족시키지 못합니다. 그는 이미지가 변경 될 때만 프레임을 손실없이 업데이트 할 수있는 방법을 찾고 있습니다. 이는 동일한 이미지가 두 번 이상 사용될 수 있음을 의미합니다. 또한 JPEG 품질은 최대 품질에서도 JPEG 압축을 사용한다고 믿기 때문에 본질적으로 손실이 없습니다.
AJ Henderson

실제로 나는 그가 동일한 프레임의 긴 시퀀스에서 어떻게 될지 잘 모르겠지만 압축을 기꺼이 할 것이라고 생각합니다. ffmpeg가 지원하는지 확실하지 않지만 가변 프레임 속도 프레젠테이션 형식이 여전히 필요하다고 생각합니다.
AJ Henderson

CorePNG는 P 프레임도 생성 할 수 있습니다. 일반적으로 jpeg는 무손실 압축이 아니며 mjpeg가 P 프레임을 만들 수 있을지 의심됩니다. 질문에 답변하지 않지만 ffmpeg와 함께 무손실 비디오를 제공하는 솔루션을 제공한다는 데 동의합니다.
Olivier S

4

LordNeckbeard의 답변을 확장하려면 JPEG 데이터를 MJPEG 비디오 스트림으로 mux하십시오. 비록 MJPEG가 오늘날의 표준에 의해 엄청나게 비효율적 인 코덱 임에도 불구하고, 정확한 출력 이미지 시퀀스의 가장 작은 표현이 될 것입니다. (시간적 중복성 및 인트라 예측조차 없음).

가변 프레임 속도 MJPEG 비디오를 만들어 입력에서 중복 이미지를 활용할 수 있습니다.

ffmpeg -framerate 30 -i input%03d.jpg -vf mpdecimate -codec copy output.mkv  # doesn't work.

mpdecimate는 압축 된 데이터에서 작동하지 않으므로 ffmpeg에서 이미지 데이터를 디코딩 한 다음 손실 및 CPU 비용없이 다시 jpeg 할 수 없으므로 Hrm은 작동하지 않습니다.

어쩌면 중복 된 jpg 소스 파일을 해당 시퀀스 번호의 빈 파일로 바꾸거나 다른 것이 있습니까?

이 질문은 최근에 이루어지지 않았으므로 다른 사람이 어떻게 대답하지 않는 한 시간을 내서 방법을 알아 내지 않을 것입니다. 그러나 MJPEG는 mkv 컨테이너에 들어갈 수 있기 때문에 반복 프레임에 대한 jpeg 데이터를 복제하지 않는 파일을 가질 수 있지만 대신 중복 시퀀스가 ​​될 때까지 디코딩 할 출력 프레임이 없습니다. 위에.

아 여기 아이디어가 있습니다.

ffmpeg -framerate blah -input blah -vf mpdecimate -f mkvtimestamp_v2 mpdecimate.timestamps

그런 다음 mpdecimate에서 삭제하려는 프레임의 모든 jpeg를 제거하거나 옆으로 이동하십시오 (아마도 로깅 옵션이 있습니까? 또는 -vf showinfo를 구문 분석하고 출력에 표시되는 프레임 만 이동하거나 하드 링크하여 남겨 둡니다 JPEG 삭제?). MJPEG.mkv로 mux 한 다음 mkvmerge를 사용하여 프레임 타임 스탬프를의 타임 스탬프로 바꿉니다 mpdecimate.timestamps.

jpeg 데이터를 MJPEG로 muxing하는 대신 xcoding을 사용하는 경우 mpdecimate 및 이외의 다른 코덱과 함께 첫 번째 명령을 사용하고 copyJust Work (tm) 이기 때문에 훨씬 쉽습니다 .

이것은 오래된 질문 이므로이 중 하나를 시도하지 않았습니다. 또한 mpdecimate 출력을 기반으로 jpeg 디렉토리를 실제로 필터링하는 방법이나 실제로 타임 스탬프 스트림을 사용하는 방법의 차이를 채우지 않은 이유도 있습니다.

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