Σύνοψη
Αυτή η ενημέρωση αντιμετωπίζει ένα πρόβλημα κωδικοποίησης μετα-δεδομένων που έχει ως αποτέλεσμα τα αρχεία μουσικής 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. Ωστόσο, κάνει ξανά δυνατή την αναπαραγωγή του αρχείου.
-
Ανοίξτε το Σημειωματάριο.
-
Αντιγράψτε και επικολλήστε την ακόλουθη δέσμη ενεργειών στο σημειωματάριο:
# Copyright 2021 Microsoft
# Αυτή η δέσμη ενεργειών θα επιδιορθώσει ένα αρχείο FLAC που έχει καταστραφεί από το Media Foundation σε αναφορά στο KB5003430.
# Ανατρέξτε στο KB5003430 για περισσότερες πληροφορίες
param(
[parameter(Mandatory=$true;
HelpMessage="Η διαδρομή προς το αρχείο FLAC που έχει καταστραφεί από το Media Foundation",
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [Συμβολοσειρά]::IsNullOrEmpty($_) -and (Test-Path $_) })]
[Συμβολοσειρά]$File
)
# We need to back up the current file incase we have any errors
$FileDirectory = Split-Path -Επίλυση $File
$Filename = Split-Path -Φύλλο -Επίλυση $File
$FullPath = Join-Path -Επίλυση $FileDirectory $Filename
$Filename = [Συμβολοσειρά]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DateTime]::Now, $Filename)
$BackupLocation = Join-Path $FileDirectory $Filename
Write-Output "Εργαλείο επιδιόρθωσης FLAC της Microsoft. Αυτό το εργαλείο θα επιδιορθώσει ένα αρχείο ήχου 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 -band 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()
εάν ($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) -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)
{
επιστροφή $false
}
# Η επιτυχία αυτών των ελέγχων σημαίνει ότι πιθανότατα έχουμε μια κεφαλίδα πληροφοριών ροής και μπορεί να αναδημιουργήσει το αρχείο
Write-Output "Πληροφορίες ροής αρχείων"
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 -Destination $BackupLocation -Force
$stream = [System.IO.File]::Open($FullPath; [System.IO.FileMode]::Open)
$stream. Seek(4; [System.IO.SeekOrigin]::Begin)
ενώ ($stream. ReadByte() -eq 0) {}
#We now need to figure out where a valid FLAC metadata frame begins
# Πιθανότατα θα τοποθετήστε το δείκτη του μεγέθους στο τελευταίο 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 (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.Μήκος)
$stream. CopyTo($fixedStream)
$stream. Close()
$fixedStream.Close()
Move-Item -Force "$FullPath.tmp" $FullPath
}
-
Στο μενού "Αρχείο", κάντε κλικ στην επιλογή "Αποθήκευση".
-
Στο παράθυρο διαλόγου "Αποθήκευση ως", εντοπίστε το φάκελο στον οποίο θέλετε να αποθηκεύσετε τη δέσμη ενεργειών του PowerShell.
-
Στο πλαίσιο "Όνομα αρχείου", πληκτρολογήστε FixFlacFiles.ps1, αλλάξτε το πλαίσιο "Αποθήκευση ως τύπου" σε "Έγγραφα κειμένου" (*.txt) και, στη συνέχεια, κάντε κλικ στην επιλογή "Αποθήκευση".
-
Στην Windows, εντοπίστε τη δέσμη ενεργειών του PowerShell που έχετε αποθηκεύσει.
-
Κάντε δεξί κλικ στη δέσμη ενεργειών και, στη συνέχεια, κάντε κλικ στην επιλογή "Εκτέλεση με το PowerShell".
-
Όταν σας ζητηθεί, πληκτρολογήστε το όνομα αρχείου του αρχείου FLAC χωρίς δυνατότητα αναπαραγωγής και, στη συνέχεια, πατήστε το πλήκτρο Enter.