KB5003430: Meta veriler Windows Gezgini'nde düzenlendiğinde FLAC ile kodlanmış müzik dosyası bozuluyor

Uygulandığı Öğe
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

Özet

Bu güncelleştirme, Ücretsiz Kayıpsız Ses Codec Bileşeni (FLAC) müzik dosyalarının başlık, sanatçı veya diğer meta verileri değiştirildiğinde yürütülemez hale gelmesine neden olan meta veri kodlama sorununu gidermektedir.

Neden

Bu sorun, FLAC dosyaları FLAC üst bilgisinden önce bir ID3 çerçevesi içerdiğinde oluşabilir. ID3 çerçevesi, başlık ve sanatçı gibi meta verileri içerir. FLAC özellik işleyicisi, tüm FLAC dosyalarının 4 baytlık fLaC başlangıç koduyla başladığını ve dosyanın başındaki ID3 çerçevesini hesaba katmadığını varsaydı. Bu nedenle, başlangıç kodu fLaC dosyayı oynatılamaz hale getirmeden ID3 çerçevesinin üzerine yazılır.

Çözüm

Gelecekteki FLAC müzik dosyalarında bu sorunu önlemek için 25 Mayıs 2021—KB5003214 (İşletim Sistemi Derlemeleri 19041.1013, 19042.1013 ve 19043.1013) Önizlemesini yükleyin.

Etkilenen FLAC müzik dosyalarını onarmak için aşağıdaki PowerShell betiğini çalıştırın.

Önemli

Bu komut dosyası, ID3 çerçevesinde depolanan kayıp meta verileri geri yüklemez. Ancak, dosyayı yeniden oynatılabilir hale getirir.

  1. Not Defteri'ni açın.

  2. Aşağıdaki betiği kopyalayıp not defterine yapıştırın:

    # Telif Hakkı 2021 Microsoft
    # Bu komut dosyası, Media Foundation tarafından KB5003430'e göre bozulmuş bir FLAC dosyasını onaracaktır.
    # Daha fazla bilgi için KB5003430 bakın
    param(
    [parametre(Zorunlu=$true,
    HelpMessage="Media Foundation tarafından bozulan FLAC dosyasının yolu",
    ValueFromRemainingArguments=$true)]
    [ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
    [Dize]$File
    )
    # Herhangi bir hata olması durumunda mevcut dosyayı yedeklememiz gerekiyor
    $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 Onarım Aracı. Bu araç, ayrıntılarını düzenlerken bozulan bir FLAC ses dosyasını onaracak."
    "Etkilenen Dosya: $FullPath" Write-Output
    Write-Output "Dosyanın bir yedeklemesi yapılacak: $BackupLocation"
    Write-Output "Devam etmek istiyor musunuz?"
    $choice=$host.ui.PromptForChoice("FLAC Betiği Düzeltiliyor", "Devam etmek istiyor musunuz", ('&Evet', '&Hayır'), 1)
    function ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
    {
    $blockType = $stream. ReadByte()
    $lastBlock = ($blockType -shr 7) -ne 0
    $blockType = $blockType bandı 0x7F
    if ($blockType -ne 0)
    {
    return $false
    }
    $blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
    eğer ($blockSize -lt 34)
    {
    return $false
    }
    $minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
    $maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
    if ($minAudioBlockSize -lt 16 -veya $maxAudioBlockSize -lt 16)
    {
    return $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) -bant 0x7) + 1
    $bitsPerSample = (($sampleInfo -shr 4) -bant 0x1F) + 1
    [UInt64]$sampleCount = (($stream. ReadByte() -shl 24) -bor ($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
    $sampleCount = (([UInt64]$sampleInfo -bant 0xF) -shl 32) -bor $sampleCount
    $MD 5HashBytes = New-Object bayt[] 16
    $stream. Okumak($MD 5HashBytes, 0, $MD 5HashBytes.Length)
    $MD 5Hash = [Guid]($MD 5HashBytes)
    if ($sampleRate -eq 0)
    {
    return $false
    }
    # Bu kontrolleri geçmek, büyük olasılıkla bir akış bilgisi başlığına sahip olduğumuz ve dosyayı yeniden oluşturabileceğimiz anlamına gelir
    "Dosya Stream Bilgileri" Write-Output
    Write-Output "Örnekleme Hızı: $sampleRate"
    Write-Output "Ses Kanalları: $channelCount"
    Write-Output "Örnek Derinliği: $bitsPerSample"
    Write-Output "MD5 Ses Örneği Karması: $MD 5Hash"
    return $true
    }
    if ($choice -eq 0)
    {
    Copy-Item $FullPath -Hedef $BackupLocation -Kuvvet
    $stream = [System.IO.File]::Open($FullPath, [System.IO.FileMode]::Open)
    $stream. Seek(4, [System.IO.SeekOrigin]::Begin)
    iken ($stream. ReadByte() -eq 0) {}
    # Şimdi geçerli bir FLAC meta veri çerçevesinin nerede başladığını bulmamız gerekiyor
    # Muhtemelen boyut üyesinin son baytını işaret ediyoruz, bu yüzden 4 baytı geri arayıp yeniden deneyeceğiz
    $flacDataStartPosition = $stream. Pozisyon - 4
    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
    while (-not(ParseStreamInfoMetadataBlock($stream)))
    {
    $flacDataStartPosition = $flacDataStartPosition + 1
    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
    }
    # Başlangıç kodunu girin
    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
    if (Test Yolu "$FullPath.tmp")
    {
    Remove-Item "$FullPath.tmp"
    }
    $fixedStream = [System.IO.File]::Open("$FullPath.tmp", [System.IO.FileMode]::CreateNew)
    [bayt[]]$startCode = [char[]]('f', 'L', 'a', 'C');
    $fixedStream.Write($startCode, 0, $startCode.Length)
    $stream. Kopyala($fixedStream)
    $stream. Kapat()
    $fixedStream.Close()
    Move-Item -Force "$FullPath.tmp" $FullPath
    }
  3. Dosya menüsünde Kaydet'e tıklayın.

  4. Farklı Kaydet iletişim kutusunda, PowerShell betiğini kaydetmek istediğiniz klasörü bulun.

  5. Dosya adı kutusuna FixFlacFiles.ps1yazın, Kayıt türü kutusunu Metin Belgeleri (*.txt) olarak değiştirin ve ardından Kaydet'e tıklayın.

  6. Windows Gezgini'nde, kaydettiğiniz PowerShell betiğini bulun.

  7. Betiği sağ tıklatın ve ardından PowerShell ile Çalıştır'ı tıklatın.

  8. İstendiğinde, oynatılamayan FLAC dosyasının dosya adını yazın ve ardından Enter tuşuna basın.