KB5003430: Το κωδικοποιημένο αρχείο μουσικής FLAC καταστρέφεται κατά την επεξεργασία μετα-δεδομένων στην Εξερεύνηση των Windows

Ισχύει για
Windows 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

Περίληψη

Αυτή η ενημέρωση αντιμετωπίζει ένα πρόβλημα κωδικοποίησης μετα-δεδομένων εξαιτίας του οποίου δεν είναι δυνατή η αναπαραγωγή των αρχείων μουσικής Free Lossless Audio Codec (FLAC), αν αλλάξει ο τίτλος, ο καλλιτέχνης ή άλλα μετα-δεδομένα τους.

Αιτία

Αυτό το πρόβλημα ενδέχεται να παρουσιαστεί όταν τα αρχεία FLAC περιέχουν ένα πλαίσιο ID3 πριν από την κεφαλίδα FLAC. Το πλαίσιο ID3 περιέχει μετα-δεδομένα, όπως τίτλο και καλλιτέχνη. Ο χειριστής ιδιοτήτων FLAC υπέθεσε ότι όλα τα αρχεία FLAC ξεκίνησαν με τον κωδικό εκκίνησης 4 byte fLaC και δεν έλαβαν υπόψη το πλαίσιο ID3 στην αρχή του αρχείου. Επομένως, το πλαίσιο ID3 θα αντικατασταθεί χωρίς ο κωδικός εκκίνησης fLaC να καταστήσει το αρχείο μη αναπαραγώγιμο.

Επίλυση

Για να αποτρέψετε αυτό το πρόβλημα για μελλοντικά αρχεία μουσικής FLAC, εγκαταστήστε την προεπισκόπηση της 25ης Μαΐου 2021—KB5003214 (Δομές λειτουργικού συστήματος 19041.1013, 19042.1013 και 19043.1013).

Για να επιδιορθώσετε τα επηρεαζόμενα αρχεία μουσικής FLAC, εκτελέστε την ακόλουθη δέσμη ενεργειών PowerShell.

Σημαντικό

Αυτή η δέσμη ενεργειών δεν θα επαναφέρει τα χαμένα μετα-δεδομένα που ήταν αποθηκευμένα στο πλαίσιο ID3. Ωστόσο, καθιστά δυνατή την αναπαραγωγή του αρχείου ξανά.

  1. Ανοίξτε το Σημειωματάριο.

  2. Αντιγράψτε και επικολλήστε την ακόλουθη δέσμη ενεργειών στο σημειωματάριο:

    # Πνευματικά δικαιώματα 2021 Microsoft
    # Αυτό το σενάριο θα επιδιορθώσει ένα αρχείο FLAC που έχει καταστραφεί από το Media Foundation σε σχέση με KB5003430.
    # Ανατρέξτε στην KB5003430 για περισσότερες πληροφορίες
    παράμετρος(
    [παράμετρος(Υποχρεωτικό=$true,
    HelpMessage="Η διαδρομή προς το αρχείο FLAC που έχει καταστραφεί από το Media Foundation",
    ValueFromRemainingArguments=$true)]
    [ValidateScript({ -not [Συμβολοσειρά]::IsNullOrEmpty($_) -and (Test-Path $_) })]
    [Συμβολοσειρά]$File
    )
    # Πρέπει να δημιουργήσουμε αντίγραφα ασφαλείας του τρέχοντος αρχείου incase έχουμε τυχόν σφάλματα
    $FileDirectory = Split-Path -Επίλυση $File
    $Filename = Split-Path -leaf -resolve $File
    $FullPath = Join-Path -Επίλυση $FileDirectory $Filename
    $Filename = [Συμβολοσειρά]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DateTime]::Now, $Filename)
    $BackupLocation = Join-Path $FileDirectory $Filename
    Write-Output "Εργαλείο επιδιόρθωσης Microsoft FLAC. Αυτό το εργαλείο θα επιδιορθώσει ένα αρχείο ήχου FLAC που ήταν κατεστραμμένο κατά την επεξεργασία των λεπτομερειών του.
    Write-Output "Αρχείο που επηρεάζεται: $FullPath"
    Write-Output "Θα δημιουργηθεί αντίγραφο ασφαλείας του αρχείου: $BackupLocation"
    Write-Output "Θέλετε να συνεχίσετε;"
    $choice=$host.ui.PromptForChoice("Διόρθωση δέσμης ενεργειών FLAC", "Θέλετε να συνεχίσετε", ('&Ναι', '&Όχι'), 1)
    συνάρτηση ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
    {
    $blockType = $stream. ReadByte()
    $lastBlock = ($blockType -shr 7) -ne 0
    $blockType = $blockType 0x7F ζώνης
    if ($blockType -ne 0)
    {
    επιστροφή $false
    }
    $blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
    IF ($blockSize -lt 34)
    {
    επιστροφή $false
    }
    $minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
    $maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
    IF ($minAudioBlockSize -lt 16 - ή $maxAudioBlockSize -lt 16)
    {
    επιστροφή $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) -ζώνη 0x7) + 1
    $bitsPerSample = (($sampleInfo -shr 4) -ζώνη 0x1F) + 1
    [UInt64]$sampleCount = (($stream. ReadByte() -shl 24) -bor ($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
    $sampleCount = (([UInt64]$sampleInfo -ζώνη 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)
    {
    επιστροφή $false
    }
    # Περνώντας αυτούς τους ελέγχους σημαίνει ότι πιθανότατα έχουμε μια κεφαλίδα πληροφοριών ροής και μπορούμε να ξαναχτίσουμε το αρχείο
    Write-Output "Πληροφορίες Stream αρχείου"
    Write-Output "Ρυθμός δειγματοληψίας: $sampleRate"
    Write-Output "Κανάλια ήχου: $channelCount"
    Write-Output "Βάθος δείγματος: $bitsPerSample"
    Write-Output "MD5 Audio Sample Hash: $MD 5Hash"
    επιστροφή $true
    }
    IF ($choice -EQ 0)
    {
    Copy-Item $FullPath -Προορισμός $BackupLocation -Επιβολή
    $stream = [System.IO.File]::Open($FullPath, [System.IO.FileMode]::Open)
    $stream. Seek(4, [System.IO.SeekOrigin]::Begin)
    ενώ ($stream. ReadByte() -eq 0) {}
    # Τώρα πρέπει να καταλάβουμε πού αρχίζει ένα έγκυρο πλαίσιο μεταδεδομένων FLAC
    # Πιθανότατα δείχνουμε το τελευταίο byte του μέλους μεγέθους, οπότε θα αναζητήσουμε πίσω 4 byte και θα προσπαθήσουμε ξανά
    $flacDataStartPosition = $stream. Θέση - 4
    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
    ενώ (-not(ParseStreamInfoMetadataBlock($stream)))
    {
    $flacDataStartPosition = $flacDataStartPosition + 1
    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
    }
    # Εισαγάγετε τον κωδικό έναρξης
    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
    if (διαδρομή δοκιμής "$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.Μήκος)
    $stream. CopyTo($fixedStream)
    $stream. Κλείσιμο()
    $fixedStream.Close()
    Move-Item -Force "$FullPath.tmp" $FullPath
    }
  3. Στο μενού Αρχείο, κάντε κλικ στην επιλογή Αποθήκευση.

  4. Στο παράθυρο διαλόγου Αποθήκευση ως , εντοπίστε το φάκελο στον οποίο θέλετε να αποθηκεύσετε τη δέσμη ενεργειών PowerShell.

  5. Στο πλαίσιο Όνομα αρχείου , πληκτρολογήστε FixFlacFiles.ps1, αλλάξτε το πλαίσιο Αποθήκευση ως τύπουσε Έγγραφα κειμένου (*.txt) και, στη συνέχεια, κάντε κλικ στο κουμπί Αποθήκευση.

  6. Στην Εξερεύνηση των Windows, εντοπίστε τη δέσμη ενεργειών του PowerShell που έχετε αποθηκεύσει.

  7. Κάντε δεξί κλικ στη δέσμη ενεργειών και, στη συνέχεια, κάντε κλικ στην εντολή Εκτέλεση με το PowerShell.

  8. Όταν σας ζητηθεί, πληκτρολογήστε το όνομα αρχείου του αρχείου FLAC χωρίς δυνατότητα αναπαραγωγής και, στη συνέχεια, πατήστε το πλήκτρο Enter.