Applies ToWindows 10 Enterprise, version 2004 Windows 10 Home and Pro, version 2004 Windows 10 Pro, version 2004 Windows 10 Enterprise and Education, version 2004 Windows 10 Pro Education, version 2004 Windows 10 Pro for Workstations, version 2004 Windows 10 Pro, version 20H2 Windows 10 Enterprise, version 20H2 Windows 10 Enterprise and Education, version 20H2 Windows 10 Home and Pro, version 20H2 Windows 10 Pro Education, version 20H2 Windows 10 Pro for Workstations, version 20H2

Riepilogo

Questo aggiornamento risolve un problema di codifica dei metadati che causa la non riproduzione dei file musicali FLAC (Free Lossless Audio Codec) se il titolo, l'artista o altri metadati vengono modificati. 

Causa

Questo problema può 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 iniziano con il codice di avvio a 4 byte fLaC e non prendeva in considerazione il frame ID3 all'inizio del file. Di conseguenza, il frame ID3 verrebbe sovrascritto senza il codice di avvio fLaC che renderi il file non riproducibile.

Risoluzione

Per evitare questo problema per i futuri file musicali FLAC, installare il 25 maggio 2021- KB5003214 (build del sistema operativo 19041.1013, 19042.1013 e 19043.1013) Preview.

Per ripristinare i file musicali FLAC interessati, eseguire lo script di PowerShell seguente.

Importante: Questo script non ripristina i metadati persi archiviati nel frame ID3. Tuttavia, rende nuovamente riproducibile il file.

  1. Aprire il Blocco note.

  2. Copiare e incollare lo script seguente nel Blocco note:

    # Copyright 2021 Microsoft

    # Questo script ripristina un file FLAC danneggiato da Media Foundation in riferimento a KB5003430.

    # Per altre informazioni, vedere KB5003430

    param(

    [parametro(Obbligatorio=$true;

    HelpMessage="Percorso del file FLAC danneggiato da Media Foundation",

    ValueFromRemainingArguments=$true)]

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

    [String]$File

    )

    # È necessario eseguire il backup del file corrente in caso di errori

    $FileDirectory = Split-Path -Resolve $File

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

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

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

    $BackupLocation = Join-Path $FileDirectory $Filename

    Write-Output "Strumento di ripristino MICROSOFT FLAC. Questo strumento ripristina un file audio FLAC danneggiato durante la modifica dei dettagli".

    Write-Output "File interessato: $FullPath"

    Write-Output "Verrà eseguito un backup del file: $BackupLocation"

    Write-Output "Vuoi continuare?"

    $choice=$host.ui.PromptForChoice("Correzione dello script FLAC", "Vuoi continuare", ('&Sì', '&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)

    {

    restituis $false

    }

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

    if ($blockSize -lt 34)

    {

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

    {

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

    if ($sampleRate -eq 0)

    {

    restituis $false

    }

    # Se si superano questi controlli, è probabile che si abbia un'intestazione di informazioni sul flusso e che sia possibile ricostruire il file

    Write-Output "Informazioni flusso file"

    Write-Output "Frequenza campione: $sampleRate"

    Write-Output "Canali audio: $channelCount"

    Write-Output "Profondità campione: $bitsPerSample"

    Write-Output "Hash di esempio audio MD5: $MD 5Hash"

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

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

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

    # È probabile che puntiamo all'ultimo byte del membro di dimensioni, quindi ti chiederemo 4 byte e riprova

    $flacDataStartPosition = $stream. Posizione - 4

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

    while (-not(ParseStreamInfoMetadataBlock($stream)))

    {

    $flacDataStartPosition = $flacDataStartPosition + 1

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

    }

    # Inserire il codice di inizio

    $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. Chiudi()

    $fixedStream.Close()

    Move-Item -Force "$FullPath.tmp" $FullPath

    }

  3. Scegliere Salva dal menu File.

  4. Nella finestra di dialogo Salva con nome individuare la cartella in cui si vuole salvare lo script di PowerShell.

  5. Nella casella Nome file digitare FixFlacFiles.ps1, modificare la casella Tipo file in Documenti di testo (*.txt) e quindi fare clic su Salva.

  6. In Windows Explorer individuare lo script di PowerShell salvato.

  7. Fare clic con il pulsante destro del mouse su uno script e quindi scegliere Esegui con PowerShell.

  8. Quando richiesto, digitare il nome file del file FLAC non riproducibile e quindi premere INVIO.

Serve aiuto?

Vuoi altre opzioni?

Esplorare i vantaggi dell'abbonamento e i corsi di formazione, scoprire come proteggere il dispositivo e molto altro ancora.

Le community aiutano a porre e a rispondere alle domande, a fornire feedback e ad ascoltare gli esperti con approfondite conoscenze.