그래서 나는 내 자신의 대답을 너무 길게 만들었습니다.
TL; DR 요약 : 무손실 이미지의 사용 순서 기억 libx264
또는 libx264rgb
함께이 -preset ultrafast -qp 0
. 비트 전송률이 훨씬 낮고 디코딩 속도가 더 빠르며 ffvhuff만큼 빠릅니다. huffyuv
는 ffmpeg 외부에서 훨씬 더 광범위하게 지원되지만만큼 많은 픽셀 형식을 지원하지 않습니다 ffvhuff
. 따라서 다른 도구 High 4:4:4 Predictive
가 x264가 무손실 모드에서 사용 하는 h.264 프로필을 처리 할 수 있다고 가정하면 h.264를 사용해야하는 또 다른 이유 입니다. 임의의 프레임에 빠른 임의 액세스가 필요한 경우 x264는 인트라 전용을 수행 할 수 있습니다.
이미지 디렉토리에서 읽을 때 libx264rgb에 영향을주는 ffmpeg 버그 에 주의하십시오 . (그리고 다른 경우를 아는 사람) 사용하기 전에 설정에서 손실이 없는지 테스트하십시오. ( ffmpeg -i in -pix_fmt rgb24 -f framemd5
소스에서 쉽고 무손실 압축)
편집 : utvideo
상당히 빠르게 인코딩 및 디코딩하며 h.264보다 훨씬 간단한 코덱입니다. 기본적으로 huffyuv
더 유용한 색상 공간을 지원 하는 현대적 입니다. h.264에 문제가있는 경우 임시 파일을 위해 utvideo를 시도하십시오.
edit2 : RGB 코덱으로 PNG가 적어도 Sintel 트레일러에서 잘 작동하는 것으로 보입니다.
비슷한 질문에 대한 비슷한 답변을 참조하십시오 :
https://superuser.com/a/860335/20798
Warren Young의 답변에는 다양한 원시 형식 및 코덱에 대한 많은 정보가 있습니다. 답변이 더 짧으면 더 유용 할 것 같아서 새로운 답변을 만들고 있습니다. 무손실 x264 또는 ffvhuff를 지원하지 않는 소프트웨어를 사용하는 경우 해당 정보 중 일부가 여전히 유용 할 수 있습니다.
이 문맥에서 "무손실"의 가장 유용한 정의는 비트 단위로 입력을 복구 할 수 있다는 것입니다. 무엇을하든 비디오 인코딩의 품질 저하에 대해 걱정할 필요가 없습니다.
http://en.wikipedia.org/wiki/Chroma_subsampling
이상적으로는 여러 색 공간 변환을 피하십시오. 반올림 오류가 발생할 수 있습니다. RGB 색상 공간에서 작동하는 필터를 사용하여 비디오를 작업하려는 경우 높은 비트 전송률이 문제가되지 않는 한 RGB를 유지하는 것이 좋습니다. 궁극적으로 yuv 4:2:0
비디오를 제작할 가능성이 있지만 적용 할 필터에 따라 추가 크로마 해상도를 유지하는 것이 유용 할 수 있습니다.
어느 쪽이든, 무손실 x264 및 지원 RGB와 YUV 모두 ffvhuff 4:4:4
, 4:2:2
하고 4:2:0
. 디코딩이 빠르기 때문에 x264를 제안합니다. RGB HD 비디오를 실시간으로 재생하려는 경우 xv 대신 opengl을 시도하십시오. 시스템의 xv는 yuv 입력 만 허용하기 때문입니다. mplayer는 색상 공간 변환을 수행하는 데 추가 CPU 시간이 필요했습니다.
https://media.xiph.org/ 인코더 테스트 소스 . https://media.xiph.org/sintel/sintel_trailer-1080-png.tar.gz 그들은 sintel 트레일러 용 y4m 파일을 압축하는 것을 잊었으므로 png tarball은 실제로 훨씬 작습니다.
ffmpeg -i 1080/sintel_trailer_2k_%4d.png -i sintel_trailer-audio.flac \
-c:a copy -c:v libx264rgb -preset ultrafast -qp 0 \
frompng.sintel.264rgb.mkv
예 :
peter@tesla:/mnt/GP1TB/p/encoder-sample/sintel$ time ffmpeg -i 1080/sintel_trailer_2k_%4d.png -i sintel_trailer-audio.flac -c:a copy -c:v libx264rgb -preset ultrafast -qp 0 frompng.sintel.264rgb.mkv
ffmpeg version N-67983-g2b358b4 Copyright (c) 2000-2015 the FFmpeg developers
built on Jan 10 2015 05:32:37 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
configuration: --enable-gpl --enable-version3 --enable-nonfree --disable-doc --disable-ffserver --enable-libx264 --enable-libx265 --enable-libmp3lame --enable-libopus --enable-libwebp --enable-libvpx --disable-outdev=oss --disable-indev=oss --disable-encoder=vorbis --enable-libvorbis --enable-libfdk-aac --disable-encoder=aac --disable-decoder=jpeg2000
libavutil 54. 16.100 / 54. 16.100
libavcodec 56. 20.100 / 56. 20.100
libavformat 56. 18.100 / 56. 18.100
libavdevice 56. 3.100 / 56. 3.100
libavfilter 5. 7.100 / 5. 7.100
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 3.100 / 53. 3.100
Input #0, image2, from '1080/sintel_trailer_2k_%4d.png':
Duration: 00:00:50.12, start: 0.000000, bitrate: N/A
Stream #0:0: Video: png, rgb24, 1920x1080 [SAR 72:72 DAR 16:9], 25 fps, 25 tbr, 25 tbn, 25 tbc
Input #1, flac, from 'sintel_trailer-audio.flac':
Duration: 00:00:52.00, start: 0.000000, bitrate: 721 kb/s
Stream #1:0: Audio: flac, 48000 Hz, stereo, s16
File 'frompng.sintel.264rgb.mkv' already exists. Overwrite ? [y/N] y
No pixel format specified, rgb24 for H.264 encoding chosen.
Use -pix_fmt yuv420p for compatibility with outdated media players.
[libx264rgb @ 0x2770760] using SAR=1/1
[libx264rgb @ 0x2770760] using cpu capabilities: MMX2 SSE2Fast SSSE3 Cache64 SlowShuffle
[libx264rgb @ 0x2770760] profile High 4:4:4 Predictive, level 4.0, 4:4:4 8-bit
[libx264rgb @ 0x2770760] 264 - core 144 r2525+2 6a4fca8 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=0 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=0 chroma_qp_offset=0 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc=cqp mbtree=0 qp=0
Output #0, matroska, to 'frompng.sintel.264rgb.mkv':
Metadata:
encoder : Lavf56.18.100
Stream #0:0: Video: h264 (libx264rgb) (H264 / 0x34363248), rgb24, 1920x1080 [SAR 72:72 DAR 16:9], q=-1--1, 25 fps, 1k tbn, 25 tbc
Metadata:
encoder : Lavc56.20.100 libx264rgb
Stream #0:1: Audio: flac ([172][241][0][0] / 0xF1AC), 48000 Hz, stereo (16 bit)
Stream mapping:
Stream #0:0 -> #0:0 (png (native) -> h264 (libx264rgb))
Stream #1:0 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 1253 fps= 18 q=-1.0 Lsize= 834790kB time=00:00:51.96 bitrate=131592.5kbits/s
video:830198kB audio:4575kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.002025%
[libx264rgb @ 0x2770760] frame I:6 Avg QP: 0.00 size:612470
[libx264rgb @ 0x2770760] frame P:1247 Avg QP: 0.00 size:678787
[libx264rgb @ 0x2770760] mb I I16..4: 100.0% 0.0% 0.0%
[libx264rgb @ 0x2770760] mb P I16..4: 50.3% 0.0% 0.0% P16..4: 12.0% 0.0% 0.0% 0.0% 0.0% skip:37.6%
[libx264rgb @ 0x2770760] coded y,u,v intra: 71.1% 68.2% 70.0% inter: 22.8% 22.8% 23.2%
[libx264rgb @ 0x2770760] i16 v,h,dc,p: 50% 48% 1% 1%
[libx264rgb @ 0x2770760] kb/s:135693.94
-r 24
fps 를 지정하는 것을 잊었 으므로 오디오와의 av 동기화를 유지하지 않습니다. (및 파일 크기가 아닌) 비트 전송률도 해제됩니다. ffmpeg의 기본값은 25fps입니다. 이 머신의 CPU는 1 세대 (콘로) 코어 2 듀오 2.4GHz (E6600)입니다.
결과 :
4.5M sintel_trailer-audio.flac # this is muxed in to every mkv
948M 1080 # the directory of PNGs
940M /var/tmp/dl/sintel_trailer-1080-png.tar.gz
7434M sintel.y4m # yuv444, uncompressed. mplayer gets the colors wrong?
2342M qtrle.mkv # encode went at 16fps, so qtrle is slower and worse filesize
2105M sintel.huff.mkv # ffvhuff with default options, rgb pix fmt
1228M sintel.utvideo.mkv # muxed without audio, I should update the others this way
946M png-copy.mkv # -codec copy makes a MPNG stream. Use -codec png for non-png sources, but it won't make PNGs as small. Decodes very fast
824M lossy.prores_ks.mov # yuv444p10le extremely slow to encode (2.3fps), and worse bitrate.
816M frompng.sintel.264rgb.mkv
735M sintel.x264rgb.medium.nocabac.mkv # encode went at 3.3 fps instead of 18. Better gain than for live-action, though
626M sintel_trailer.rgb.lossless.veryslow.mkv # 1.1fps. With CABAC, 16 ref frames, etc. etc.
512M lossy.prores.mov # yuv422p10le, 12fps
341M sintel.yuv420.x264.lossless.mkv
21M lossy.rgb.crf26.preset=medium.mkv
13M lossy.yuv420.crf26.preset=medium.mkv # remember this is WITH 4.5MB audio
참고 mediainfo
RGB H.264에 대해 알고하지 않습니다, 그것은 여전히 파일 YUV를 것을 말한다.
실제로 손실이 없는지 확인하십시오.
ffmpeg -i 1080/sintel_trailer_2k_%4d.png -f framemd5 png.framemd5
ffmpeg -i fromhuff.sintel.264rgb.mkv -an -sn -pix_fmt rgb24 -f framemd5 x264rgb.framemd5
diff -s *.framemd5
Files png.framemd5 and x264rgb.framemd5 are identical
따라서 원본 PNG 입력을 복구 할 수 있습니다. 즉, 동일한 이미지 데이터가있는 PNG를 만들 수 있습니다.
-pix_fmt rgb24
x264 테스트에 유의하십시오 . ffmpeg의 h.264 디코더는 gbrp (평면, 패킹되지 않은) 출력을 출력하므로 비트는 동일하지만 순서가 다릅니다. framemd5 "컨테이너"는 어떤 종류의 형식 제한도 부과하지 않지만 비트가 동일한 방식으로 배열 된 경우 동일한 md5 만 얻게됩니다. 나는 ffmpeg가 PNG를 공급할 때 pix fmt에 사용하고 있다고 말한 것을 보았고 그것을 -pix_fmt
디코딩 을 위한 인수로 사용했습니다 . 또한 vlc가 RGB h.264 파일을 재생하지 않는 이유 (다음 릴리스 또는 현재 야간 빌드까지) : gbrp 픽셀 형식을 지원하지 않습니다.
yuv 사용을 위해 libx264
, 아닙니다 libx264rgb
. RGB 버전의 x264를 설치할 필요가 없으며 실제 라이브러리는 두 가지를 모두 지원합니다. 두 개의 다른 이름의 인코더로 구현 한 것은 단지 ffmpeg입니다. 그들이 그렇게하지 않았다면 기본 동작은 rgb 입력을 rgb로 남겨두고 동일한 품질에 대해 훨씬 높은 비트 레이트 출력을 생성하면서 실제로 느리게 실행하는 것입니다. ( h.264 출력 대신 -pix_fmt yuv420p
원하는 경우 여전히 사용해야 합니다 .420
444
장기 저장 용 파일을 만들지 않는 한 항상 -preset ultrafast
무손실 x264에 사용하십시오. 더 많은 참조 프레임과 모션 검색은 노이즈가없는 애니메이션이 적용되지 않은 재질의 경우 손실없는 차이를 거의 만들지 않습니다. CABAC는 무손실 비트 전송률로 막대한 양의 CPU를 사용하며 심지어 디코딩에도 사용됩니다. 파일을 스크래치하지 않고 보관 목적으로 만 사용하십시오. CABAC를 사용하지 않도록 설정합니다. CABAC는 10-15 %의 비트 전송률 절감 효과를 제공합니다.
모든 프레임이 키 프레임이어야하는 경우을 설정하십시오 -keyint 1
. 그런 다음 키 프레임 또는 w / e 만 잘라내려는 비디오 편집 소프트웨어는 사용자를 제한하지 않습니다.
원래 질문에 대답하려면 다음 단계를 수행하는 동안 임시 파일을 던지기 위해 수행 해야하는 작업입니다 (예 : 느린 디인터레이스, 다른 작업을 시도하기 전에 손실없는 출력 저장).
ffmpeg -i dv-video-source.ts -vf yadif=2:1,mcdeint=3:1:10 -c:a copy -c:v libx264 -preset ultrafast -qp 0 deinterlaced.mkv
스틸 이미지 도구로 수정할 수있는 이미지 파일의 출력이 실제로 필요한 경우 png로 디코딩하십시오. 각 픽셀의 Y, Cb 및 Cr 값 각각에 대해 8 비트 중 가장 중요하지 않은 것을 잃지 않을 것입니다.
x264는 약간의 텍스트, 페이드 인 및 페이드 아웃 및 많은 프레임의 큰 영역간에 완벽한 유사성이있는 많은 검은 색 프레임이 있기 때문에 실제로 잘 나타납니다 -preset ultrafast
. 라이브 액션에서 ffvhuff (yuv420) 파일 크기의 절반에 x264가 계속 표시됩니다.
궁금한 사람은 다음과 같습니다. 높은 CPU 시간 무손실 RGB 인코딩에는 (x264 코어 144 r2525)가 있습니다.
[libx264rgb @ 0x35b97a0] frame I:27 Avg QP: 0.00 size:604367
[libx264rgb @ 0x35b97a0] frame P:1226 Avg QP: 0.00 size:517512
[libx264rgb @ 0x35b97a0] mb I I16..4..PCM: 46.3% 38.1% 15.7% 0.0%
[libx264rgb @ 0x35b97a0] mb P I16..4..PCM: 24.3% 5.4% 4.5% 0.0% P16..4: 10.5% 3.3% 5.7% 0.0% 0.0% skip:46.3%
[libx264rgb @ 0x35b97a0] 8x8 transform intra:17.3% inter:46.1%
[libx264rgb @ 0x35b97a0] coded y,u,v intra: 81.6% 77.5% 80.0% inter: 28.0% 27.7% 28.1%
[libx264rgb @ 0x35b97a0] i16 v,h,dc,p: 35% 64% 1% 0%
[libx264rgb @ 0x35b97a0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 31% 49% 13% 2% 1% 1% 1% 1% 1%
[libx264rgb @ 0x35b97a0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 31% 37% 5% 5% 6% 5% 5% 4% 3%
[libx264rgb @ 0x35b97a0] Weighted P-Frames: Y:41.1% UV:40.7%
[libx264rgb @ 0x35b97a0] ref P L0: 74.5% 4.2% 9.1% 4.1% 2.1% 1.7% 1.2% 0.8% 0.6% 0.5% 0.3% 0.2% 0.2% 0.2% 0.2% 0.1%
[libx264rgb @ 0x35b97a0] kb/s:99721.66
가중 된 p 프레임의 매우 높은 비율과 건너 뛰기 매크로 블록의 매우 높은 비율에 주목하십시오. 모든 장면 전환은 잘릴 수있는 페이드가 아니며 x264는 CPU 시간을 알려 주면 활용 방법을 알 수 있습니다.
추가 참고 사항 (편집 용 손실 코덱) :
클립을 통해 앞으로 / 뒤로 문지르는 경우 일반적으로 인트라 코덱 만 선호됩니다 (utvideo, ffvhuff, mjpeg, jpeg2000, pro-res, AVC-Intra). 짧은 GOP (1/2 ~ 1 초)가있는 일반 AVC도 소프트웨어가 무엇을하고 있는지 알고있는 한 잘 닦을 것이라고 생각합니다 (빠르게 문지르면 가장 가까운 I 프레임을 디코딩하고 GOP 내에서 디코딩하여 필요한 경우 타임 라인에서 충분히 확대 한 경우 인터 프레임).
나는 이것과 https://video.stackexchange.com/ 에 "손실이없는 코덱보다 느리고 더 나쁜 압축이라면 요점은 무엇입니까?"와 같은 전문가에 대해 부정적인 것을 게시 했지만 흥미로운 기능이 있습니다. 애플은 풀 레즈 디코딩의 CPU 시간의 1/3 정도만 사용하면 절반 해상도로 디코딩 할 수 있다고 말했다 .
ffmpeg의 prores 구현은 아마도 Apple만큼 속도에 최적화되지 않았을 것입니다. ffmpeg를 사용한 테스트로 인해 느리게 보입니다. ffmpeg 기반 도구를 사용한 무료 소프트웨어 워크 플로우가있는 경우에는 사용할 가치가 없지만 상용 소프트웨어를 사용하는 경우 시도해 보는 것이 좋습니다.
나는 비디오 편집을 많이하지 않고 주로 인코딩 만 수행하므로 prores와 같은 코덱에 어떤 테스트가 적합한 지 잘 모릅니다. short-GOP x264가 제대로 작동하지 않으면 mjpeg가 좋은 빠른 대안 일 것입니다. Linux 배포판에는 jpeg의 asm-accelerated 구현이 있으며 매우 간단한 코덱입니다. 품질 대 파일 크기 + 인코딩 / 디코딩 속도를 절충하기 위해 필요에 따라 품질을 높이거나 낮출 수 있습니다. 그것은 고대이지만, 정말 빠른 인트라 전용 코덱을 원한다면 x264를 능가 할 것입니다.
x264의 경우 x264 --crf 10 --keyint=1 --preset superfast --tune fastdecode
(내부 전용, --avcintra-class
설정 하는 다른 항목없이) 시도해보십시오 . 참고 superfast
(CABAC 없음) 또는 faster
, ultrafast
아마도 손실 된 작업 에는 적합하지 않습니다 . 나는 초고속이 훨씬 빠르지 않으면 많은 품질을 잃어 버린다고 생각합니다. 사용하는 품질이 낮을수록 (높은 crf) 더 나은 인코딩을 찾는 데 더 많은 CPU 시간을 소비 할 가치가 있습니다. 그러나이 중 많은 부분이 GOP 크기 = 1과 관련이 없을 수 있습니다.
GOP 크기가 1보다 큰 경우, 인코딩에서 너무 많은 비트를 던지면 잔차를 인코딩 할 때 더 나은 인터 예측이 많은 비트를 절약하지 못합니다 (프레임 간의 노이즈 / 그레인 / 미묘한 변화가 매우 정확하게 유지되기 때문에) 그냥 초고속 일 것입니다. 그렇지 않으면, --keyint=30
또는 무엇인가, 아마도 --preset veryfast --crf 12
흥미로울 것 입니다.
이론적으로 주어진 CRF 설정의 품질은 사전 설정에서 일정해야합니다. 더 작은 파일 (더 빠른 디코드)을 찾고 있다면 일부 품질과 일부 인코딩 시간을 사용하는 것이 좋습니다.
ffmpeg -i input.avi -c:v qtrle -pix_fmt rgb24 output.mov
.