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 ficheiros de música FLAC (Free Lossless Audio Codec) se tornem in reproduzidos se o seu título, artista ou outros metadados for alterado. 

Causa

Este problema pode ocorrer quando os ficheiros FLAC contêm uma moldura ID3 antes do cabeçalho FLAC. A moldura ID3 contém metadados, como o título e o artista. O alça de propriedades FLAC assumiu que todos os ficheiros FLAC iniciados com o código de início de 4 byte fLaC e que não tinha em conta a moldura ID3 no início do ficheiro. Portanto, a moldura do ID3 seria sobrecarregada sem que o código de início fLaC tornasse o ficheiro não reproduzido.

Resolução

Para evitar este problema em ficheiros de música FLAC futuros, instale a pré-visualização de 25 de maio de 2021—KB5003214 (Complicações do SO 19041.1013, 19042.1013 e 19043.1013).

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

Importante: Este script não irá restaurar os metadados perdidos que foram armazenados na moldura ID3. No entanto, faz com que o ficheiro seja reproduzido novamente.

  1. Abra o Bloco de notas.

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

    # Copyright 2021 Microsoft

    # Este script irá reparar um ficheiro FLAC danificado pela Media Foundation, em referência à KB5003430.

    # Consulte KB5003430 para obter mais informações

    parám(

    [parameter(Mandato=$true,

    HelpMessage="O caminho para o ficheiro FLAC danificado pela Media Foundation",

    ValueFromRemainingArguments=$true)]

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

    [Cadeia]$File

    )

    # Precisamos de fazer uma back-up do ficheiro atual incabeçado, detetamos quaisquer erros

    $FileDirectory = Split-Path -Resolver $File

    $Filename = Split-Path -Folha -Resolver $File

    $FullPath = Join-Path -Resolver $FileDirectory $Filename

    $Filename = [Cadeia]::Formatar("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DateTime]::Now, $Filename)

    $BackupLocation = Join-Path $FileDirectory $Filename

    Write-Output "Microsoft FLAC Repair Tool. Esta ferramenta irá reparar um ficheiro de áudio FLAC que estava danificado ao editar os detalhes."

    Write-Output "Ficheiro Afetado: $FullPath"

    Write-Output "Será feita uma cópia de segurança do ficheiro: $BackupLocation"

    Write-Output "Pretende continuar?"

    $choice=$host.ui.PromptForChoice("Fixing FLAC Script", "Do you wish to continue", ('&Yes', '&No'), 1)

    função ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)

    {

    $blockType = $stream. ReadByte()

    $lastBlock = ($blockType -shr 7) -ne 0

    $blockType = $blockType -band 0x7F

    if ($blockType -ne 0)

    {

    devolver $false

    }

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

    if ($blockSize -lt 34)

    {

    devolver $false

    }

    $minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()

    $maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()

    se ($minAudioBlockSize -lt 16 - ou $maxAudioBlockSize -lt 16)

    {

    devolver $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 5Temporte = [Guid]($MD 5HashBytes)

    if ($sampleRate -eq 0)

    {

    devolver $false

    }

    # Passing these checks means that we likely have a stream info header and can reconstru the file

    Write-Output "Informações de Fluxo de Ficheiros"

    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"

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

    enquanto ($stream. ReadByte() -eq 0) {}

    # Agora é necessário saber onde começa uma moldura de metadados FLAC válido

    # É provável que estejamos a apontar para o último byte do membro de tamanho, pelo que procuraremos 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 de início

    $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. Fechar()

    $fixedStream.Fechar()

    Move-Item -Force "$FullPath.tmp" $FullPath

    }

  3. No menu Ficheiro, clique em Guardar.

  4. Na caixa de diálogo Guardar Como, localize a pasta na qual pretende guardar o script do PowerShell.

  5. Na caixa Nome de ficheiro, escreva FixFlacFiles.ps1, altere a caixa Guardar com o tipo para Documentos de Texto (*.txt) e, em seguida, clique em Guardar.

  6. No explorador Windows, localize o script do PowerShell que guardou.

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

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

Precisa de mais ajuda?

Quer mais opções?

Explore os benefícios da subscrição, navegue em cursos de formação, saiba como proteger o seu dispositivo e muito mais.

As comunidades ajudam-no a colocar e a responder perguntas, a dar feedback e a ouvir especialistas com conhecimentos abrangentes.