Özet
Bu güncelleştirme, Ücretsiz Kayıpsız Ses Codec Bileşeni (FLAC) müzik dosyalarının başlığı, sanatçı veya diğer meta verileri değiştirilirse oynatılamaz hale dönüşen meta veri kodlama sorununa neden olan bir meta veri kodlama sorununa yöneliktir.
Neden
Bu sorun, FLAC dosyaları FLAC üst bilgiden önce bir ID3 çerçevesi içeriyorsa oluşabilir. ID3 çerçevesi başlık ve sanatçı gibi meta veriler içerir. FLAC özellik işleyicisi, tüm FLAC dosyalarının 4 bayte başlangıç kodu fLaC ile başladığı varsayılır ve dosyanın başındaki ID3 çerçevesini dikkate almaz. Bu nedenle, fLaC başlatma kodu dosyayı oynatılamaz olarak oluşturmadan ID3 çerçevesinin üzerine yazılır.
Çözüm
Gelecekte FLAC müzik dosyalarında bu sorunu önlemek için 25 Mayıs 2021—KB5003214 (19041.1013, 19042.1013 ve 19043.1013 işletim sistemi derlemeleri) Preview'ıyükleyin.
Etkilenen FLAC müzik dosyalarını onarmak için aşağıdaki PowerShell betiği çalıştırın.
Önemli: Bu betik, ID3 çerçevesinde depolanan kayıp meta verileri geri yüklemez. Ancak bu dosya yeniden oynatılabilir hale geliyor.
-
Not Defteri'ni açın.
-
Aşağıdaki betiği kopyalayıp not defterine yapıştırın:
# Telif Hakkı 2021 Microsoft
# Bu betik, KB5003430'a başvuru olarak Media Foundation tarafından bozulan bir FLAC dosyasını onarır.
# Daha fazla bilgi için KB5003430
param(
[parameter(Mandatory=$true,
HelpMessage="Media Foundation tarafından bozuk olan FLAC dosyasının yolu",
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [Dize]::IsNullOrEmpty($_) -and (Test-Yol $_) })]
[Dize]$File
)
# Herhangi bir hatamız olduğu için geçerli dosyayı bir şekilde ihtiyacımız var
$FileDirectory = Split-Path -Resolve $File
$Filename = Split-Path -Yaprak -Çözümle $File
$FullPath = Join-Path -Resolve $FileDirectory $Filename
$Filename = [Dize]::Biçim("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ı onarır."
Write-Output "Etkilenen Dosya: $FullPath"
Write-Output "Dosyanın yedeği yapılacak: Yer aç" $BackupLocation
Write-Output "Devam etmek mi istediğiniz?" sorusunu yanıtla
$choice=$host.ui.PromptForChoice("FLAC Betiği Düzeltme", "Devam etmek mi &", ('&', '&Hayır'), 1)
işlev 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())
if ($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) -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 bayt[] 16
$stream. Read($MD 5HashBytes, 0, $MD 5HashBytes.Length)
$MD 5Hash = [Guid]($MD 5HashBytes)
if ($sampleRate -eq 0)
{
return $false
}
# Bu denetimleri geçmek büyük olasılıkla bir akış bilgi başlığımız olduğu ve dosyayı yeniden oluşturabileceğimizi anlamına gelir
Write-Output Akışı Bilgileri"
Write-Output "Örnek Oran: $sampleRate"
Write-Output "Ses Kanalları: Ses $channelCount"
Write-Output "Örnek Derinlik: $bitsPerSample"
Write-Output "MD5 Ses Örnek Karma: $MD 5Hash"
geri $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) {}
# Artık geçerli bir FLAC meta veri çerçevesinin nereden başladığını anlamamız gerekiyor
# Büyük olasılıkla boyut üyesinin son bayt'unu işaret ediyor ve bu nedenle 4 bayt geri dönüp yeniden deneyin
$flacDataStartPosition = $stream. Konum - 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)
[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
}
-
Dosya menüsünde Kaydet'etıklayın.
-
Farklı Kaydet iletişim kutusunda, PowerShell betiklerini kaydetmek istediğiniz klasörü bulun.
-
Dosya adı kutusuna, Dosya adı FixFlacFiles.ps1yazın, Farklı kaydet kutusunu Metin Belgeleri (*.txt) olarak yazın ve Kaydet'e tıklayın.
-
Windows Explorer'da, kayıtlı powershell betiği bulun.
-
Betike sağ tıklayın ve ardından PowerShell ile Çalıştır'a tıklayın.
-
Sorulsa, oynatılamaz FLAC dosyasının dosya adını yazın ve Enter tuşuna basın.