Microsoft ha comunicato di aver corretto un bug nella codifica dei file musica .FLAC che si corrompono dopo averli modificati.

Fix bug file .FLAC corrotti

Con il rilascio dell’ultimo aggiornamento cumulativo di maggio, Microsoft ha risolto un problema di codifica dei metadati che causa l’impossibilità di riprodurre i file musicali Free Lossless Audio Codec (FLAC) se si modifica il titolo, l’artista o altri metadati.

Questo problema potrebbe verificarsi quando i file FLAC contengono un frame ID3 prima dell’intestazione FLAC. Il frame ID3 contiene metadati come titolo e artista. Il gestore della proprietà FLAC presupponeva che tutti i file FLAC iniziassero con il codice di inizio a 4 byte FLAC e non tenesse conto del frame ID3 all’inizio del file. Pertanto, il frame ID3 verrebbe sovrascritto senza che il codice di avvio FLAC rendesse il file non riproducibile.

Sebbene il problema sia stato risolto, Microsoft ha offerto una soluzione per i file corrotti, per renderli nuovamente riproducibili.

  1. Apri Blocco note.
  2. Copia e incolla il seguente script nel blocco note:

# Copyright 2021 Microsoft

# Questo script riparerà un file FLAC che è stato danneggiato da Media Foundation in riferimento a KB5003430.

# Fare riferimento a KB5003430 per ulteriori informazioni

param (

[parametro (obbligatorio = $ true,

HelpMessage = “Il percorso del file FLAC che è stato danneggiato da Media Foundation”,

ValueFromRemainingArguments = $ true)]

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

[Stringa] $ File

)

# Dobbiamo eseguire il backup del file corrente in caso di errori

$ FileDirectory = Split-Path -Risolvi $ File

$ Filename = Split-Path -Leaf -Resolve $ File

$ FullPath = Join-Path -Resolve $ FileDirectory $ Nomefile

$ Filename = [String] :: Format (“Backup_ {0: yyyyMMdd_hhmmss} _ {1}”, [DateTime] :: Now, $ Filename)

$ BackupLocation = Join-Path $ FileDirectory $ Nome file

Scrittura di output “Strumento di riparazione FLAC Microsoft. Questo strumento riparerà un file audio FLAC danneggiato durante la modifica dei dettagli”.

Output di scrittura “File interessato: $ FullPath”

Write-Output “Verrà effettuato un backup del file: $ BackupLocation”

Uscita di scrittura “Continuare?”

$ choice = $ host.ui.PromptForChoice (“Fixing FLAC Script”, “Do you wish to continue”, (‘& Yes’, ‘& No’), 1)

funzione ParseStreamInfoMetadataBlock ([System.IO.FileStream] $ stream)

{

$ blockType = $ stream.ReadByte ()

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

$ blockType = $ blockType -band 0x7F

if ($ blockType -ne 0)

{

restituire $ false

}

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

if ($ blockSize -lt 34)

{

restituire $ false

}

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

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

if ($ minAudioBlockSize -lt 16 -o $ maxAudioBlockSize -lt 16)

{

restituire $ 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

$ MD5HashBytes = New-Object byte [] 16

$ stream.Read ($ MD5HashBytes, 0, $ MD5HashBytes.Length)

$ MD5Hash = [Guid] ($ MD5HashBytes)

if ($ sampleRate -eq 0)

{

restituire $ false

}

# Il superamento di questi controlli significa che probabilmente abbiamo un’intestazione delle informazioni sul flusso e possiamo ricostruire il file

Scrittura di output “Informazioni flusso di file”

Uscita in scrittura “Frequenza di campionamento: $ sampleRate”

Uscita in scrittura “Canali audio: $ channelCount”

Uscita di scrittura “Profondità campione: $ bitsPerSample”

Uscita in scrittura “Hash di esempio audio MD5: $ MD5Hash”

restituire $ true

}

if ($ scelta -eq 0)

{

Copia elemento $ FullPath -Destination $ BackupLocation -Force

$ stream = [System.IO.File] :: Open ($ FullPath, [System.IO.FileMode] :: Open)

$ stream.Seek (4, [System.IO.SeekOrigin] :: Begin)

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

# Ora dobbiamo capire dove inizia un frame di metadati FLAC valido

# Probabilmente stiamo puntando all’ultimo byte del membro size, quindi ricercheremo 4 byte e riproveremo

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

}

# Inserisci il codice di inizio

$ stream.Seek ($ flacDataStartPosition, [System.IO.SeekOrigin] :: Begin)

if (Test-Path “$ FullPath.tmp”)

{

Rimuovi elemento “$ 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.Close ()

$ fixedStream.Close ()

Move-Item -Force “$ FullPath.tmp” $ FullPath

}

  1. Nel menu File, fai click su Salva.
  2. Nella finestra di dialogo Salva con nome individuare la cartella in cui si desidera salvare lo script di PowerShell.
  3. Nella casella Nome file, digitare FixFlacFiles.ps1, modificare la casella Tipo file in Documenti di testo (*.txt) e quindi fare click su Salva.
  4. In Esplora risorse, individua lo script di PowerShell che hai salvato.
  5. Fai click con il pulsante destro del mouse sullo script e quindi fai click su Esegui con PowerShell.
  6. Quando richiesto, digita il nome del file FLAC non riproducibile, quindi premi Invio.

Avete notato anche voi questo bug dei file .FLAC? Avete risolto? Fatecelo sapere nei commenti.

Articolo di Windows Blog Italia