과학 비디오 데이터 보관 (흑백)에 무손실 비디오 코덱 사용


9

기본 질문 : 과학 비디오 데이터를 무손실 방식으로 저장 / 보관하기에 적합한 코덱은 무엇 입니까?

현미경으로 녹화 한 일부 비디오를 저장 / 보관하여 연구 그룹을 돕기 위해 노력하고 있습니다. 이 (회색조) 비디오는 압축되지 않은 (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 픽셀 형식을 사용하지 않고 작업을 수행하는 "적절한"방법을 잘 모르겠습니다.


1
데이터가 압축 해제되었으므로 데이터 형식을 텍스트 형식 으로 변환하고 (예 :를 사용하여 hexdump) diff를 실행하는 것이 좋습니다. diff단순히 파일이 다른 곳 이라고 말합니다 . 1 비트, 1 메가 바이트, 모두 동일합니다. 16 진수 차이를 검사하면 발생한 상황과 걱정할 사항이 있는지 더 잘 추정 할 수 있습니다. 또한 작업이 비디오의 너비 또는 높이를 반올림하지 않았는지 확인하십시오 (나에게 그런 일이 발생했습니다).
LSerni

1
가능한 방해 요인 중 하나는 CCIR-601에 따라 다른 Y 채널 클램핑 일 수 있습니다. 혹시 당신은 또한 참조 16 이하 및 240 위 Y-값을 잃을 것으로 보인다 있는지 확인 video.stackexchange.com/questions/16840/...
LSerni

1
ffmpeg를 사용하여 두 비디오를 개별 이미지로 재 분해하고 imagemagick을compare 사용 하여 비교할 수도 있습니다.
xenoid

1
무손실을 비교하는 좋은 방법은 해시 멀티플렉서를 사용하는 것 입니다. 의 전체 출력을 표시하십시오 ffmpeg -i RecordedData.avi. libx264rgb는 bgr24를 지원하므로 해당 인코더를 옵션으로 고려할 수 있습니다.
llogan

1
x264의 RGB 모드 (건너 뛰기 픽셀 형식 변환)를 사용하여 손실없이 인코딩하십시오.
Gyan

답변:


6

이것은 실제 문제에 대한 정답은 아니지만 FFmpeg 내부 FFV1코덱 사용을 고려할 것입니다 .

$ ffmpeg -i raw-gray.mkv -c:v ffv1 ffv1.mkv

또는 버전 3 :

$ ffmpeg -i raw-gray.mkv -c:v ffv1 -level 3 ffv1.mkv

그때:

$ ffmpeg -i ffv1.mkv -c:v rawvideo -pix_fmt gray raw-gray.yuv
$ diff -sq raw-ffv1.yuv raw-gray.yuv
Files raw-ffv1.yuv and raw-gray.yuv are identical

를 사용할 때 손실없는 모드에서 libx264만큼 효율적이지 않지만 libx264를 사용 yuv420p하는 것보다 효율적입니다 bgr24(내 테스트에서 데이터 속도는 중간에있었습니다). 의회 도서관과 같은 일부 기관은 또한 FFV1을 적절한 보존 형식 으로 인식 합니다 .


이것은 원래의 기본 질문에 대한 답변이며, 더 명확하게하기 위해 편집했습니다. FFV1에 문제가 발생하지 않았습니다. 실제로 FFV1은 -crf 0 -preset medium특정 비디오에 대해 libx264 (w / ) 와 거의 동일한 압축 비율을 달성했으며 더 빨랐습니다. 또한 gray픽셀 형식을 직접 지원 합니다. 실제로 이것은 훌륭한 솔루션 인 것 같습니다.
Nick C.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.