الملخص
يعالج هذا التحديث مشكلة ترميز بيانات التعريف التي تتسبب في عدم تشغيل ملفات الموسيقى Free Lossless Audio Codec (FLAC) إذا تم تغيير عنوانها أو مغنيها أو بيانات تعريف أخرى.
السبب
قد تحدث هذه المشكلة عندما تحتوي ملفات FLAC على إطار ID3 قبل رأس FLAC. يحتوي إطار ID3 على بيانات تعريف مثل العنوان والفنان. افترض معالج الخاصية FLAC أن جميع ملفات FLAC بدأت باستخدام fLaC لرمز البدء 4 byte ولم تأخذ في الاعتبار إطار ID3 في بداية الملف. وبالتالي، سيتم الكتابة فوق إطار ID3 بدون أن يعرض fLaC رمز البدء الملف غير القابل ل التشغيل.
الحل
لمنع هذه المشكلة لملفات موسيقى FLAC المستقبلية، قم بتثبيت 25 مايو 2021 — KB5003214 (الإصدارات OS 19041.1013 و19042.1013 و19043.1013) Preview.
لإصلاح ملفات موسيقى FLAC المتأثرة، تشغيل البرنامج النصي التالي من PowerShell.
هام: لن يستعيد هذا البرنامج النصي بيانات التعريف المفقودة التي تم تخزينها في إطار ID3. ومع ذلك، فهو يجعل الملف قابلا للعب مرة أخرى.
-
افتح "المفكرة".
-
نسخ البرنامج النصي التالي ولصقه في المفكرة:
# Copyright 2021 Microsoft
# سيصلح هذا البرنامج النصي ملف 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 -ورقة -حل $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("تصحيح برنامج FLAC النصي"، "هل تريد المتابعة"، ('&نعم'، '&لا')، 1)
الدالة ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
{
$blockType = $stream. ReadByte()
$lastBlock = ($blockType -shr 7) -ne 0
$blockType = $blockType -band 0x7F
إذا ($blockType -ne 0)
{
إرجاع $false
}
$blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -$stream. ReadByte())
إذا ($blockSize -lt 34)
{
إرجاع $false
}
$minAudioBlockSize = ($stream. ReadByte() -shl 8) -$stream. ReadByte()
$maxAudioBlockSize = ($stream. ReadByte() -shl 8) -$stream. ReadByte()
إذا ($minAudioBlockSize -lt 16 -أو $maxAudioBlockSize -lt 16)
{
إرجاع $false
}
$minFrameSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -$stream. ReadByte())
$maxFrameSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -$stream. ReadByte())
$sampleInfo = (($stream. ReadByte() -shl 24) -bor ($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -$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) -$stream. ReadByte())
$sampleCount = (([UInt64]$sampleInfo -band 0xF) -shl 32) -$sampleCount
$MD 5HashBytes = New-Object بايت[] 16
$stream. Read($MD 5HashBytes, 0, $MD 5HashBytes.Length)
$MD 5Hash = [Guid]($MD 5HashBytes)
إذا ($sampleRate -eq 0)
{
إرجاع $false
}
# يعني تمرير هذه الاختبارات أنه من المرجح أن يكون لدينا رأس معلومات دفق ويمكننا إعادة إنشاء الملف
Write-Output "معلومات تدفق الملفات"
Write-Output "معدل العينة: $sampleRate"
Write-Output "قنوات الصوت: $channelCount"
Write-Output "عمق العينة: $bitsPerSample"
Write-Output "MD5 Audio Sample Hash: $MD 5Hash"
إرجاع $true
}
إذا ($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. Close()
$fixedStream.Close()
Move-Item -Force "$FullPath.tmp" $FullPath
}
-
في القائمة ملف، انقر فوق حفظ.
-
في مربع الحوار حفظ باسم، حدد موقع المجلد الذي تريد حفظ البرنامج النصي PowerShell فيه.
-
في المربع اسم الملف، اكتب FixFlacFiles.ps1، غير المربع حفظ بنوع إلى المستندات النصية (*.txt) ثم انقر فوق حفظ.
-
في Windows المستكشف، حدد موقع البرنامج النصي PowerShell الذي حفظته.
-
انقر ب زر الماوس الأيمن فوق البرنامج النصي ثم انقر فوق تشغيل باستخدام PowerShell.
-
عند المطالبة، اكتب اسم الملف لملف FLAC غير القابل لإعادة التشغيل، ثم اضغط على Enter.