Обобщена информация
Тази актуализация е насочена към проблем с кодирането на метаданни, който кара музикалните файлове на Аудиокодека (FLAC) на Free Lossless (FLAC) да станат непродаваеми, ако заглавието, изпълнителят или други метаданни бъдат променени.
Причина
Този проблем може да възникне, когато FLAC файловете съдържат ИД3 рамка преди заглавката flac. Рамката ИД3 съдържа метаданни, като например заглавие и изпълнител. Манипулаторът на свойство FLAC приема, че всички FLAC файлове са започнали с 4-байтов начален код fLaC и не са вземали предвид рамката ID3 в началото на файла. Следователно рамката ID3 ще бъде презаписана, без стартовият код fLaC да рендира файла непоиграем.
Решение
За да предотвратите този проблем за бъдещи музикални файлове flac, инсталирайте 25 май 2021 г. – KB5003214 (компилизации на ОС 19041.1013, 19042.1013 и 19043.1013) Preview.
За да поправите засегнатите музикални файлове flac, изпълнете следния скрипт на PowerShell.
Важно: Този скрипт няма да възстанови загубените метаданни, които са съхранени в рамката id3. Въпреки това файлът може да се възпроизвежда отново.
-
Отворете Notepad.
-
Копирайте и поставете следния скрипт в бележника:
# Copyright 2021 Microsoft
# Този скрипт ще поправи FLAC файл, който е повреден от Media Foundation във връзка с KB5003430.
# Вижте KB5003430 за допълнителна информация
парам(
[параметър(Задължително=$true;
HelpMessage="Пътят до файла FLAC, който е повреден от Media Foundation",
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
[Низ]$File
)
# Трябва да архивираме текущия файл в папката, в която има грешки
$FileDirectory = Split-Path -Resolve $File
$Filename = Split-Path -Leaf -Resolve $File
$FullPath = Join-Path -Resolve $FileDirectory $Filename
$Filename = [Низ]::Формат("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) -bor $stream. ReadByte())
ако ($blockSize -lt 34)
{
връщане $false
}
$minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
$maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
ако ($minAudioBlockSize -lt 16 -or $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)
ако ($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 -Destination $BackupLocation -Force
$stream = [System.IO.File]::Open($FullPath; [System.IO.FileMode]::Open)
$stream. Търсене(4; [System.IO.SeekOrigin]::Begin)
докато ($stream. ReadByte() -eq 0) {}
# Сега трябва да разберем къде започва валидна рамка с метаданни на FLAC
# Вероятно сочим към последния байт на члена с размер, така че ще потърсим обратно 4 байта и ще повторим опита
$flacDataStartPosition = $stream. Позиция – 4
$stream. Търсене($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
докато (-not(ParseStreamInfoMetadataBlock($stream)))
{
$flacDataStartPosition = $flacDataStartPosition + 1
$stream. Търсене($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
}
#Insert the start code
$stream. Търсене($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
ако (Тест-път "$FullPath.tmp")
{
Remove-Item "$FullPath.tmp"
}
$fixedStream = [System.IO.File]::Open("$FullPath.tmp", [System.IO.FileMode]::CreateNew)
[байт[]]$startCode = [знак[]]('f'; 'L', 'a'; 'C');
$fixedStream.Write($startCode, 0, $startCode.Length)
$stream. CopyTo($fixedStream)
$stream. Затвори()
$fixedStream.Close()
Move-Item -Force "$FullPath.tmp" $FullPath
}
-
В менюто Файл щракнете върху Запиши.
-
В диалоговия прозорец Запиши като намерете папката, в която искате да запишете скрипта на PowerShell.
-
В полето Име на файл въведете FixFlacFiles.ps1, променете полето Запиши като тип на Текстови документи (*.txt) и след това щракнете върху Запиши.
-
В Windows Explorer намерете скрипта на PowerShell, който сте записали.
-
Щракнете с десния бутон върху скрипта и след това щракнете върху Изпълнение с PowerShell.
-
Когато получите подкана, въведете името на файла на непроиграемия FLAC файл и след това натиснете Enter.