【趣事一则】文件损坏恢复

起因是硬盘里不知为何出现了 found.001​ 文件夹,里面存着 dir0000.chk​ 文件夹。

​​image

文件大致如下:

imageimage

去搜了下资料,发现是损坏的文件,占了 2G 左右。我磁盘里有许多资料,当前不能确定这些东西重不重要,所以决定尝试恢复文件,先看看是否重要,然后决定删不删。

先是走了弯路……

去下载了某个磁盘恢复软件,发现只能恢复删除过的文件,对这些文件恢复并无用处。

之后下载了个 CHK 文件恢复专家

image

得出了个 XML 文件。

去问了 AI,简要如下:

  • 这是什么应用产生的?
    这种文件结构(MPD + .m4s 分片)通常由 网络浏览器(如下载流媒体视频)或 某些视频下载/录制软件(如 B 站的录播工具、OBS 插件或某些下载器)在下载或保存视频时使用。文件系统损坏时,这个下载/录制过程可能被中断了。

  • 您需要寻找什么?
    这个 MPD 文件告诉我们,完整的视频被拆分成了两种文件:

    1. 初始化文件 (Header): init-stream0.m4s​(视频头)和 init-stream1.m4s​(音频头)。
    2. 数据分片 (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 打平台的全损录像。得,白浪费时间,文件可以删了。🫠

image

posted @ 2025-11-11 16:02  Gh0st2ongZi  阅读(12)  评论(0)    收藏  举报