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

Resumo

Esta atualização aborda um problema de codificação de metadados que faz com que os arquivos de música do FLAC (Free Lossless Audio Codec) se tornem imbatíveis se o título, o artista ou outros metadados for alterado. 

Causa

Esse problema pode ocorrer quando os arquivos FLAC contêm um quadro ID3 antes do header FLAC. O quadro ID3 contém metadados, como título e artista. O manipulador de propriedades FLAC presumiu que todos os arquivos FLAC iniciados com o código de início de 4 byte fLaC e não levam em conta o quadro ID3 no início do arquivo. Portanto, o quadro ID3 seria substituído sem o fLaC do código inicial, tornando o arquivo imprável.

Resolução

Para evitar esse problema para arquivos de música FLAC futuros, instale 25 de maio de 2021 — KB5003214 (Builds 19041.1013, 19042.1013 e 19043.1013) Preview.

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

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

  1. Abra o Bloco de notas.

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

    # Copyright 2021 Microsoft

    # Este script reparará um arquivo FLAC corrompido pelo Media Foundation em referência ao KB5003430.

    # Consulte KB5003430 para obter mais informações

    param(

    [parameter(Mandatory=$true,

    HelpMessage="O caminho para o arquivo FLAC que foi corrompido pelo Media Foundation",

    ValueFromRemainingArguments=$true)]

    [ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]

    [String]$File

    )

    # Precisamos fazer o back up do arquivo atual em caso de erros

    $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]::Agora, $Filename)

    $BackupLocation = Join-Path $FileDirectory $Filename

    Write-Output "Ferramenta de Reparo do Microsoft FLAC. Essa ferramenta reparará um arquivo de áudio FLAC corrompido ao editar seus detalhes."

    Write-Output "Arquivo Afetado: $FullPath"

    Write-Output "Um backup do arquivo será feito: $BackupLocation"

    Write-Output "Deseja continuar?"

    $choice=$host.ui.PromptForChoice("Fixing FLAC Script", "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)

    {

    retornar $false

    }

    $blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())

    if ($blockSize -lt 34)

    {

    retornar $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)

    {

    retornar $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)

    {

    retornar $false

    }

    # Passar essas verificações significa que provavelmente temos um header de informações de fluxo e pode recriar o arquivo

    Write-Output "Informações de fluxo de arquivos"

    Write-Output "Taxa de Exemplo: $sampleRate"

    Write-Output "Canais de áudio: $channelCount"

    Write-Output "Profundidade de Exemplo: $bitsPerSample"

    Write-Output "Hash de exemplo de áudio MD5: $MD 5Hash"

    retornar $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

    # Estamos provavelmente apontando para o último byte do membro de tamanho, então vamos buscar 4 bytes e repetir

    $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, digiteFixFlacFiles.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 solicitado, digite o nome do arquivo do arquivo FLAC nãoplayable e pressione Enter.

Precisa de mais ajuda?

Quer mais opções

Explore os benefícios da assinatura, procure cursos de treinamento, saiba como proteger seu dispositivo e muito mais.

As comunidades ajudam você a fazer e responder perguntas, fazer comentários e ouvir especialistas com conhecimento avançado.