KB5003430: музыкальный файл в кодировке FLAC поврежден при редактировании метаданных в Windows Обозреватель

Применяется к
Windows 10 Enterprise, version 2004 Windows 10 Home and Pro, version 2004 Windows 10 Pro, version 2004 Windows 10 Enterprise and Education, version 2004 Windows 10 Pro Education, version 2004 Windows 10 Pro for Workstations, version 2004 Windows 10 Pro, version 20H2 Windows 10 Enterprise, version 20H2 Windows 10 Enterprise and Education, version 20H2 Windows 10 Home and Pro, version 20H2 Windows 10 Pro Education, version 20H2 Windows 10 Pro for Workstations, version 20H2

Сводка

Это обновление устраняет проблему с кодировкой метаданных, из-за которой музыкальные файлы 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. Тем не менее, он снова делает файл воспроизводимым.

  1. Откройте Блокнот.

  2. Скопируйте и вставьте следующий скрипт в блокнот:

    # 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
    }
  3. В меню Файл выберите пункт Сохранить.

  4. В диалоговом окне Сохранить как найдите папку, в которой требуется сохранить сценарий PowerShell.

  5. В поле Имя файла введите FixFlacFiles.ps1, измените поле Тип файла на Текстовые документы (*.txt) и нажмите кнопку Сохранить.

  6. В Windows Обозреватель найдите сохраненный скрипт PowerShell.

  7. Щелкните скрипт правой кнопкой мыши и выберите команду Запустить с помощью PowerShell.

  8. При появлении запроса введите имя файла FLAC, не воспроизводимого, а затем нажмите клавишу ВВОД.