סיכום
עדכון זה מטפל בבעיה בקידוד מטה-נתונים שגורמת לקבצי מוסיקה של Codec שמע ללא אובדן נתונים (FLAC) להפוך ללא ניתנים לשמע אם התואר, האמן או מטה-נתונים אחרים שלהם משתנים.
סיבה
בעיה זו עשויה להתרחש כאשר קבצי FLAC מכילים מסגרת ID3 לפני כותרת FLAC. המסגרת ID3 מכילה מטה-נתונים כגון כותרת ואמן. המטפל במאפיין FLAC הניח שכל קבצי FLAC התחילו עם קוד ההתחלה של 4 בתים fLaC ולא התבינו במסגרת ID3 בתחילת הקובץ. לכן, המסגרת ID3 יוחלף ללא הפעלת קוד fLaC בעיבוד הקובץ ללא הפעלה.
פתרון
כדי למנוע בעיה זו עבור קבצי מוסיקה עתידיים של FLAC, התקן את 25 במאי 2021 — KB5003214 (גירסת Build של מערכת ההפעלה מס' 19041.1013, 19042.1013 ו- 19043.1013) תצוגה מקדימה.
כדי לתקן קבצי מוסיקה מושפעים של FLAC, הפעל את קובץ ה- Script הבא של PowerShell.
חשוב: קובץ Script זה לא ישחזר את המטה-נתונים שאבדה שמאוחסנים במסגרת ID3. עם זאת, היא תשוב להפוך את הקובץ לניתן לשמיעה.
-
פתח את פנקס הרשימות.
-
העתק והדבק את קובץ ה- Script הבא לתוך פנקס רשימות:
# Copyright 2021 Microsoft
# קובץ Script זה יתקן קובץ FLAC שהפגם על-ידי Media Foundation בהפניה ל- KB5003430.
# עיין ב- KB5003430 לקבלת מידע נוסף
param(
[parameter(Mandatory=$true,
HelpMessage="הנתיב לקובץ FLAC שהפגם על-ידי Media Foundation",
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
[String]$File
)
# אנחנו צריכים גבה את הקובץ הנוכחי באותיות קטנות שיש לנו שגיאות
$FileDirectory = Split-Path -פתרון $File
$Filename = Split-Path -Leaf -Resolve $File
$FullPath = Join-Path -פתרון $FileDirectory $Filename
$Filename = [String]::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("Fixing FLAC Script", "האם ברצונך להמשיך", ('&כן', '&לא'), 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()
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) -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[] 16
$stream. Read($MD 5HashBytes, 0, $MD 5HashBytes.Length)
$MD 5Hash = [Guid]($MD 5HashBytes)
if ($sampleRate -eq 0)
{
החזר $false
}
# העברת צ'קים אלה פירושה שיש לנו סבירות שיש לנו כותרת פרטי זרימה, והם יכולים לבנות מחדש את הקובץ
Write-Output "File Stream Information"
Write-Output "Sample Rate: $sampleRate"
Write-Output "Audio Channels: $channelCount"
Write-Output "Sample Depth: $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)
while ($stream. ReadByte() -eq 0) {}
# כעת עלינו לגלות היכן מתחילה מסגרת מטה-נתונים חוקית של FLAC
# סביר מאוד שאנו להצביע על הבית האחרון של חבר הגודל כך שנחפש 4 בתים ונסה שוב
$flacDataStartPosition = $stream. מיקום - 4
$stream. Seek($flacDataStartPosition, [System.IO.seekOrigin]::Begin)
while (-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.Length)
$stream. CopyTo($fixedStream)
$stream. Close()
$fixedStream.Close()
Move-Item -Force "$FullPath.tmp" $FullPath
}
-
בתפריט קובץ, לחץ על שמור.
-
בתיבת הדו-שיח שמירה בשם, אתר את התיקיה שבה ברצונך לשמור את קובץ ה- Script של PowerShell.
-
בתיבה שם הקובץ, הקלד FixFlacFiles.ps1, שנה את התיבה שמור כסוג במסמכי טקסט (*.txt) ולאחר מכן לחץ על שמור.
-
בסייר Windows, אתר את קובץ ה- Script של PowerShell ששמרת.
-
לחץ באמצעות לחצן העכבר הימני על קובץ ה- Script ולאחר מכן לחץ על הפעל עם PowerShell.
-
כאשר תתבקש לעשות זאת, הקלד את שם הקובץ של קובץ FLAC שלא ניתן להפעיל ולאחר מכן הקש Enter.