الملخص
يعالج هذا التحديث مشكلة ترميز بيانات التعريف التي تتسبب في أن تصبح ملفات موسيقى برنامج ترميز الصوت بدون فقدان (FLAC) غير قابلة للتشغيل إذا تم تغيير عنوانها أو فنانها أو بيانات تعريف أخرى.
السبب
قد تحدث هذه المشكلة عندما تحتوي ملفات FLAC على إطار ID3 قبل رأس FLAC. يحتوي إطار ID3 على بيانات تعريف مثل العنوان والفنان. افترض معالج خاصية FLAC أن جميع ملفات FLAC بدأت برمز بدء 4 بايت fLaC ولم تأخذ في الاعتبار إطار ID3 في بداية الملف. لذلك، سيتم الكتابة فوق إطار ID3 بدون رمز البدء fLaC الذي يجعل الملف غير قابل للتشغيل.
الدقة
لمنع هذه المشكلة لملفات موسيقى FLAC المستقبلية، قم بتثبيت 25 مايو 2021 — KB5003214 (إصدارات نظام التشغيل 19041.1013 و19042.1013 و19043.1013) Preview.
لإصلاح ملفات موسيقى FLAC المتأثرة، قم بتشغيل البرنامج النصي PowerShell التالي.
هام
لن يستعيد هذا البرنامج النصي بيانات التعريف المفقودة التي تم تخزينها في إطار ID3. ومع ذلك، فإنه يجعل الملف قابلا للتشغيل مرة أخرى.
افتح المفكرة.
انسخ البرنامج النصي التالي والصقه في المفكرة:
# حقوق النشر 2021 Microsoft
# سيقوم هذا البرنامج النصي بإصلاح ملف FLAC الذي تم إتلافه بواسطة Media Foundation في إشارة إلى KB5003430.
# راجع KB5003430 لمزيد من المعلومات
param(
[parameter(Mandatory=$true,
HelpMessage="المسار إلى ملف FLAC الذي تم إتلافه بواسطة Media Foundation"،
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
[سلسلة]$File
)
# نحتاج إلى نسخ الملف الحالي احتياطيا لدينا أي أخطاء
$FileDirectory = Split-Path -حل $File
$Filename = Split-Path -ورقة -حل $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", "Do you wish to continue", ('&Yes', '&No'), 1)
الدالة ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
{
$blockType = $stream. ReadByte()
$lastBlock = ($blockType -shr 7) -ne 0
$blockType = 0x7F $blockType -band
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 بايت[] 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: $MD 5Hash"
إرجاع $true
}
if ($choice -eq 0)
{
Copy-Item $FullPath -الوجهة $BackupLocation -Force
$stream = [System.IO.File]::Open($FullPath, [System.IO.FileMode]::Open)
$stream. Seek(4, [System.IO.SeekOrigin]::Begin)
بينما ($stream. ReadByte() -eq 0) {}
# نحتاج الآن إلى معرفة مكان بدء إطار بيانات تعريف FLAC صالح
# من المحتمل أن نشير إلى البايت الأخير من عضو الحجم لذلك سنسعى مرة أخرى 4 بايت ونعيد المحاولة
$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.Length)
$stream. CopyTo($fixedStream)
$stream. إغلاق()
$fixedStream.Close()
$FullPath Move-Item -Force "$FullPath.tmp"
}في قائمة ملف، انقر فوق حفظ.
في مربع الحوار حفظ باسم ، حدد موقع المجلد الذي تريد حفظ البرنامج النصي PowerShell فيه.
في المربع اسم الملف ، اكتب FixFlacFiles.ps1، غير المربع حفظ بنوع إلى مستندات نصية (*.txt) ثم انقر فوق حفظ.
في مستكشف Windows، حدد موقع البرنامج النصي PowerShell الذي حفظته.
انقر بزر الماوس الأيمن فوق البرنامج النصي ثم انقر فوق تشغيل باستخدام PowerShell.
عند المطالبة، اكتب اسم ملف ملف FLAC غير القابل للتشغيل ثم اضغط على مفتاح الإدخال Enter.