Win10竟会损坏用户文件!利用PowerShell脚本修复Flac文件
如果你是一名音乐发烧友,那么应该知道Flac这种常见的无损音乐格式。Flac音乐文件支持metadata,用户可以编辑metadata,让音乐文件带有艺术家、所属专辑、音轨等等信息。
通常来说,metadata和音频数据并不相关,修改metadata并不会影响音频本身。
但是,近日微软官方公布了Win10中存在一个Bug,在Win10中用资源管理器修改Flac文件的metadata,竟会导致音频的损坏!
根据Windows Latest的报道,微软最新发布的一份支持文件披露,如果在Win10的2004或者更高版本中,使用文件资源管理器修改Flac音乐文件的metadata,就会损耗Flac音频文件。
这个Bug在Win10专业版、家庭版、企业版、工作站版乃至其他版本的Win10中均有出现。
根据微软本月早些时候发布的支持文件,Win10的文件资源管理器导致了这个错误,它破坏了Flac文件头包含的ID3框架也就是metadata,而这个ID3框架负责存储音频的注释,例如音乐标题、艺术家、专辑、曲目编号等。
在Win10上,Flac的处理程序忽视了ID3框架,该程序认为Flac文件在使用4字节的文件头,当Flac文件被Win10编辑的时候,ID3框架被覆盖了,导致没有了开始代码,导致了音乐播放器无法识别被修改后的文件。
因此,在Win10中,如果你直接用文件资源管理器修改Flac音乐文件的标题、艺术家等metadata,会导致该文件无法播放。
幸运的是,微软已经确定了Bug的根本原因,用户可以通过Windows Update升级KB5003214补丁进行修复。
在KB5003214补丁中,微软确认了上文提到的错误已经被修复,修改了Flac的标题、艺术家等metadata后,Flac不会再变得无法播放。
而对于已经损坏了的Flac文件,微软则发布了一个PowerShell脚本来进行修复,运行该脚本后Flac文件即可重新播放,不过已经从ID3框架中丢失了的metadata信息并不能恢复。
下面是利用PowerShell脚本修复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.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、保存文件,在“另存为”对话框中,将目录定位到你想要保存PowerShell脚本的位置;
4、在文件名输入框中,输入“FixFlacFiles.ps1”,将另存为文件的类型更改为Text Documents (*.txt);
5、进入到你保存该PowerShell脚本的目录;
6、右键点击刚刚保存的脚本,然后选择“使用PowerShell运行”;
7、出现提示时,输入无法播放的Flac文件的文件名,然后按下回车键。
微软建议大家安装本月推送的可选累积更新,以避免修改Flac文件metadata出现的问题。
标签: Win10 损坏 文件 PowerShell脚本
相关推荐:
最新新闻:
- 全球球精选!闲鱼卖二手,破财难消灾
- 《圣斗士星矢》真人电影先导预告和海报 过于霸气:环球即时
- FS社员工称工资不高有加班 但工作像玩黑魂有成就感:今日关注
- 热门:尹锡悦准备“量身定制”福利以吸引特斯拉超级工厂入驻韩国
- TI后更新来了 《DOTA2》7.32d平衡性更新上线:今日聚焦
- 热点评!《鬼怪》编剧新作 宋慧乔与前夫宋仲基“复仇之战”
- 分不清“事实与观点”的讨论,只是在浪费时间
- 出厂即6GHz i9-13900KS上架了 价格很贵
- 天天要闻:4款N卡停产 以后新卡只能买30系和40系了
- 环球动态:NUC玩跨界!英特尔公版NUC X15游戏本预售5999元
- 冠脉支架集采提价超25%,医药行业预期改变了吗?| 见智研究-全球焦点
- 《孤岛惊魂6》开启免费体验12月6日推出异界DLC
- 沉寂十年之后,大宗商品对冲基金强势归来
- 全球新消息丨类银河恶魔城射击游戏《魔骑少女》现已正式上市
- 动态焦点:华硕ROG幻16 2023款曝光 或将搭载13代酷睿和RTX 40显卡
- 损失严重!苹果iPhone产量极具下滑:预计减少5%至10%:环球快看点
- 每日热门:威尔士0-3不敌英格兰!英格兰队世界杯总进球数破百
- 补贴十三年,肥了谁?废了谁?|焦点精选
- 今日播报!高性价比推荐!一线大牌15.6英寸轻薄本3499元秒
- 特斯拉开始从它降价!每千瓦时降约0.35元
- 199元!网易UU加速盒2发布:支持所有游戏主机、VR
- SE公布《浪漫沙加:吟游诗人之歌》8名主角介绍预告:每日速读
- 《街头霸王6》日本相扑E·本田场景音乐欣赏-短讯
- 焦点资讯:任天堂公布《超级马里奥兄弟大电影》第二部预告
- 开发商表示《火星孤征》比《飞向月球》长得多
- 12月PS+会免游戏阵容爆料:《质量效应传奇版》等_观速讯
- 《重生边缘》国际版增加主机版 PC公测12/9-1/15进行:动态
- 天天百事通!《战神:诸神黄昏》幕后系列第七集 展示游戏电影如何构建
- 《最终幻想7:核心危机 再融合》发行预告片公布 全球快资讯
- 时讯:生活模拟游戏《花园小径》将于2023年春季推出
- 精选!世界杯“大嫂团” 内马尔的巴西模特女友热情火辣
- 快讯:影驰全家桶:冬日装机,纯白平价优选,颜值实力兼具
- 每日观察!AMD锐龙7000 3D版未发布即被封神,明年必买
- RGB控制一键超频 耕升GW-SOUL软件详解
- 谷歌手机广告造假 连带广告公司被FCC起诉
- 保护用户不力!Meta欧洲被罚2.65亿欧元_当前要闻
- 《如龙维新极》冈田以藏介绍:沉默寡言的危险剑客
- 天天快资讯:法拉利首款SUV停止接单!已经供不应求了
- 《传送门RTX》12月8日发售 DLSS 3特性展示_天天快看
- 一边办世界杯,一边狂“卖气”!卡塔尔与德国达成一份15年天然气供应协议
- 当前视讯!韩国罢工潮愈演愈烈!与工会谈崩后,政府下达强制开工令
- 出险房企等来了红包_全球快看点
- 【独家】传闻:《使命召唤》以幽灵为主角的内容正在开发
- 快播:苹果AirPods Pro 2耳机-500 只要1399
- 天天通讯!小米12 Pro降到2599 小米12s Ultra也只要4999
- 上财校长称40万博士生月收入仅3000元 建议提高博士生的收入_微动态
- C919大型客机获颁生产许可证_天天速读
- 世界快看点丨第二春?《大镖客2》Steam在线人数超6.6万创下新高
- 天文学家痛斥:美国一卫星比天上99.8%的星星都亮
- 《木卫四协议》前期2个小时视频被泄露
- PS4主机9岁了!销量近1.2亿 生命周期已基本至终点_天天热闻
- 特斯拉诉品玩名誉侵权案胜诉 后者不服将上诉:天天滚动
- 世界滚动:8核i7+RTX 3070显卡:笔记本准系统仅5999元
- 观点:1TB固态SSD限时284元降价
- 竞猜赢大礼:2022世界杯竞猜活动上线,惊喜大礼等你来!|即时
- 北通宙斯2光轴精英手柄正式亮相 五大最新功能进化线索全公开
- 全球观热点:小米推出首款迷你主机 12月1日发布
- 掌控4610亿美元资产,卡塔尔太后有多牛?:全球观点
- 焦点要闻:买飞机、建机场、收并购,中国物流如何“抄作业”?
- 得罪女性还能挣钱,婚恋博主的另类生意
- 大学生打电竞比赛聊考研 网友:学习好 游戏也打得好
- 今日讯!世界航空界首次:劳斯莱斯成功测试氢动力喷气发动机
- 小米首款台式机来了!小米迷你主机与小米13同步发布
- 火山引擎智能外呼上线抖店,双十一助力商家提升营销转化:全球报资讯
- 天天观天下!小米13跑《原神》30分钟测试:跑满帧 43度不发烫
- 网友曝小米13真机渲染图 你感觉如何?:世界新动态
- 特斯拉Model 3新款将开售:降到20万以内
- 【世界速看料】小米无线鼠标减价 史低价30元
- 发生了什么?上证50暴涨4%,离岸人民币狂拉800点,恒生科技飙升逾7%,债市延续大跌_最新资讯
- 高盛:对冲基金正在大规模做空能源股 环球微动态
- 印度首枚私人太空火箭发射升空,只有6米长、半吨重
- 《怪物猎人崛起:曙光》分享设计草图原画 凶恶怨虎龙霸气外露:环球热门
- LOL心之钢即将迎来削弱:伤害加成从10%下调至5%
- 加密货币贷款公司BlockFi 申请破产保护-当前速看
- 全球今头条!支付宝上线生僻字键盘 可方便6000万人