요약
이 업데이트는 해당 타이틀, 아티스트 또는 기타 메타데이터가 변경된 경우 FLAC(무료 무손실 오디오 코덱) 음악 파일을 재생할 수 없는 메타데이터 인코딩 문제를 해결합니다.
원인
FLAC 파일에 FLAC 헤더 앞에 ID3 프레임이 포함된 경우 이 문제가 발생할 수 있습니다. ID3 프레임에는 타이틀 및 아티스트와 같은 메타데이터가 포함되어 있습니다. FLAC 속성 처리기에서는 모든 FLAC 파일이 4비트 시작 코드 fLaC로 시작하고 파일 시작 시 ID3 프레임을 고려하지 않았다고 가정했습니다. 따라서 시작 코드 fLaC가 파일을 재생할 수 없는 렌더링하지 않고 ID3 프레임을 덮어 니다.
해결 방법
향후 FLAC 음악 파일에 대해 이 문제를 방지하려면 2021년 5월 25일-KB5003214(OS 빌드 19041.1013, 19043.1013) 미리 보기 를설치합니다.
영향을 받는 FLAC 음악 파일을 복구하려면 다음 PowerShell 스크립트를 실행합니다.
중요: 이 스크립트는 ID3 프레임에 저장된 손실된 메타데이터를 복원하지 않습니다. 그러나 파일을 다시 재생할 수 있도록 합니다.
-
메모장을 엽니다.
-
메모장에 다음 스크립트를 복사 및 붙여넣기합니다.
# 저작권 2021 Microsoft
# 이 스크립트는 KB5003430을 참조하여 Media Foundation에서 손상된 FLAC 파일을 복구합니다.
# 자세한 내용은 KB5003430을 참조하세요.
param(
[매개 변수(Mandatory=$true,
HelpMessage="Media Foundation에 의해 손상된 FLAC 파일의 경로",
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [String]:::IsNullOrEmpty($_) -and (Test-Path $_) })]
[String]$File
)
# 오류가 있는 현재 파일 인카이프를 백업해야 합니다.
$FileDirectory = Split-Path -Resolve $File
$Filename = Split-Path -leaf -Resolve $File
$FullPath = Join-Path -Resolve $FileDirectory $Filename
$Filename = [String]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DateTime]::Now, $Filename)
$BackupLocation = Join-Path $FileDirectory $Filename
Write-Output "Microsoft FLAC 복구 도구"를 사용합니다. 이 도구는 세부 정보를 편집할 때 손상된 FLAC 오디오 파일을 복구합니다."
Write-Output "영향을 받는 파일: $FullPath"
Write-Output "파일의 백업이 수행됩니다. $BackupLocation"
Write-Output "계속하고 싶은가요?"
$choice=$host.ui.PromptForChoice("FLAC 스크립트 수정", "계속하고 싶은가", ('&예', '&아니요'), 1)
function ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
{
$blockType = $stream. ReadByte()
$lastBlock = ($blockType -shr 7) -ne 0
$blockType = $blockType -band 0x7F
if($blockType -ne 0)
{
반환 $false
}
$blockSize = (($stream. ReadByte() -shl 16) -bor($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
if($blockSize -lt 34)
{
반환 $false
}
$minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
$maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
($minAudioBlockSize -lt 16 -또는 $maxAudioBlockSize -lt 16)
{
반환 $false
}
$minFrameSize = (($stream. ReadByte() -shl 16) -bor($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
$maxFrameSize = (($stream. ReadByte() -shl 16) -bor($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
$sampleInfo = (($stream. ReadByte() -shl 24) -bor($stream. ReadByte() -shl 16) -bor($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
$sampleRate = $sampleInfo -shr 12
$channelCount = (($sampleInfo -shr 9) -band 0x7) + 1
$bitsPerSample = (($sampleInfo -shr 4) -band 0x1F) + 1
[UInt64]$sampleCount = ($stream. ReadByte() -shl 24) -bor($stream. ReadByte() -shl 16) -bor($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
$sampleCount = (([UInt64]$sampleInfo -band 0xF) -shl 32) -bor $sampleCount
$MD 5HashBytes = New-Object바이트[] 16
$stream. Read($MD 5HashBytes, 0, $MD 5HashBytes.Length)
$MD 5Hash = [Guid]($MD 5HashBytes)
if($sampleRate -eq 0)
{
반환 $false
}
# 이러한 확인을 전달하면 스트림 정보 헤더가 있을 수 있으며 파일을 다시빌 수 있습니다.
Write-Output "파일 스트림 정보"
Write-Output "샘플 속도: $sampleRate"
Write-Output "오디오 채널: $channelCount"
Write-Output "샘플 깊이: $bitsPerSample"
Write-Output "MD5 오디오 샘플 해시: $MD 5Hash"
반환 $true
}
if($choice -eq 0)
{
Copy-Item $FullPath -destination $BackupLocation -Force
$stream = [System.IO.File]::open($FullPath, [System.IO.FileMode]::Open)
$stream. Seek(4, [System.IO.SeekOrigin]::Begin)
($stream. ReadByte() -eq 0) {}
# 이제 유효한 FLAC 메타데이터 프레임이 시작되는 위치를 알아내야 합니다.
# 크기 멤버의 마지막 byte를 지적할 수 있으므로 4비트 및 다시 시도를 다시 시도합니다.
$flacDataStartPosition = $stream. 위치 - 4
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
while(-not(ParseStreamInfoMetadataBlock($stream))
{
$flacDataStartPosition = $flacDataStartPosition + 1
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
}
# 시작 코드 삽입
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
if(Test-Path "$FullPath.tmp")
{
Remove-Item "$FullPath.tmp"
}
$fixedStream = [System.IO.File]::Open("$FullPath.tmp", [System.IO.FileMode]::CreateNew)
[byte[]]$startCode = [char[]]('f', 'L', 'a', 'C');
$fixedStream.Write($startCode, 0, $startCode.length)
$stream. CopyTo($fixedStream)
$stream. Close()
$fixedStream.Close()
Move-Item -Force "$FullPath.tmp" $FullPath
}
-
파일 메뉴에서 저장을 클릭합니다.
-
다른 사용자로 저장 대화 상자에서 PowerShell 스크립트를 저장할 폴더를 찾습니다.
-
파일 이름 상자에 FixFlacFiles.ps1입력 상자를 텍스트 문서(*.txt)로 변경한 다음 저장을클릭합니다.
-
Windows 탐색기에서 저장한 PowerShell 스크립트를 찾습니다.
-
스크립트를 마우스 오른쪽 단추로 클릭한 다음 PowerShell을 사용하여 실행을 클릭합니다.
-
메시지가 표시될 때 재생할 수 없는 FLAC 파일의 파일 이름을 입력한 다음 Enter 를 누를 수 있습니다.