Сводка
Это обновление устраняет проблему с кодировкой метаданных, из-за которой музыкальные файлы flac без потерь становятся недоступными для воспроизведения при изменении их названия, исполнителя или других метаданных.
Причина
Эта проблема может возникать, если FLAC-файлы содержат кадр ID3 перед заголовком FLAC. Кадр ID3 содержит метаданные, такие как название и исполнитель. Обработчик свойств FLAC предполагает, что все FLAC-файлы запускались с 4-байтового начального кода fLaC и не учитывал кадр ID3 в начале файла. Таким образом, кадр ID3 будет перезаписан без начального кода fLaC, отобразив файл не воспроизводимым.
Решение
Чтобы избежать этой проблемы для будущих музыкальных файлов FLAC, установите предварительную версию 25 мая 2021 г. KB5003214 (сборки ОС 19041.1013, 19042.1013 и 19043.1013).
Чтобы восстановить затронутые музыкальные файлы FLAC, выполните следующий сценарий PowerShell.
Важно
Этот скрипт не восстановит потерянные метаданные, хранящиеся в кадре идентификатора 3. Тем не менее, он снова делает файл воспроизводимым.
Откройте Блокнот.
Скопируйте и вставьте следующий скрипт в блокнот:
# Copyright 2021 Майкрософт
# Этот скрипт восстановит FLAC-файл, который был поврежден Media Foundation в связи с KB5003430.
# Дополнительные сведения см. в KB5003430
param(
[parameter(Обязательный=$true,
HelpMessage="Путь к FLAC-файлу, который был поврежден Media Foundation",
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
[String]$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 -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 "Сведения о Stream файлов"
Write-Output "Частота выборки: $sampleRate"
Write-Output "Звуковые каналы: $channelCount"
Write-Output "Глубина примера: $bitsPerSample"
Write-Output "Md5 Audio Sample Hash: $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)
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
}В меню Файл выберите пункт Сохранить.
В диалоговом окне Сохранить как найдите папку, в которой требуется сохранить сценарий PowerShell.
В поле Имя файла введите FixFlacFiles.ps1, измените поле Тип файла на Текстовые документы (*.txt) и нажмите кнопку Сохранить.
В Windows Обозреватель найдите сохраненный скрипт PowerShell.
Щелкните скрипт правой кнопкой мыши и выберите команду Запустить с помощью PowerShell.
При появлении запроса введите имя файла FLAC, не воспроизводимого, а затем нажмите клавишу ВВОД.