Applies ToWindows 10 Enterprise, version 2004 Windows 10 Home and Pro, version 2004 Windows 10 Pro, version 2004 Windows 10 Enterprise and Education, version 2004 Windows 10 Pro Education, version 2004 Windows 10 Pro for Workstations, version 2004 Windows 10 Pro, version 20H2 Windows 10 Enterprise, version 20H2 Windows 10 Enterprise and Education, version 20H2 Windows 10 Home and Pro, version 20H2 Windows 10 Pro Education, version 20H2 Windows 10 Pro for Workstations, version 20H2

요약

이 업데이트는 해당 타이틀, 아티스트 또는 기타 메타데이터가 변경된 경우 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 프레임에 저장된 손실된 메타데이터를 복원하지 않습니다. 그러나 파일을 다시 재생할 수 있도록 합니다.

  1. 메모장을 엽니다.

  2. 메모장에 다음 스크립트를 복사 및 붙여넣기합니다.

    # 저작권 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

    }

  3. 파일 메뉴에서 저장을 클릭합니다.

  4. 다른 사용자로 저장 대화 상자에서 PowerShell 스크립트를 저장할 폴더를 찾습니다.

  5. 파일 이름 상자에 FixFlacFiles.ps1입력 상자를 텍스트 문서(*.txt)로 변경한 다음 저장을클릭합니다.

  6. Windows 탐색기에서 저장한 PowerShell 스크립트를 찾습니다.

  7. 스크립트를 마우스 오른쪽 단추로 클릭한 다음 PowerShell을 사용하여 실행을 클릭합니다.

  8. 메시지가 표시될 때 재생할 수 없는 FLAC 파일의 파일 이름을 입력한 다음 Enter 를 누를 수 있습니다.

도움이 더 필요하세요?

더 많은 옵션을 원하세요?

구독 혜택을 살펴보고, 교육 과정을 찾아보고, 디바이스를 보호하는 방법 등을 알아봅니다.

커뮤니티를 통해 질문하고 답변하고, 피드백을 제공하고, 풍부한 지식을 갖춘 전문가의 의견을 들을 수 있습니다.