Resumen
Esta actualización soluciona un problema de codificación de metadatos que hace que los archivos de música de Códec de audio sin pérdida (FLAC) no se pueden reproducir si se cambia su título, artista u otros metadatos.
Causa
Este problema puede ocurrir cuando los archivos FLAC contienen un marco ID3 antes del encabezado FLAC. El marco ID3 contiene metadatos como título y artista. El controlador de propiedades FLAC supuso que todos los archivos FLAC se iniciaron con el código de inicio de 4 bytes fLaC y no tuvo en cuenta el marco ID3 al principio del archivo. Por lo tanto, el marco ID3 se sobrescribiría sin el código de inicio fLaC que hace que el archivo no se pueda jugar.
Resolución
Para evitar este problema para futuros archivos de música FLAC, instale la versión preliminar del 25 de mayo de 2021: KB5003214 (compilaciones del sistema operativo 19041.1013, 19042.1013 y 19043.1013).
Para reparar los archivos de música FLAC afectados, ejecute el siguiente script de PowerShell.
Importante: Este script no restaurará los metadatos perdidos almacenados en el marco ID3. Sin embargo, hace que el archivo se vuelva a reproducir.
-
Abra el Bloc de notas.
-
Copie y pegue el siguiente script en el bloc de notas:
# Copyright 2021 Microsoft
# Este script reparará un archivo FLAC dañado por Media Foundation en referencia a KB5003430.
# Consulte KB5003430 para obtener más información
param(
[parámetro(Obligatorio=$true,
HelpMessage="La ruta de acceso al archivo FLAC que ha sido dañada por Media Foundation",
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
[String]$File
)
# Tenemos que hacer una copia de seguridad del archivo actual en caso de que haya errores
$FileDirectory = Split-Path -Resolver $File
$Filename = Split-Path -Hoja -Resolver $File
$FullPath = Join-Path -Resolver $FileDirectory $Filename
$Filename = [String]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DateTime]::Now, $Filename)
$BackupLocation = Join-Path $FileDirectory $Filename
Write-Output "Herramienta de reparación DE MICROSOFT FLAC. Esta herramienta reparará un archivo de audio FLAC que se ha dañado al editar sus detalles".
Write-Output "Archivo afectado: $FullPath"
Write-Output "Se realizará una copia de seguridad del archivo: $BackupLocation"
Write-Output "¿Desea continuar?"
$choice=$host.ui.PromptForChoice("Fixing FLAC Script", "Do you wish to continue", ('&Yes', '&No'), 1)
función ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
{
$blockType = $stream. ReadByte()
$lastBlock = ($blockType -shr 7) -ne 0
$blockType = $blockType -band 0x7F
si ($blockType -ne 0)
{
devolver $false
}
$blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
si ($blockSize -lt 34)
{
devolver $false
}
$minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
$maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
si ($minAudioBlockSize -lt 16 -o $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 5Hash = [Guid]($MD 5HashBytes)
si ($sampleRate -eq 0)
{
devolver $false
}
# Pasar estas comprobaciones significa que es probable que disponen de un encabezado de información de transmisión y que podemos reconstruir el archivo
Write-Output "Información de transmisión de archivos"
Write-Output "Tasa de muestra: $sampleRate"
Write-Output "Canales de audio: $channelCount"
Write-Output "Profundidad de muestra: $bitsPerSample"
Write-Output "Hash de muestra de audio MD5: $MD 5Hash"
devolver $true
}
si ($choice -eq 0)
{
Copy-Item $FullPath -Destination $BackupLocation -Force
$stream = [System.IO.File]::Open($FullPath, [System.IO.FileMode]::Open)
$stream. Buscar(4, [System.IO.SeekOrigin]::Begin)
mientras ($stream. ReadByte() -eq 0) {}
# Ahora tenemos que averiguar dónde comienza un marco de metadatos FLAC válido
# Es probable que apuntemos al último byte del miembro de tamaño, por lo que volveremos a buscar 4 bytes y volveremos a intentar
$flacDataStartPosition = $stream. Posición: 4
$stream. Buscar($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
while (-not(ParseStreamInfoMetadataBlock($stream)))
{
$flacDataStartPosition = $flacDataStartPosition + 1
$stream. Buscar($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
}
# Insertar el código de inicio
$stream. Buscar($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
si (Ruta de acceso de prueba "$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. Cerrar()
$fixedStream.Close()
Move-Item -Force "$FullPath.tmp" $FullPath
}
-
En el menú Archivo haga clic en Guardar.
-
En el cuadro de diálogo Guardar como, busque la carpeta en la que desea guardar el script de PowerShell.
-
En el cuadro Nombre de archivo, escriba FixFlacFiles.ps1, cambie el cuadro Guardar como tipo a Documentos de texto (*.txt) y, a continuación, haga clic en Guardar.
-
En Windows Explorador, busque el script de PowerShell que guardó.
-
Haga clic con el botón derecho en el script y, a continuación, haga clic en Ejecutar con PowerShell.
-
Cuando se le solicite, escriba el nombre de archivo del archivo FLAC que no se puede jugar y, después, presione Entrar.