Applies ToWindows 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

Аннотация

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

  1. Откройте приложение «Блокнот».

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

    # (Майкрософт) 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

    }

  3. В меню Файл выберите команду Сохранить.

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

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

  6. В Windows проводнике найдите сохраненный сценарий PowerShell.

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

  8. При вводе запроса введите имя файла, который не будет виден для воспроизведения, и нажмите ввод.

Нужна дополнительная помощь?

Нужны дополнительные параметры?

Изучите преимущества подписки, просмотрите учебные курсы, узнайте, как защитить свое устройство и т. д.

В сообществах можно задавать вопросы и отвечать на них, отправлять отзывы и консультироваться с экспертами разных профилей.