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

Podsumowanie

Ta aktualizacja rozwiązuje problem kodowania metadanych, który powoduje, że nie można odtwarzać plików muzycznych FLAC (Free Lossless Audio Codec), jeśli ich tytuł, wykonawca lub inne metadane zostaną zmienione. 

Przyczyna

Ten problem może wystąpić, gdy pliki FLAC zawierają ramkę ID3 przed nagłówkiem FLAC. Ramka ID3 zawiera metadane, takie jak tytuł i wykonawca. Program obsługi właściwości FLAC zakładał, że wszystkie pliki FLAC rozpoczynały się od 4-bajtowego kodu startowego fLaC i nie uwzględniały ramki ID3 na początku pliku. Dlatego ramka ID3 zostałaby zastąpiona bez kodu startowego fLaC renderowanie pliku jako nieodtwarzania.

Rozwiązanie

Aby zapobiec temu problemowi w przypadku przyszłych plików muzycznych FLAC, zainstaluj 25 maja 2021 r. — KB5003214 (kompilacje systemu operacyjnego 19041.1013, 19042.1013 i 19043.1013) w wersji Preview.

Aby naprawić pliki muzyczne FLAC, których dotyczy problem, uruchom następujący skrypt programu PowerShell.

Ważne: Ten skrypt nie spowoduje przywrócenia utraconych metadanych, które były przechowywane w ramce ID3. Jednak plik będzie ponownie odtwarzany.

  1. Otwórz program Notatnik.

  2. Skopiuj i wklej następujący skrypt do notatnika:

    # Prawa autorskie 2021 firmy Microsoft

    # Ten skrypt spowoduje naprawienie pliku FLAC, który został uszkodzony przez program Media Foundation w ramach odwołania do bazy KB5003430.

    # Aby uzyskać więcej informacji, zobacz KB5003430.

    param(

    [parametr(Obowiązkowy=$true;

    HelpMessage="Ścieżka do pliku FLAC, który został uszkodzony przez program Media Foundation",

    ValueFromRemainingArguments=$true)]

    [ValidateScript({ -not [Ciąg]::IsNullOrEmpty($_) -and (Test-Ścieżka $_) })]

    [Ciąg]$File

    )

    # Musimy wrócić do kopii zapasowej bieżącego pliku, w przypadku których wystąpiły błędy

    $FileDirectory = Split-Path -Resolve $File

    $Filename = Split-Path -Leaf -Resolve $File

    $FullPath = Join-Path -Resolve $FileDirectory $Filename

    $Filename = [Ciąg]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DateTime]::Now, $Filename)

    $BackupLocation = Join-Path $FileDirectory $Filename

    Write-Output "Narzędzie do naprawy pakietu Microsoft FLAC. To narzędzie naprawi plik dźwiękowy FLAC, który został uszkodzony podczas edytowania jego szczegółów".

    Write-Output "Plik, którego dotyczy problem: $FullPath"

    Write-Output "Zostanie wykonana kopia zapasowa pliku: $BackupLocation"

    Write-Output "Czy chcesz kontynuować?"

    $choice=$host.ui.PromptForChoice("Naprawianie skryptu FLAC", "Czy chcesz kontynuować", ('&Tak', '&Nie'), 1)

    funkcja ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)

    {

    $blockType = $stream. ReadByte()

    $lastBlock = ($blockType -shr 7) -ne 0

    $blockType = $blockType -band 0x7F

    if ($blockType -ne 0)

    {

    zwróć $false

    }

    $blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())

    if ($blockSize -lt 34)

    {

    zwróć $false

    }

    $minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()

    $maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()

    if ($minAudioBlockSize -lt 16 -or $maxAudioBlockSize -lt 16)

    {

    zwróć $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 bajt[] 16

    $stream. Read($MD 5HashBytes; 0$MD 5HashBytes.Length)

    $MD 5Hash = [Guid]($MD 5HashBytes)

    jeżeli ($sampleRate -eq 0)

    {

    zwróć $false

    }

    # Przekazanie tych testów oznacza, że prawdopodobnie mamy nagłówek informacji o strumieniu i możemy odbudować plik.

    Write-Output "Informacje o strumieniu plików"

    Write-Output "Stopa przykładowa: $sampleRate"

    Write-Output "Kanały audio: $channelCount"

    Write-Output "Przykładowa głębokość: $bitsPerSample"

    Write-Output "Przykładowy skrót dźwiękowy MD5: $MD 5Hash"

    zwróć $true

    }

    jeżeli ($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)

    podczas ($stream. ReadByte() -eq 0) {}

    # Teraz musimy ustalić, gdzie zaczyna się prawidłowa ramka metadanych FLAC

    # Prawdopodobnie wskażemy ostatni bajt członka rozmiaru, więc poszukamy 4 bajtów i ponowimy próbę.

    $flacDataStartPosition = $stream. Położenie — 4

    $stream. Seek($flacDataStartPosition;[System.IO.SeekOrigin]::Begin)

    while (-not(ParseStreamInfoMetadataBlock($stream)))

    {

    $flacDataStartPosition = $flacDataStartPosition + 1

    $stream. Seek($flacDataStartPosition;[System.IO.SeekOrigin]::Begin)

    }

    # Wstaw kod startowy

    $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)

    [bajt[]]$startCode = [znak[]]('f', 'L', 'a', 'C');

    $fixedStream.Write($startCode;0;$startCode.Length)

    $stream. CopyTo($fixedStream)

    $stream. Close()

    $fixedStream.Close()

    Move-Item -Force "$FullPath.tmp" $FullPath

    }

  3. W menu Plik kliknij polecenie Zapisz.

  4. W oknie dialogowym Zapisywanie jako znajdź folder, w którym chcesz zapisać skrypt programu PowerShell.

  5. W polu Nazwa pliku wpisz FixFlacFiles.ps1, zmień pole Zapisz jako typ na Dokumenty tekstowe (*.txt), a następnie kliknij przycisk Zapisz.

  6. W Windows PowerShell odszukaj zapisany skrypt programu PowerShell.

  7. Kliknij skrypt prawym przyciskiem myszy, a następnie kliknij polecenie Uruchom za pomocą programu PowerShell.

  8. Po wyświetleniu monitu wpisz nazwę nieodtwarzania pliku FLAC, a następnie naciśnij klawisz Enter.

Potrzebujesz dalszej pomocy?

Chcesz uzyskać więcej opcji?

Poznaj korzyści z subskrypcji, przeglądaj kursy szkoleniowe, dowiedz się, jak zabezpieczyć urządzenie i nie tylko.

Społeczności pomagają zadawać i odpowiadać na pytania, przekazywać opinie i słuchać ekspertów z bogatą wiedzą.