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.
-
Abra o Bloco de notas.
-
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
}
-
No menu Ficheiro, clique em Guardar.
-
Na caixa de diálogo Guardar Como, localize a pasta na qual pretende guardar o script do PowerShell.
-
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.
-
No explorador Windows, localize o script do PowerShell que guardou.
-
Clique com o botão direito do rato no script e, em seguida, clique em Executar com o PowerShell.
-
Quando lhe for pedido, escreva o nome de ficheiro do ficheiro FLAC não reproduzido e, em seguida, prima Enter.