KB5003430: o arquivo de música codificado em FLAC é corrompido quando os metadados são editados no Windows Explorer

Aplica-se a
Windows 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

Resumo

Essa atualização resolve um problema de codificação de metadados que faz com que os arquivos de música FLAC (Free Lossless Audio Codec) não possam ser reproduzidos se o título, o artista ou outros metadados forem alterados.

Causa

Esse problema pode ocorrer quando os arquivos FLAC contêm um quadro ID3 antes do cabeçalho FLAC. O quadro ID3 contém metadados como título e artista. O manipulador de propriedades FLAC presumiu que todos os arquivos FLAC começavam com o código inicial de 4 bytes fLaC e não levava em conta o quadro ID3 no início do arquivo. Portanto, o quadro ID3 seria substituído sem o código inicial fLaC renderizando o arquivo impossível de reproduzir.

Resolução

Para evitar esse problema em futuros arquivos de música FLAC, instale 25 de maio de 2021 — KB5003214 (Builds 19041.1013, 19042.1013 e 19043.1013 do SO) Visualização.

Para reparar arquivos de música FLAC afetados, execute o seguinte script do PowerShell.

Importante

Este script não restaurará os metadados perdidos que foram armazenados no quadro ID3. No entanto, isso torna o arquivo reproduzível novamente.

  1. Abra o Bloco de notas.

  2. Copie e cole o seguinte script no bloco de notas:

    # Copyright 2021 Microsoft
    # Este script reparará um arquivo FLAC que foi corrompido pelo Media Foundation em referência ao KB5003430.
    # Consulte KB5003430 para obter mais informações
    parâm(
    [parameter(Mandatory=$true,
    HelpMessage="O caminho para o arquivo FLAC que foi corrompido pela Media Foundation",
    ValueFromRemainingArguments=$true)]
    [ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
    [string]$File
    )
    # Precisamos fazer backup do arquivo atual caso tenhamos algum erro
    $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 "Ferramenta de Reparo do Microsoft FLAC. Esta ferramenta reparará um arquivo de áudio FLAC que foi corrompido ao editar seus detalhes."
    Write-Output "Arquivo afetado: $FullPath"
    Write-Output "Será feito um backup do arquivo: $BackupLocation"
    Write-Output "Deseja continuar?"
    $choice=$host.ui.PromptForChoice("Fixing FLAC Script", "Do you wish to continue", ('&Yes', '&No'), 1)
    function ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
    {
    $blockType = $stream. ReadByte()
    $lastBlock = ($blockType -shr 7) -ne 0
    $blockType = $blockType -band 0x7F
    if ($blockType -ne 0)
    {
    Return $false
    }
    $blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
    if ($blockSize -lt 34)
    {
    Return $false
    }
    $minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
    $maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
    if ($minAudioBlockSize -lt 16 -or $maxAudioBlockSize -lt 16)
    {
    Return $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 byte[] 16
    $stream. Read($MD 5HashBytes, 0, $MD 5HashBytes.Length)
    $MD 5Hash = [guid]($MD 5HashBytes)
    if ($sampleRate -eq 0)
    {
    Return $false
    }
    # A aprovação nessas verificações significa que provavelmente temos um cabeçalho de informações de fluxo e podemos recompilar o arquivo
    Write-Output "Informações do Stream de arquivos"
    Write-Output "Taxa de Amostragem: $sampleRate"
    Write-Output "Canais de áudio: $channelCount"
    Write-Output "Profundidade da amostra: $bitsPerSample"
    Write-Output "Hash de Exemplo de Áudio MD5: $MD 5Hash"
    return $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)
    while ($stream. ReadByte() -eq 0) {}
    # Agora precisamos descobrir onde começa um quadro de metadados FLAC válido
    # Provavelmente estamos apontando para o último byte do membro size, portanto, buscaremos novamente 4 bytes e tentaremos novamente
    $flacDataStartPosition = $stream. Posição – 4
    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
    while (-not(ParseStreamInfoMetadataBlock($stream)))
    {
    $flacDataStartPosition = $flacDataStartPosition + 1
    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
    }
    # Inserir o código inicial
    $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. No menu Arquivo, clique em Salvar.

  4. Na caixa de diálogo Salvar como , localize a pasta na qual você deseja salvar o script do PowerShell.

  5. Na caixa Nome do arquivo , digite FixFlacFiles.ps1, altere a caixa Salvar como tipo para Documentos de Texto (*.txt) e clique em Salvar.

  6. No Windows Explorer, localize o script do PowerShell que você salvou.

  7. Clique com o botão direito do mouse no script e clique em Executar com o PowerShell.

  8. Quando lhe for pedido, escreva o nome do ficheiro FLAC que não pode ser reproduzido e, em seguida, prima Enter.