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

Rezumat

Această actualizare se adresează unei probleme de codificare a metadatelor, care determină ca fișierele de muzică FREE Lossless Audio Codec (FLAC) să devină iluzabile dacă denumirea, artistul sau alte metadate ale acestora se modifică. 

Cauză

Această problemă poate apărea atunci când fișierele FLAC conțin un cadru ID3 înainte de antetul FLAC. Cadrul ID3 conține metadate, cum ar fi titlul și artistul. Gestionarul de proprietăți FLAC presupunea că toate fișierele FLAC au început cu codul de pornire 4 byți fLaC și nu au luat în considerare cadrul ID3 de la începutul fișierului. Prin urmare, cadrul ID3 ar fi suprascris fără codul de pornire fLaC care să redea fișierul iluzabil.

Rezolvare

Pentru a preveni această problemă pentru fișierele de muzică FLAC viitoare, instalați previzualizarea 25 mai 2021 - KB5003214 (compilări OS 19041.1013, 19042.1013 și 19043.1013).

Pentru a repara fișierele de muzică FLAC afectate, rulați următorul script PowerShell.

Important: Acest script nu va restaura metadatele pierdute care au fost stocate în cadrul ID3. Totuși, acest lucru face fișierul să se redea din nou.

  1. Deschideți Notepad.

  2. Copiați și lipiți următorul script în notepad:

    # Copyright 2021 Microsoft

    # Acest script va repara un fișier FLAC care a fost deteriorat de Media Foundation ca referință la KB5003430.

    # Consultați KB5003430 pentru informații suplimentare

    param(

    [parameter(Mandatory=$true,

    HelpMessage="Calea către fișierul FLAC care a fost deteriorat de Media Foundation",

    ValueFromRemainingArguments=$true)]

    [ValidateScript({ -not [Șir]::IsNullOrEmpty($_) -and (Test-Path $_) })]

    [Șir]$File

    )

    # Trebuie să facem o verificare a fișierului curent, în caz că avem erori

    $FileDirectory = Split-Path -Rezolvarea $File

    $Filename = Split-Path -Frunză -Rezolvare $File

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

    $Filename = [Șir]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DatăOră]::Acum, $Filename)

    $BackupLocation = Join-Path $FileDirectory $Filename

    Write-Output "Instrumentul de reparare Microsoft FLAC. Acest instrument va repara un fișier audio FLAC care a fost deteriorat atunci când editează detaliile sale."

    Write-Output "Fișier afectat: $FullPath"

    Write-Output se va face o copie backup a fișierului: $BackupLocation"

    Write-Output "Continuați?"

    $choice=$host.ui.PromptForChoice("Remedierea scriptului FLAC", "Doriți să continuați", ('&Da', '&Nu'), 1)

    funcția ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)

    {

    $blockType = $stream. ReadByte()

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

    $blockType = $blockType -band 0x7F

    if ($blockType -ne 0)

    {

    returnare $false

    }

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

    if ($blockSize -lt 34)

    {

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

    {

    returnare $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 byte[] 16

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

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

    if ($sampleRate -eq 0)

    {

    returnare $false

    }

    # Trecerea acestor verificări înseamnă că avem probabil un antet de informații în flux și putem să reconstruim fișierul

    Write-Output "Informații flux de fișiere"

    Write-Output "Rată eșantion: $sampleRate"

    Write-Output "Canale audio: $channelCount"

    Write-Output "Adâncime eșantion: $bitsPerSample"

    Write-Output "Cod hash eșantion audio MD5: $MD 5Hash"

    returnare $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) {}

    # Acum trebuie să ne dăm seama unde începe un cadru de metadate FLAC valid

    # Cel mai probabil, suntem pe ultimul byte al membrurii de dimensiune, așa că vom căuta înapoi 4 byți și vom reîncerca

    $flacDataStartPosition = $stream. Poziție - 4

    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::begin)

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

    {

    $flacDataStartPosition = $flacDataStartPosition + 1

    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::begin)

    }

    # Inserați codul de pornire

    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::begin)

    if (Cale de test "$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. În meniul Fișier, faceți clic pe Salvare.

  4. În caseta de dialog Salvare ca, găsiți folderul în care doriți să salvați scriptul PowerShell.

  5. În caseta Nume fișier, tastați FixFlacFiles.ps1, modificați caseta Salvare cu tipul la Documente text (*.txt), apoi faceți clic pe Salvare.

  6. În Windows Explorer, găsiți scriptul PowerShell pe care l-ați salvat.

  7. Faceți clic dreapta pe script, apoi faceți clic pe Executare cu PowerShell.

  8. Atunci când vi se solicită, tastați numele de fișier al fișierului FLAC care se poate reda, apoi apăsați pe Enter.

Aveți nevoie de ajutor suplimentar?

Doriți mai multe opțiuni?

Explorați avantajele abonamentului, navigați prin cursurile de instruire, aflați cum să vă securizați dispozitivul și multe altele.

Comunitățile vă ajută să adresați întrebări și să răspundeți la întrebări, să oferiți feedback și să primiți feedback de la experți cu cunoștințe bogate.