2026高中物理实验视频·高中化学实验视频·高中生物实验视频MP4全集:本地微课搭建指南
一套整理得特别规整的合集,涵盖高中物理、化学、生物三科必修实验,总共 100 多部高清 MP4,而且文件名里直接标明了对应的教材页码(P码)。
1、自动化拉取与流式网络传输
下面是基于 requests 模块实现的流式分片传输逻辑,代码中通过 stream=True 开启流式响应,每次读取 1MB 数据写入磁盘:
import os
import requests
# 共享源地址(合集)
quark_share_url = 'https://pan.quark.cn/s/b569a9601432'
def fetch_experiment_video(quark_share_url: str, output_dir: str):
"""
拉取实验视频并流式保存到本地
"""
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
os.makedirs(output_dir, exist_ok=True)
print(f"正在建立连接,源地址: {quark_share_url}")
# 模拟单个视频流直链拉取流程
video_sample_url = "https://pan.quark.cn/stream/sample_video.mp4"
target_file = os.path.join(output_dir, "01_打点计时器.mp4")
# 开启 stream=True,避免内存溢出
with requests.get(video_sample_url, headers=headers, stream=True, timeout=30) as r:
r.raise_for_status()
total_size = int(r.headers.get('content-length', 0))
downloaded = 0
with open(target_file, 'wb') as f:
for chunk in r.iter_content(chunk_size=1024 * 1024):
if chunk:
f.write(chunk)
downloaded += len(chunk)
# 打印传输进度百分比
percent = (downloaded / total_size) * 100 if total_size else 0
print(f"\r写入中: {percent:.1f}%", end="")
print(f"\n传输完成: {target_file}")
if __name__ == "__main__":
fetch_experiment_video("https://pan.quark.cn/s/b569a9601432", "./data/videos")
对于大体积的教学视频库,这种按块写入的方式能保证内存占用始终稳定在数兆字节左右。如果网络环境不稳定,还可以结合 Range: bytes=start-end 请求头进行分段断点续传。
2、目录结构化:用 Python 提取教材元数据
文件落盘后,核心任务是将文件名转化为计算机容易检索的数据结构。
这套实验视频的文件名包含许多高价值信息,包括实验编号、实验名称以及教材页码。通过正则表达式,我们可以将非结构化的文件名解析为结构化的 JSON 记录。
首先看一下这套合集的真实文件目录清单结构:
《高中实验视频大全》
├── 高中物理 实验视频大全
│ ├── 高中物理 实验大全【必修第1册】
│ │ ├── 01 打点计时器(P17).mp4
│ │ ├── 02 弹簧测力计测量超重和失重现象(P101).mp4
│ │ ├── 03 弹簧的形变与弹簧弹力的关系(P58).mp4
│ │ ├── 04 弹性形变和塑性形变(P57).mp4
│ │ ├── 05 电火花打点计时器(P17).mp4
│ │ ├── 07 伽利略斜面实验(P80).mp4
│ │ ├── 11 利用打点计时器测量自由落体加速度(P46).mp4
│ │ ├── 13 利用打点计时器计算匀变速运动的加速度(P34).mp4
│ │ ├── 15 练习使用打点计时器(P17).mp4
│ │ ├── 22 探究二力合成的规律(P69).mp4
│ │ ├── 23 探究加速度与力 质量的关系(P84).mp4
│ │ └── 31 作用力与反作用力的关系(P65).mp4
│ ├── 高中物理 实验大全【必修第2册】
│ │ ├── 01 向心加速度(P31).mp4
│ │ ├── 03 圆周运动的物体通过最高点的条件(P41).mp4
│ │ ├── 04 离心现象(P38).mp4
│ │ ├── 06 卡文迪什扭秤(P53).mp4
│ │ ├── 08 动能和重力势能的相互转化(P90).mp4
│ │ ├── 11 研究做自由落体运动物体的机械能(P96).mp4
│ │ ├── 16 运动的合成与分解(P6).mp4
│ │ ├── 18 研究平抛运动的特点(P10).mp4
│ │ └── 22 探究向心力大小的表达式(P28).mp4
│ └── 高中物理 实验大全【必修第3册】
│ ├── 9.1 验电器.mp4
│ ├── 9.4 探究影响电荷间作用力大小的因素.mp4
│ ├── 9.5 库仑实验.mp4
│ ├── 10.2 电容器.mp4
│ ├── 10.4 用传感器观察电容器的放电过程.mp4
│ ├── 11.1 探究影响导体电阻的因素.mp4
│ ├── 11.3 练习使用螺旋测微器.mp4
│ ├── 11.4 测量金属丝的电阻率.mp4
│ ├── 11.7 闭合电路的欧姆定律.mp4
│ ├── 11.8 测量电池的电动势和内阻.mp4
│ └── 13.2 产生感应电流的条件.mp4
├── 高中化学 实验视频大全
│ ├── 高中化学 实验大全 【必修第1册】
│ │ ├── 01 1-1 胶体的制备和性质(P8).mp4
│ │ ├── 02 1-2 物质的导电性(P13).mp4
│ │ ├── 04 2-1 切割金属钠(P32).mp4
│ │ ├── 05 2-2 钠在加热条件下与氧气反应(P33).mp4
│ │ ├── 06 2-3 过氧化钠与水反应(P35).mp4
│ │ ├── 07 2-4 碳酸钠和碳酸氢钠的性质(P36).mp4
│ │ ├── 09 2-6 焰色试验(P38).mp4
│ │ ├── 10 2-8 氯水具有漂白性(P42).mp4
│ │ ├── 11 2-9 氯离子的检验(P46).mp4
│ │ ├── 12 2-10 配制一定物质的量浓度的溶液(P55).mp4
│ │ ├── 14 3-2 铁离子的检验(P68).mp4
│ │ ├── 15 3-3 亚铁离子和铁离子的转化(P68).mp4
│ │ └── 18 4-1 卤素之间的置换反应(P98).mp4
│ └── 高中化学 实验大全 【必修第2册】
│ ├── 01 5-1 二氧化硫溶于水(P3).mp4
│ ├── 02 5-2 二氧化硫的漂白性(P3).mp4
│ ├── 03 5-3 浓硫酸与铜的反应(P5).mp4
│ ├── 06 5-6 氨气的喷泉实验(P13).mp4
│ ├── 07 5-7 铵盐的检验方法(P14).mp4
│ ├── 11 6-3 原电池实验(P36).mp4
│ ├── 13 探究:影响化学反应速率的因素(P43).mp4
│ ├── 14 7-1 甲烷与氯气的反应(P64).mp4
│ ├── 16 7-3 乙烯与溴的加成反应(P68).mp4
│ ├── 18 7-5 乙醇的催化氧化(P78).mp4
│ ├── 19 7-6 乙酸乙酯的制备(P80).mp4
│ └── 22 7-9 蛋白质的性质(P86).mp4
└── 高中生物 实验合集
├── 1果酒与果醋的制作.mp4
├── 02 2腐乳的制作.mp4
├── 03 2检测生物组织中的糖类 脂肪和蛋白质.mp4
├── 04 4微生物的实验室培养.mp4
├── 05 5探究植物细胞的失水和吸水.mp4
├── 08 6用高倍显微镜观察叶绿体和线粒体.mp4
├── 11 11探究影响酶活性的条件.mp4
├── 12 12探究酵母菌的呼吸方式.mp4
├── 13 13绿叶中色素的提取和分离.mp4
├── 18 21DNA的粗提取.mp4
└── 20 24尿糖的检测.mp4
为了能够按页码和关键字检索,我们写一个解析脚本,把整个目录扫描一遍并生成 catalog.json:
import os
import re
import json
def parse_catalog(base_dir: str) -> list:
catalog = []
# 匹配模式:提取序号、名称及括号内的教材页码
pattern = re.compile(r'^(?P<num>\d+)?\s*(?P<name>[^((]+)(?:[((]P(?P<page>\d+)[))])?\.mp4$')
for root, _, files in os.walk(base_dir):
for file in files:
if not file.endswith('.mp4'):
continue
rel_path = os.path.relpath(os.path.join(root, file), base_dir)
parts = rel_path.split(os.sep)
subject = "通用"
grade = "必修"
if len(parts) >= 2:
subject = "物理" if "物理" in parts[0] else ("化学" if "化学" in parts[0] else "生物")
grade = parts[1] if len(parts) >= 3 else parts[0]
match = pattern.match(file)
name = file.replace('.mp4', '')
page = None
if match:
name = match.group('name').strip()
page = int(match.group('page')) if match.group('page') else None
catalog.append({
"subject": subject,
"module": grade,
"title": name,
"page": page,
"file_name": file,
"relative_path": rel_path.replace("\\", "/")
})
return catalog
if __name__ == '__main__':
items = parse_catalog("./videos")
with open("catalog.json", "w", encoding="utf-8") as f:
json.dump(items, f, ensure_ascii=False, indent=2)
print(f"解析完毕,共收录实验条目: {len(items)}")
执行后,文件名里的中文符号、多余空格和页码都被标准化成了 JSON 字段。
3、调用 FFmpeg 与 ffprobe 提取视频技术规格
把文件变成系统服务之前,需要检查视频编码与容器格式。网页端原生 <video> 标签对 H.264 + AAC 的兼容性最好。如果视频采用了一些特殊的编码配置,在现代浏览器播放时可能会出现只有声音没有画面的情况。
Python 可以直接调用系统的 ffprobe 工具,批量探测每个实验视频的分辨率、码率以及音频参数:
import subprocess
import json
def probe_video(file_path: str) -> dict:
"""
使用 ffprobe 提取实验视频详细多媒体参数
"""
cmd = [
'ffprobe',
'-v', 'quiet',
'-print_format', 'json',
'-show_format',
'-show_streams',
file_path
]
result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
if result.returncode != 0:
return {"error": result.stderr}
data = json.loads(result.stdout)
video_stream = next((s for s in data.get('streams', []) if s['codec_type'] == 'video'), None)
if not video_stream:
return {"error": "无视频流"}
return {
"codec": video_stream.get("codec_name"),
"width": video_stream.get("width"),
"height": video_stream.get("height"),
"duration": float(data.get("format", {}).get("duration", 0)),
"bit_rate": int(data.get("format", {}).get("bit_rate", 0)) // 1000 # kbps
}
if __name__ == "__main__":
info = probe_video("./videos/物理/必修1/01 打点计时器(P17).mp4")
print("视频参数检测结果:", json.dumps(info, indent=2))
探测结果显示这套资源均为标准的 1080p / 720p H.264 编码,音频为 AAC。这意味着我们不需要执行二次转码,直接推流即可在 Chrome、Edge 和移动端浏览器上流畅播放。
4、基于 FastAPI 搭建轻量本地实验视频点播服务
有了元数据清单和视频格式确认,接下来搭建一个轻量的后端服务。
浏览器播放视频需要服务端支持 HTTP 206 Partial Content 响应状态码。当用户在播放器中拖动进度条跳转时,浏览器会发出带有 Range: bytes=xxx- 的请求。如果服务端只返回 200,用户就无法自由快进。
FastAPI 的 StreamingResponse 结合文件指针操作可以直观地实现这一机制:
import os
from fastapi import FastAPI, HTTPException, Request, Header
from fastapi.responses import StreamingResponse, HTMLResponse
import json
app = FastAPI(title="理化生实验微课系统")
VIDEO_ROOT = "./videos"
with open("catalog.json", "r", encoding="utf-8") as f:
CATALOG = json.load(f)
@app.get("/api/experiments")
def get_experiments(subject: str = None, keyword: str = None):
results = CATALOG
if subject:
results = [x for x in results if x['subject'] == subject]
if keyword:
results = [x for x in results if keyword in x['title']]
return results
@app.get("/video/{path:path}")
def stream_video(path: str, range: str = Header(None)):
full_path = os.path.join(VIDEO_ROOT, path)
if not os.path.exists(full_path):
raise HTTPException(status_code=404, detail="视频文件不存在")
file_size = os.path.getsize(full_path)
start = 0
end = file_size - 1
# 处理 HTTP 206 范围请求,支持拖拽播放
if range:
range_parts = range.replace("bytes=", "").split("-")
start = int(range_parts[0])
if range_parts[1]:
end = int(range_parts[1])
chunk_size = 1024 * 512 # 512KB 单块传输
length = end - start + 1
def iter_file():
with open(full_path, "rb") as f:
f.seek(start)
remaining = length
while remaining > 0:
read_bytes = min(chunk_size, remaining)
data = f.read(read_bytes)
if not data:
break
remaining -= len(data)
yield data
headers = {
"Content-Range": f"bytes {start}-{end}/{file_size}",
"Accept-Ranges": "bytes",
"Content-Length": str(length),
"Content-Type": "video/mp4",
}
return StreamingResponse(iter_file(), status_code=206, headers=headers)
有了这个服务,在同一局域网下,家里的平板或手机只要打开网页,就能通过物理、化学、生物标签,或者直接输入“氯水”、“打点计时器”关键字,定位到具体实验并即点即播。
5、总结与延伸
这套高中理化生实验视频的价值在于整理规范、与必修教材紧密贴合。而通过 Python 网络传输、FFmpeg 参数检测以及 FastAPI 流媒体服务的组合,我们把原本分散的网盘压缩文件转变成了结构化的本地多媒体教学库。
对于经常需要做课件演示的教师,或者正在复习物理、化学实验题的高中生而言,建立这样一套本地资源库能省下不少翻找资料的时间。
后续还可以接入语音识别模型 Whisper,自动把实验解说词转换成逐字稿,与教材知识点做更深度的匹配检索。
浙公网安备 33010602011771号