Microsoft로 로그인
로그인하거나 계정을 만듭니다.
안녕하세요.
다른 계정을 선택합니다.
계정이 여러 개 있음
로그인할 계정을 선택합니다.

요약

이 업데이트는 해당 타이틀, 아티스트 또는 기타 메타데이터가 변경된 경우 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 를 누를 수 있습니다.

도움이 더 필요하세요?

더 많은 옵션을 원하세요?

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

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

이 정보가 유용한가요?

언어 품질에 얼마나 만족하시나요?
사용 경험에 어떠한 영향을 주었나요?
제출을 누르면 피드백이 Microsoft 제품과 서비스를 개선하는 데 사용됩니다. IT 관리자는 이 데이터를 수집할 수 있습니다. 개인정보처리방침

의견 주셔서 감사합니다!

×