Récapitulatif
Cette mise à jour résout un problème d’encodage des métadonnées selon lequel les fichiers musicaux FLAC (Free Lossless Audio Codec) deviennent injouables si leur titre, leur artiste ou d’autres métadonnées sont modifiés.
Cause
Ce problème peut se produire lorsque les fichiers FLAC contiennent une trame ID3 avant l’en-tête FLAC. Le cadre ID3 contient des métadonnées telles que le titre et l’artiste. Le gestionnaire de propriété FLAC a supposé que tous les fichiers FLAC commençaient par le code de début de 4 octets fLaC et ne prenait pas en compte la trame ID3 au début du fichier. Par conséquent, la trame ID3 serait écrasée sans que le code de démarrage fLaC ne rende le fichier illisible.
Solution
Pour éviter ce problème pour les futurs fichiers de musique FLAC, installez la préversion du 25 mai 2021 à KB5003214 (builds du système d’exploitation 19041.1013, 19042.1013 et 19043.1013).
Pour réparer les fichiers musicaux FLAC affectés, exécutez le script PowerShell suivant.
Important
Ce script ne restaure pas les métadonnées perdues qui ont été stockées dans le cadre ID3. Toutefois, cela rend le fichier à nouveau lisible.
Ouvrez le Bloc-notes.
Copiez-collez le script suivant dans le Bloc-notes :
# Copyright 2021 Microsoft
# Ce script répare un fichier FLAC qui a été endommagé par Media Foundation en référence à KB5003430.
# Reportez-vous à KB5003430 pour plus d’informations
param(
[parameter(Mandatory=$true,
HelpMessage="Le chemin d’accès au fichier FLAC qui a été endommagé par Media Foundation »,
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [String] ::IsNullOrEmpty($_) -and (Test-Path $_) })]
[chaîne]$File
)
# Nous devons sauvegarder le fichier actuel au cas où nous aurions des erreurs
$FileDirectory = Split-Path -Résoudre $File
$Filename = Split-Path -Leaf -Resolve $File
$FullPath = Join-Path -Résoudre $FileDirectory $Filename
$Filename = [string] ::Format(« Backup_{0 :yyyyMMdd_hhmmss}_{1} », [DateTime] ::Now, $Filename)
$BackupLocation = Join-Path $FileDirectory $Filename
Write-Output « Microsoft FLAC Repair Tool. Cet outil réparera un fichier audio FLAC qui a été corrompu lors de la modification de ses détails. »
Write-Output « Fichier affecté : $FullPath »
Write-Output « Une sauvegarde du fichier sera effectuée : $BackupLocation »
Write-Output « Voulez-vous continuer ? »
$choice=$host.ui.PromptForChoice(« Fixing FLAC Script », « Voulez-vous continuer », ('&Oui', '&Non'), 1)
function ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
{
$blockType = $stream. ReadByte()
$lastBlock = ($blockType -shr 7) -ne 0
$blockType = $blockType 0x7F
if ($blockType -ne 0)
{
Retour $false
}
$blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
if ($blockSize -lt 34)
{
Retour $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)
{
Retour $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) -Bande 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 octet[] 16
$stream. Read($MD 5HashBytes, 0, $MD 5HashBytes.Length)
$MD 5Hash = [Guid]($MD 5HashBytes)
if ($sampleRate -eq 0)
{
Retour $false
}
# La réussite de ces vérifications signifie que nous avons probablement un en-tête d’informations sur le flux et que nous pouvons reconstruire le fichier
Write-Output « Informations Stream fichier »
Write-Output « Taux d’échantillonnage : $sampleRate »
Write-Output « Canaux audio : $channelCount »
Write-Output « Profondeur de l’échantillon : $bitsPerSample »
Write-Output « MD5 Audio Sample Hash : $MD 5Hash »
Retour $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)
tandis que ($stream. ReadByte() -eq 0) {}
# Nous devons maintenant déterminer où commence un cadre de métadonnées FLAC valide
# Nous pointons probablement vers le dernier octet du membre de taille, nous allons donc récupérer 4 octets et réessayer
$flacDataStartPosition = $stream. Poste – 4
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin] ::Begin)
while (-not(ParseStreamInfoMetadataBlock($stream)))
{
$flacDataStartPosition = $flacDataStartPosition + 1
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin] ::Begin)
}
# Insérer le code de démarrage
$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. fermer()
$fixedStream.Fermer()
Move-Item -Force « $FullPath.tmp » $FullPath
}Dans le menu Fichier, cliquez sur Enregistrer.
Dans la boîte de dialogue Enregistrer sous , recherchez le dossier dans lequel vous souhaitez enregistrer le script PowerShell.
Dans la zone Nom du fichier , tapez FixFlacFiles.ps1, remplacez la zone Enregistrer sous par Documents texte (*.txt), puis cliquez sur Enregistrer.
Dans l’Explorateur Windows, recherchez le script PowerShell que vous avez enregistré.
Cliquez avec le bouton droit sur le script, puis cliquez sur Exécuter avec PowerShell.
Lorsque vous y êtes invité, tapez le nom du fichier FLAC non lisible, puis appuyez sur Entrée.