Загальні відомості
У цьому оновлення описано проблему кодування метаданих, через яку музичні файли формату FLAC (FLAC) можуть не відтворюватися, якщо змінити заголовок, виконавця або інші метадані.
Причина
Ця проблема може виникнути, якщо фрейм FLAC-файлів містить ідентифікатор ID3 перед заголовком FLAC. Фрейм ID3 містить метадані, наприклад заголовок і виконавця. Обробник властивостей FLAC припускає, що всі файли FLAC починаються з 4-байтового початкового коду fLaC і не враховували рамку ID3 на початку файлу. Таким чином, рамка ID3 перезаписується, якщо початковий код не відтворювався.
Спосіб вирішення
Щоб уникнути цієї проблеми для музичних файлів FLAC у майбутньому, інсталюйте 25 травня 2021 р. – KB5003214 (збірки ОС 19041.1013, 19042.1013 і 19043.1013) Preview.
Щоб відновити музичні файли FLAC, запустіть наведений нижче сценарій PowerShell.
Увага!: Цей сценарій не відновить втрачені метадані, збережені в рамці ID3. Проте так файл можна буде відтворювати знову.
-
Відкрийте програму "Блокнот".
-
Скопіюйте та вставте наведений нижче сценарій у блокнот.
# Copyright 2021 Microsoft
# Цей сценарій відновить ФАЙЛ FLAC, пошкоджений медіафайлами Media Foundation із посиланням на KB5003430.
# Докладні відомості див. в статті KB5003430
param(
[parameter(Mandatory=$true,
HelpMessage="Шлях до FLAC-файлу, пошкодженого медіафайлами Foundation",
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [String]::IsNullOrEmpty($_) -і (Test-Path $_) })]
[Рядок]$File
)
# Нам потрібно створити резервну копіювання поточного файлу в пустому файлі, які вказують на помилки
$FileDirectory = Split-Path -Resolve $File
$Filename = Split-Path -Leaf -Resolve $File
$FullPath = Join-Path -Resolve $FileDirectory $Filename
$Filename = [String]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DateTime]:Now, $Filename)
$BackupLocation = Join-Path $FileDirectory $Filename
Write-Output "Microsoft FLAC Repair Tool. За допомогою цього засобу можна відновити аудіофайл 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 смуга 0x7F
if ($blockType -ne 0)
{
return $false
}
$blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
if ($blockSize -lt 34)
{
return $false
}
$minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
$maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
if ($minAudioBlockSize -lt 16 -або $maxAudioBlockSize -lt 16)
{
return $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) -смуга 0x7) + 1
$bitsPerSample = ((($sampleInfo -shr 4) -смуга 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)
{
return $false
}
# Передавання цих перевірок означає, що в нас імовірно, у нас є заголовок відомостей про потокове передавання та може перебудувати файл
Write-Output "Відомості про потокове передавання файлів"
Write-Output "Ставка вибірки: $sampleRate"
Write-Output "Аудіоканали: $channelCount"
Write-Output "Глибина зразка: $bitsPerSample"
Write-Output "MD5 Audio Sample Hash: $MD 5Hash"
return $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) {}
# Тепер потрібно визначити, звідки починається дійсна рамка метаданих 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)
[байт[]]$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.
-
Коли з'явиться відповідний запит, введіть ім'я файлу, який не можна відтворити, а потім натисніть клавішу Enter.