Аннотация
Это обновление адресована проблема с кодированием метаданных, из-за которой музыкальные файлы free Lossless Audio Codec (FLAC) становятся недоступными при смене их названия, исполнителя или других метаданных.
Причина
Эта проблема может возникать, если ВК-файлы содержат рамку ID3 перед заглавным флажком. Рамка ID3 содержит метаданные, такие как название и исполнителя. Обработец свойств FLAC предполагает, что все flaC-файлы начинаются с 4-byte start code fLaC и не учитывают фрейм ID3 в начале файла. Таким образом, рамка ID3 будет перезаписана без запуска кода fLaC, из-за чего файл будет недозаписан.
Решение
Чтобы предотвратить эту проблему для будущих музыкальных файлов FLAC, установите предварительную версию от 25 мая 2021 г. — KB5003214 (сборки ОС 19041.1013, 19042.1013 и 19043.1013).
Чтобы восстановить затронутые музыкальные файлы FLAC, запустите следующий сценарий PowerShell:
Важно: Этот сценарий не восстановит потерянные метаданные, хранимые в рамке ID3. Однако при этом файл можно будет снова проиграть.
-
Откройте приложение «Блокнот».
-
Скопируйте и вкопируйте следующий сценарий в блокнот:
# (Майкрософт) 2021
# Этот сценарий будет восстанавливать FLAC-файл, поврежденный media Foundation со ссылкой на KB5003430.
# Дополнительные сведения можно найти в KB5003430
параметр(
[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 "Средство восстановления флажков (Майкрософт). Это средство восстановление звукового файла 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) -hl ($stream. ReadByte() -shl 8) -$stream. ReadByte())
if ($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) -hl ($stream. ReadByte() -shl 8) -$stream. ReadByte())
$maxFrameSize = (($stream. ReadByte() -shl 16) -hl ($stream. ReadByte() -shl 8) -$stream. ReadByte())
$sampleInfo = (($stream. ReadByte() -shl 24) -hl ($stream. ReadByte() -shl 16) -hl ($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) -hl ($stream. ReadByte() -shl 16) -hl ($stream. ReadByte() -shl 8) -$stream. ReadByte())
$sampleCount = (([UInt64]$sampleInfo -band 0xF) -shl 32) -hl $sampleCount
$MD 5HashBytes = New-Object byte[] 16
$stream. Read($MD 5HashBytes, 0, $MD 5HashBytes.Length)
$MD 5Hash = [Guid]($MD 5HashBytes)
if ($sampleRate -eq 0)
{
возврат $false
}
# Прохождение этих проверок означает, что, скорее всего, у нас есть заглавная информация о потоке и мы можем перестроить файл
Write-Output "Сведения о потоке файлов"
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 -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
# Скорее всего, мы указываем на последний byte члена размера, поэтому отберем 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.
-
При вводе запроса введите имя файла, который не будет виден для воспроизведения, и нажмите ввод.