Résumé
Cette mise à jour résout un problème de codage de métadonnées qui entraîne la modification des fichiers de musique FLC (Free Lossless Audio Codec) si leur titre, leur artistes ou d’autres métadonnées sont modifiés.
Cause
Ce problème peut se produire lorsque les fichiers FLAC contiennent un cadre ID3 avant l’en-tête FLAC. Le cadre ID3 contient des métadonnées telles que le titre et l’artiste. Le responsable de la propriété FLAC a supposé que tous les fichiers FLAC démarrés avec le code de démarrage de 4 codés sur 4 codés sur ce nombre n’avaient pas pris en compte le cadre ID3 au début du fichier. Par conséquent, la trame ID3 serait écrasée sans que le code de début fLaC rende le fichier non lisible.
Résolution
Pour éviter ce problème pour les fichiers de musique FLC à venir, installez le 25 mai 2021 — KB5003214 (builds du système d’exploitation 19041.1013, 19042.1013 et 19043.1013) Preview.
Pour réparer les fichiers de musique 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, il 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 endommagé par Media Foundation en référence à KB5003430.
# Reportez-vous à KB5003430 pour plus d’informations
param(
[parameter(Mandatory=$true,
HelpMessage="The path to the FLAC file that has been corrupted by Media Foundation »,
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
[Chaîne]$File
)
# Nous devons récupérer le fichier en minuscules. Nous avons des erreurs
$FileDirectory = Split-Path -Resolve $File
$Filename = Split-Path -Leaf -Resolve $File
$FullPath = Join-Path -Resolve $FileDirectory $Filename
$Filename = [Chaîne]::Format(« Backup_{0:yyyyMMdd_hhmmss}_{1} », [DateTime]::Maintenant, $Filename)
$BackupLocation = Join-Path $FileDirectory $Filename
Write-Output « Outil de réparation Microsoft FLAC. Cet outil répare un fichier audio FLAC endommagé lors de la modification de ses détails. »
Write-Output « Fichier affecté : $FullPath »
Write-Output « Une sauvegarde du fichier est effectué : $BackupLocation »
Write-Output « Voulez-vous continuer ? »
$choice=$host.ui.PromptForChoice(« Résolution du script FLAC », « Voulez-vous continuer » ('&Oui', '&Non'), 1)
fonction ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
{
$blockType = $stream. ReadByte()
$lastBlock = ($blockType -shr 7) -ne 0
$blockType = $blockType-band 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()
si ($minAudioBlockSize -lt 16 -ou $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) -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 octet[] 16
$stream. Read($MD 5HashBytes, 0, $MD 5HashBytes.Length)
$MD 5Hash = [Guid]($MD 5HashBytes)
if ($sampleRate -eq 0)
{
retour $false
}
#Passage de ces vérifications signifie que nous avons probablement un en-tête d’informations de flux et que nous pouvons reconstruire le fichier
Write-Output « Informations sur le flux de fichiers »
Write-Output « Taux d’échantillonnage : $sampleRate »
Write-Output « Canaux audio : $channelCount »
Write-Output « Exemple de profondeur : $bitsPerSample »
Write-Output " Exemple de hachage audio MD5 : $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)
pendant ($stream. ReadByte() -eq 0) {}
# Nous devons maintenant déterminer l’endroit où commence un cadre de métadonnées FLAC valide
# Nous pointons probablement sur le dernier octet du membre de la taille. Nous allons donc récupérer 4 octets et réessayer.
$flacDataStartPosition = $stream. Position - 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 (Chemin d’accès test « $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.Close()
Move-Item la 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 voulez enregistrer le script PowerShell.
-
Dans la zone Nom de fichier, tapez FixFlacFiles.ps1, changez la zone Type de fichier en Documents texte (*.txt), puis cliquez sur Enregistrer.
-
Dans Windows Explorer, recherchez le script PowerShell que vous avez enregistré.
-
Cliquez avec le bouton droit sur le script, puis cliquez sur Exécuter avec PowerShell.
-
À l’invite, tapez le nom de fichier du fichier FLAC non lisible, puis appuyez sur Entrée.