一键装机工具 系统多样选择 Win7 Win8 Win10 立即下载 轻松一键装机,选择想要的Windows系统,为电脑新手量身定做,操作简单、又方便,且安全!
当前位置:主页 > 重装教程 > Win10教程 >

win10系统Version2004使用资源管理器修改元数据会损坏FLAC音频文

发布时间:2021-06-02
在 Windows 10 系统,FLAC处理程序忽略了ID3框架,因为它认为FLAC文件在开头使用4字节的fLaC。当音乐文件被用户编辑时,ID3 框架被覆盖了,没有开始代码。因此,音乐播放器无法识别修改后的文件。如果音乐文件的标题、艺术家或其他元数据在文件资源管理器中被改变,音乐文件就不会播放或加载。
win10系统Version2004使用资源管理器修改元数据会损坏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__", [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.IO.SeekOrigin]::Begin)
 
if (Test-Path "$ 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. 文件菜单上,点击保存。
 
4. 在 "另存为 "对话框中,找到你要保存PowerShell脚本的文件夹。
 
5. 在文件名框中,输入FixFlacFiles.ps1,将保存类型框改为文本文档(*.txt),然后点击保存。
 
6. 在Windows Explorer中,找到你保存的PowerShell脚本。
 
7. 右键单击该脚本,然后单击用PowerShell运行。
 
8. 当有提示时,输入无法播放的FLAC文件的文件名,然后按回车键。
本文链接地址: https://www.yijianzj.com/wsjc/1787.html
Copyright © 2010-2020 https://www.yijianzj.com 一键装机工具版权所有