【趣事一则】文件损坏恢复
起因是硬盘里不知为何出现了 found.001 文件夹,里面存着 dir0000.chk 文件夹。

文件大致如下:

去搜了下资料,发现是损坏的文件,占了 2G 左右。我磁盘里有许多资料,当前不能确定这些东西重不重要,所以决定尝试恢复文件,先看看是否重要,然后决定删不删。
先是走了弯路……
去下载了某个磁盘恢复软件,发现只能恢复删除过的文件,对这些文件恢复并无用处。
之后下载了个 CHK 文件恢复专家:
得出了个 XML 文件。
去问了 AI,简要如下:
这是什么应用产生的?
这种文件结构(MPD + .m4s 分片)通常由 网络浏览器(如下载流媒体视频)或 某些视频下载/录制软件(如 B 站的录播工具、OBS 插件或某些下载器)在下载或保存视频时使用。文件系统损坏时,这个下载/录制过程可能被中断了。您需要寻找什么?
这个 MPD 文件告诉我们,完整的视频被拆分成了两种文件:
- 初始化文件 (Header): init-stream0.m4s(视频头)和 init-stream1.m4s(音频头)。
- 数据分片 (Chunks): 大量的 chunk-stream... .m4s 文件。
根据 MPD 的信息,总时长(PT39M8.998S)约等于 2348.998 秒。每个分片(duration="3000000")且(timescale="1000000")意味着每个分片是 3 秒。
理论上,您应该需要寻找大约 783 个视频分片(名为 chunk-stream0-00001.m4s 到 chunk-stream0-00783.m4s)和 783 个音频分片(名为 chunk-stream1-00001.m4s 到 chunk-stream1-00783.m4s)。
发现是个视频文件,此刻估计应该没那么重要了,但还是怀着好奇心继续尝试。
让 AI 尝试写一个 Python 脚本拼合视频:
import os
# --- 配置 ---
VIDEO_INIT = "init-stream0.m4s.mp4"
VIDEO_CHUNK_PATTERN = "chunk-stream0-{:05d}.m4s"
VIDEO_OUTPUT = "temp_video.m4v" # 视频流临时文件
AUDIO_INIT = "init-stream1.m4s.mp4"
AUDIO_CHUNK_PATTERN = "chunk-stream1-{:05d}.m4s"
AUDIO_OUTPUT = "temp_audio.m4a" # 音频流临时文件
# 根据您的文件列表,分片数量为 783
NUM_CHUNKS = 783
# --- 结束配置 ---
def merge_files(init_file, chunk_pattern, output_file, num_chunks):
"""
将一个初始化文件和一系列分片合并成一个单独的流文件。
"""
if not os.path.exists(init_file):
print(f"错误:未找到初始化文件: {init_file}")
return False
print(f"开始合并到 -> {output_file}")
try:
with open(output_file, 'wb') as outfile:
# 1. 写入初始化文件 (Header)
with open(init_file, 'rb') as f_init:
outfile.write(f_init.read())
print(f"已写入: {init_file}")
# 2. 循环写入所有分片
for i in range(1, num_chunks + 1):
chunk_name = chunk_pattern.format(i)
if not os.path.exists(chunk_name):
print(f"警告:未找到分片 {chunk_name},跳过...")
continue
with open(chunk_name, 'rb') as f_chunk:
outfile.write(f_chunk.read())
if i % 100 == 0 or i == num_chunks:
print(f"已合并分片: {i}/{num_chunks}")
print(f"成功创建: {output_file}\n")
return True
except IOError as e:
print(f"合并过程中发生错误: {e}")
return False
# --- 执行合并 ---
print("--- 开始合并视频流 ---")
merge_video_ok = merge_files(VIDEO_INIT, VIDEO_CHUNK_PATTERN, VIDEO_OUTPUT, NUM_CHUNKS)
print("--- 开始合并音频流 ---")
merge_audio_ok = merge_files(AUDIO_INIT, AUDIO_CHUNK_PATTERN, AUDIO_OUTPUT, NUM_CHUNKS)
if merge_video_ok and merge_audio_ok:
print("所有分片合并完成!")
print(f"下一步:请在命令行中运行 'ffmpeg' 命令来合并 {VIDEO_OUTPUT} 和 {AUDIO_OUTPUT}")
else:
print("合并过程中出现错误,请检查文件是否存在。")
拼合完成后,打开查看,发现是某次 CS2 打平台的全损录像。得,白浪费时间,文件可以删了。🫠

浙公网安备 33010602011771号