ffmpeg Framemd5 - LPCM과 FLAC 간에 체크섬을 일치시키려면 어떻게 해야 합니까?

ffmpeg Framemd5 - LPCM과 FLAC 간에 체크섬을 일치시키려면 어떻게 해야 합니까?

품질 저하 없이 저장 공간을 절약하기 위해 MKV를 컨테이너로 사용하여 무손실 압축된 비디오 및 오디오 파일(Utvideo/LCPM)을 FFV1/FLAC 코덱으로 변환하고 있습니다. 저는 각 변환이 출력 측면에서 원본 캡처와 1:1이 되도록 ffmpeg의 framemd5 기능을 사용하고 있습니다.

배치 스크립트는 다음과 같습니다.

for %%a in ("*.avi") do ffmpeg -i "%%a" -f framemd5 "%%~na.framemd5"

그러나 FLAC를 오디오 코덱으로 사용하면 Framemd5 출력의 오디오 부분이 더 이상 일치하지 않습니다.

다음은 샘플 녹음의framemd5의 처음 1001줄입니다.

https://pastebin.com/axcf3f0a원본 LPCM

https://pastebin.com/3n75YTMjFLAC 변환

문제는 그 것 같네요FLAC은 추가 메타데이터와 자체 체크섬을 추가합니다., 오디오가 1:1로 추정되지만, framemd5는 이를 인식하지 못합니다. 저는 FLAC의 파일 구조에 대해 잘 알지 못하기 때문에 직접 확인하거나 해결 방법을 찾을 수 없습니다.

어쨌든 이것을 조정할 수 있습니까? Utvideo/LPCM과 FFV1/FLAC 사이의 비디오와 오디오를 모두 1:1로 체크섬하는 Framemd5 파일을 만들 수 있나요?

이것은 매우 실망스럽습니다. 이미 가능한 한 많은 공간을 절약하려고 노력하고 있으므로 FLAC를 사용하여 오디오를 압축하고 싶습니다.

답변1

이는 FLAC 스트림의 메타데이터와 관련이 없습니다.

ffmpeg-all프레임해시에(framemd5는 프레임해시(framehash)의 변형입니다):

기본적으로 오디오 프레임은 해시를 계산하기 전에 서명된 16비트 원시 오디오로 변환되고 비디오 프레임은 원시 비디오로 변환됩니다.

(참고: 비트 심도가 더 높은 경우 해당하는 비트 심도를 지정해야 합니다.인코더, 예를 들어-c:a pcm_s24le ~ 후에 -f framemd5"잘린" 오디오 프레임에서 체크섬이 수행되는 것을 방지하기 위해 "A와 B"의 경우 모두.)

따라서 체크섬은 -c copy. 따라서 메타데이터는 여기서 해싱을 "간섭"하지 않습니다.

여기서 문제의 실제 원인은 비디오의 경우와 달리 오디오 스트림에 적용될 때 여기의 "프레임"이 단일 샘플을 참조하는 것이 아니라 패킷으로 그룹화되는 전체 샘플을 참조한다는 것입니다. 패킷은 인코더/먹서(해당 코드의 기본값) 및 사용자 설정에 따라 서로 다른 크기(샘플 수)를 가질 수 있습니다.

출력 라인에서 볼 수 있듯이 입력 오디오 스트림의 각 패킷에는 PCM의 경우 1024개의 샘플이 있는 반면 FLAC의 경우 각 패킷에는 4608개의 샘플이 있습니다.

TL;DR. 여기서 해결 방법은 "압축 버전"을 인코딩할 때 -frame_size 1024뒤에 추가하는 것입니다 .-c:a flac

PS 어떤 경우에도 FLAC 스트림의 프레임/패킷 크기를 변경하면 문제(예: 재생)/원치 않는 부작용이 발생할 수 있는지 여부는 알 수 없으며 FLAC 스트림의 프레임/패킷 크기를 변경할 수 있는지 여부가 궁금할 수 있습니다. 대신 PCM 스트림을 사용하세요. 내가 말할 수 있는 것은 PCM의 경우 FLAC의 경우와 같은 인코더 레벨이 아닌 먹서 레벨이 될 것이라는 것입니다. 이는 사용자가 구성할 수 없을 가능성이 어느 정도 있음을 의미합니다 .

도움이 될 수도 있고 그렇지 않을 수도 있지만, 관련 프로세스가 다를 수 있으므로 Matroska 파일을 다시 다중화하는 대신 원시 스트림 파일 또는 PCM인 경우 WAVE/AIFF 파일에서 항상 다른 Matroska와 다중화를 시도할 수 있습니다. 1024FLAC에 사용할 때 ffmpeg의 PCM-in-Matroksa 패킷/프레임 크기(예: )가 제대로 작동하지 않는 경우 muxer입니다 .

업데이트: 분명히 WAVE 파일을 입력으로 사용하면 다음을 사용할 수 있습니다.-max_size 디먹서(WAVE dexmuer의) 옵션을 사용하여 스트림이 Matrokska muxer에 공급될 때 각 패킷의 크기를 결정합니다. -max_size하지만 샘플 대신 바이트 단위 입니다. 따라서 이 경우 다음과 같은 것을 사용할 수 있습니다 ffmpeg ... -max_size 9216 -i path/to/input.wav ....-max_size ~ 전에 -i). 원시 PCM 디먹서(예: )에서 유사한 옵션을 사용할 수 없는 것 같으므로 s16le이 옵션을 대신 사용해야 하는 경우 먼저 입력 오디오 파일을 WAVE 파일로 만들어야 합니다.

참조. (기본값 코드의 위치):
https://github.com/FFmpeg/FFmpeg/blob/n5.1.2/libavcodec/flacenc.c#L314
https://github.com/FFmpeg/FFmpeg/blob/n5.1.2/libavformat/pcm.c#L27
https://github.com/FFmpeg/FFmpeg/blob/n5.1.2/libavformat/wavdec.c#L76

관련 정보