无损修复win10系统 (win10 无损修复)

如果你习惯于从网上商城下载 FLAC(自由无损音频压缩编码)格式的音频文件,请不要使用 Windows 10 编辑元数据的系统资源管理器。在 Windows 10 Version 2004 在更高的版本中有一个错误,如果使用资源管理器修改元数据,它可能会损坏 FLAC 音频文件。

这个 BUG 影响 Windows10 专业版、家庭版、企业版、工作站等 SKU 版本。根据本月早些时候发布的支持文件,Windows 10文件资源管理器的错误会破坏一些FLAC这些文件在文件中FLAC头前包含一个ID3框架。ID三是负责存储音乐标题、艺术家、专辑、曲目编号等信息的框架。

在 Windows 10 系统,FLAC忽略了处理程序ID3框架,因为电脑它认为FLAC文件在开头使用4字节fLaC。用户编辑音乐文件时,ID3 框架被覆盖,代码没有开始。因此,音乐播放器无法识别修改后的文件。如果在文件资源管理器中更改音乐文件的标题、艺术家或其他元数据,音乐文件将不会播放或加载。

幸运的是,微软已经确定了根本原因,现在可以通过了Windows Update进行修复。在KB在5003214年更新的更新日志中,微软确认错误已经修复。如果您更改他们的标题、艺术家或其他元数据,自由无损音频编解码器(FLAC)音乐文件将不再无法播放。

对于受损的音乐文件,微软发布了新的音乐文件PowerShell脚本,你可以操作它再次播放文件。然而,它无法恢复存储ID3框架中丢失的元数据。为了避免FLAC未来音乐文件出现问题,微软建议本月应用可选累积更新。

解决方案

1. 打开记事本

2. 将以下脚本代码复制到记事本中

# Copyright 2021 Microsoft

# This script will repair a FLAC file that has been corrupted by Media Foundation in reference to KB5003430.

# Refer to KB5003430 for further information

param(

[parameter(Mandatory =$ true,

HelpMessage = \\"The path to the FLAC file that has been corrupted by Media Foundation\\",

ValueFromRemainingArguments =$ true)]

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

[String]$ File

)

# We need to back up the current file incase we have any errors

$ 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 Repair Tool. This tool will repair a FLAC audio file that was corrupted when editing its details.\\"

Write-Output \\"Affected File: $ FullPath\\"

Write-Output \\"A backup of the file will be made: $ BackupLocation\\"

Write-Output \\"Do you wish to continue?\\"

$ choice =$ host.ui.PromptForChoice(\\"Fixing FLAC Script\\", \\"Do you wish to continue\\", ('&Yes', '&No'), 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)

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

$ MD5HashBytes = New-Object byte 16

$ stream.Read( $ MD5HashBytes, 0, $ MD5HashBytes.Length)

$ MD5Hash =[Guid]( $ MD5HashBytes)

if ($ sampleRate -eq 0)

{

return $ false

}

# Passing these checks means that we likely have a stream info header and can rebuild the file

Write-Output \\"File Stream Information\\"

Write-Output \\"Sample Rate: $ sampleRate\\"

Write-Output \\"Audio Channels: $ channelCount\\"

Write-Output \\"Sample Depth: $ bitsPerSample\\"

Write-Output \\"MD5 Audio Sample Hash: $ MD5Hash\\"

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

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

# We now need to figure out where a valid FLAC metadata frame begins

# We are likely pointing to the last byte of the size member so we'll seek back 4 bytes and retry

$ flacDataStartPosition = $ stream.Position - 4

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

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

{

$ flacDataStartPosition = $ flacDataStartPosition 1

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

}

# Insert the start code

$ stream.Seek( $ flacDataStartPosition,[System .I


电脑