기본 질문 : 과학 비디오 데이터를 무손실 방식으로 저장 / 보관하기에 적합한 코덱은 무엇 입니까?
현미경으로 녹화 한 일부 비디오를 저장 / 보관하여 연구 그룹을 돕기 위해 노력하고 있습니다. 이 (회색조) 비디오는 압축되지 않은 (rawvideo) BGR24 형식, 660x492 @ 61fps, 일반적으로 약 1 분 길이입니다. 제 연구실 동료들은이 파일들의 크기 (각각 기가 바이트)에 열광하고 있습니다. 무손실 코덱을 사용하여 압축하는 것이 좋습니다. (여기서 무손실이 필요한 것은 비디오가 과학적인 데이터이기 때문에 손실 된 코덱으로 인해 콘텐츠가 나쁜 / 예기치 않은 방식으로 변경 될 수있는 위험이 있습니다.)
여기 내가 시도한 것이 있습니다. 먼저이 비디오 중 하나의 처음 10 초를 잡고 FFMpeg를 사용하여 단색 (원시) 형식으로 변환했습니다.
ffmpeg -t 10 -i RecordedData.avi -c:v rawvideo -pix_fmt gray raw_gray.mkv
그런 다음 손실없는 libx264 모드를 사용 -crf 0
하여 결과 파일을 압축 하려고했습니다.
ffmpeg -i raw-gray.mkv -c:v libx264 -crf 0 -pix_fmt yuv420p -color_range pc x264-yuv420p.mkv
마지막으로, 원시 및 h264 MKV 파일 모두에서 원시 YUV 데이터를 추출하여 비교했습니다.
ffmpeg -i raw-gray.mkv -c:v rawvideo -pix_fmt gray raw-gray.yuv
ffmpeg -i x264-yuv420p.mkv -c:v rawvideo -pix_fmt gray x264-decompressed.yuv
diff -sq raw-gray.yuv x264-decompressed.yuv
여기서 diff
명령은 파일이 동일 할 것으로 예상했을 때 파일이 다르다고보고합니다. 왜 이런거야? 이것은 약간의 반올림 오류입니까, 아니면 H264 (무손실 손실) 압축을 수행 한 후 무언가 손실 될 수 있습니까? 발생하는 픽셀 형식의 변환 ( gray (YUV400) <-> YUV420
)이 있지만 입력이 단색이므로 색상 (UV) 채널이 비어 있어야합니다.
실제로 무언가를 잃어 버린 경우이 문제를 해결하기 위해 할 수있는 일이 있습니까? 내 데이터에 더 적합한 다른 (무손실) 코덱이 있습니까?
업데이트 1 : hexdump를 사용하여 압축되지 않은 YUV 데이터의 내용 (압축 raw-gray.yuv
되지 않음)과 x264-decompressed.yuv
(압축 후 압축 풀기)의 내용을 자세히 비교했습니다. 처음 몇 바이트는 다음과 같습니다.
[raw-gray.yuv]
00000000 4e 50 51 53 53 52 51 50 51 51 50 4f 50 50 50 50
00000010 51 51 50 51 52 53 51 51 52 52 53 53 52 51 51 53
00000020 51 53 54 55 53 51 52 54 53 53 52 50 51 50 52 52
00000030 51 52 51 51 51 52 54 52 52 52 51 51 51 53 57 58
00000040 57 57 55 54 54 52 53 51 51 52 53 55 55 54 53 53
00000050 51 51 52 52 53 52 51 50 50 50 50 51 51 4f 4f 4e
00000060 4c 4d 4e 4d 4f 50 4f 50 51 51 51 52 52 52 52 50
00000070 50 50 52 52 53 55 55 55 57 52 53 53 53 54 56 56
[x264-decompressed.yuv]
00000000 53 55 56 57 57 56 56 55 56 56 55 54 55 55 55 55
00000010 56 56 55 56 56 57 56 56 56 56 57 57 56 56 56 57
00000020 56 57 58 59 57 56 56 58 57 57 56 55 56 55 56 56
00000030 56 56 56 56 56 56 58 56 56 56 56 56 56 57 5b 5c
00000040 5b 5b 59 58 58 56 57 56 56 56 57 59 59 58 57 57
00000050 56 56 56 56 57 56 56 55 55 55 55 56 56 54 54 53
00000060 51 52 53 52 54 55 54 55 56 56 56 56 56 56 56 55
00000070 55 55 56 56 57 59 59 59 5b 56 57 57 57 58 5a 5a
이전 파일의 값은 후자의 값보다 4-5 작습니다. 파일을 조금 더 깊이 파고 들었습니다.
업데이트 2 : RGB 모드에서 libx264를 사용하는 경우 다음 외에도 위와 동일한 작업을 수행하여 원본과 정확하게 일치시킬 수 있습니다.
ffmpeg -i raw-gray.mkv -c:v libx264rgb -crf 0 -pix_fmt bgr24 x264-bgr24.mkv
ffmpeg -i x264-bgr24.mkv -c:v rawvideo -pix_fmt gray x264-bgr24-decomp.yuv
diff -sq raw-gray.yuv x264-bgr24-decomp.yuv
마지막 명령은 두 파일 이 동일하다는 것을보고 합니다 . 불행히도의 x264-bgr24.mkv
약 3 배가 x264-yuv420.mkv
되므로 RGB 모드에서의 압축은 좋지 않습니다.
libx264가 YUV 모드에서 그레이 스케일 비디오를 효율적으로 압축하는 곳을 읽었습니다 .Y 채널에만 실제 정보가 포함되어 있기 때문입니다 (U 및 V 채널은 흑백 비디오의 경우 0입니다). RGB 모드에서는 모든 채널에 단색 입력에 대한 동일한 정보가 포함되어 있다고 생각합니다. 아마 libx264rgb는 그것을 이용하지 않습니다.
따라서, 압축이 방법 훨씬 더 효율적이기 때문에 비디오를 변경하지 않고 YUV 모드를 사용하는 저를위한 방법은 무엇입니까?
업데이트 3 : -pix_fmt yuvj420p
대신을 사용하여 libx264의 문제를 해결할 수있었습니다 -pix_fmt yuv420p -color_range pc
. 그런 다음 압축 / 압축 해제 후 원본 파일을 정확하게 재생성합니다. FFmpeg 문서 에서이 두 플래그 집합이 동일하다는 인상을 받았지만 이는 사실이 아닙니다. 유일한 문제는 후자의 플래그 집합에 경고가 표시된다는 것 [swscaler @ 0x55b56347fe20] deprecated pixel format used, make sure you set the range correctly
입니다. 또한 내 버그 와 관련된 이 버그 보고서 를 찾았습니다 . 더 이상 사용되지 않는 yuvj420p 픽셀 형식을 사용하지 않고 작업을 수행하는 "적절한"방법을 잘 모르겠습니다.
compare
사용 하여 비교할 수도 있습니다.
hexdump
) diff를 실행하는 것이 좋습니다.diff
단순히 파일이 다른 곳 이라고 말합니다 . 1 비트, 1 메가 바이트, 모두 동일합니다. 16 진수 차이를 검사하면 발생한 상황과 걱정할 사항이 있는지 더 잘 추정 할 수 있습니다. 또한 작업이 비디오의 너비 또는 높이를 반올림하지 않았는지 확인하십시오 (나에게 그런 일이 발생했습니다).