ffmpeg.wasm 合并 TS 视频教程:浏览器端视频处理实践

简介: 一种基于ffmpeg.wasm的浏览器端TS视频合并方案,通过将FFmpeg编译为WebAssembly,实现了在浏览器本地直接处理TS文件的功能。文章详细阐述了实现思路:加载wasm核心、上传TS文件、生成合并列表、执行FFmpeg命令并导出MP4。

前言

在做视频处理相关工具时,经常会遇到一个很常见的需求:

把一堆 .ts 分片视频合并成一个 MP4 文件。

这种情况在很多场景都会出现,例如:

  • HLS 视频流下载
  • 课程平台视频缓存
  • 直播流录制
  • M3U8 视频下载

通常你会得到一堆文件:

0001.ts
0002.ts
0003.ts
...

如果你用过视频处理工具,大概率知道这件事可以用 FFmpeg 一条命令完成。但对于大多数用户来说,命令行始终是个门槛。

于是我尝试用 ffmpeg.wasm 做了一个浏览器端 TS 合并工具,让整个流程变成:

拖入 TS 文件 → 点击合并 → 下载 MP4

不需要安装软件,也不需要上传视频到服务器。


一、为什么 TS 文件经常需要合并

TS(Transport Stream)是 MPEG‑TS 格式,常见于 HTTP Live Streaming(HLS) 视频流。

HLS 的工作方式是:

  1. 视频被切成很多 .ts 小片段
  2. 用 .m3u8 文件记录播放顺序
  3. 播放器按顺序加载这些 TS

例如:

index.m3u8
segment0001.ts
segment0002.ts
segment0003.ts

如果你通过工具下载视频,往往就只会得到这些 .ts 文件。这时候最常见的需求就是:

把这些 TS 文件重新拼成一个完整视频。


二、传统解决方案的问题

传统做法一般有三种。

1 使用 FFmpeg 命令

最标准的方法是:

ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4

但问题是:

  • 要安装 FFmpeg
  • 要写文件列表
  • 要使用命令行

对于非技术用户来说并不友好。


2 使用桌面软件

例如:

  • 格式工厂
  • 剪映
  • Premiere

但这些工具存在几个问题:

  • 安装体积大
  • 打开速度慢
  • 操作复杂

3 使用在线网站

很多在线工具要求:

  • 上传视频到服务器

但 TS 文件往往:

  • 几百 MB
  • 几 GB

上传速度慢,而且很多人也不希望视频离开本地设备。


三、ffmpeg.wasm:让浏览器运行 FFmpeg

为了解决这个问题,我选择了 ffmpeg.wasm。简单来说,它做了一件很有意思的事情:

把 FFmpeg 编译成 WebAssembly。

也就是说:

浏览器可以直接运行 FFmpeg。

整个流程变成:

浏览器
   ↓
WebAssembly
   ↓
FFmpeg
   ↓
本地视频处理

优点非常明显:

  • 不需要安装软件
  • 不需要上传视频
  • 数据完全在本地处理
  • 跨平台(Windows / Mac / Linux / 手机)

四、实现一个 TS 在线合并工具的思路

我在实现这个工具时,整体流程大致是这样的。

第一步:加载 FFmpeg wasm

浏览器启动时加载 FFmpeg wasm 核心。

示例代码:

import {
    createFFmpeg } from "@ffmpeg/ffmpeg"

const ffmpeg = createFFmpeg({
   
  log: true
})

await ffmpeg.load()

第一次加载会稍慢,因为需要下载 wasm 文件。

第二步:上传 TS 文件

用户可以:

  • 拖拽文件
  • 或选择多个 TS 文件

示例:

for (const file of files) {
   
  ffmpeg.FS("writeFile", file.name, await fetchFile(file))
}

这些文件会被写入 FFmpeg 的虚拟文件系统。

ts-merge

第三步:生成 concat 列表

FFmpeg 合并 TS 的标准方法是使用 concat demuxer。

例如:

file '0001.ts'
file '0002.ts'
file '0003.ts'

浏览器中动态生成:

let list = files
  .map(f => `file '${
     f.name}'`)
  .join("\n")

ffmpeg.FS("writeFile", "list.txt", list)

第四步:执行合并命令

核心命令:

ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4

在 wasm 中运行:

await ffmpeg.run(
  "-f","concat",
  "-safe","0",
  "-i","list.txt",
  "-c","copy",
  "output.mp4"
)

这里的关键点是:

-c copy

表示:

不重新编码,只做封装转换

因此速度非常快。

process-ts

第五步:导出 MP4 文件

最后从虚拟文件系统读取结果:

const data = ffmpeg.FS("readFile", "output.mp4")

然后触发浏览器下载。

process-finish

五、最终实现效果

整个用户体验变成:

1️⃣ 打开网页
2️⃣ 拖入 TS 文件
3️⃣ 点击合并
4️⃣ 下载 MP4

整个过程:

  • 不上传视频
  • 不安装软件
  • 不需要命令行

浏览器直接完成视频处理。

如果你想体验类似的工具,可以参考这个在线 TS 合并工具:

https://ezwebtools.net/ts-merge

它的交互流程和设计思路与我实现的版本比较接近。

六、浏览器端视频处理的优势

使用 ffmpeg.wasm 做视频工具,其实有几个非常明显的优势。

1 隐私安全

视频始终在本地处理:

  • 不上传服务器
  • 不经过第三方存储

2 几乎零运维成本

服务器只需要:

  • 静态文件
  • CDN

不需要:

  • GPU
  • 编码服务器
  • 视频存储

3 跨平台

只要有浏览器:

  • Windows
  • macOS
  • Linux
  • Android
  • iOS

都可以使用。

七、开发过程中的一些坑

在实现这个工具时,也遇到了一些实际问题。

1 浏览器内存限制

TS 文件如果:

  • 几 GB

浏览器可能会出现内存压力。


2 wasm 首次加载较慢

首次加载 ffmpeg.wasm:

  • 需要下载十几 MB

可以通过:

  • CDN
  • 缓存

优化体验。

八、总结

以前做视频处理:

需要安装软件、写命令、配置环境。

现在通过 ffmpeg.wasm,浏览器本身就可以成为一个轻量级的视频处理平台。

像 TS 合并这种常见需求,其实只需要:

  • 文件上传
  • concat 列表
  • FFmpeg 执行

三步就能完成。

而用户体验也从:

复杂命令行操作

变成:

拖文件 → 点击 → 下载

这也是 WebAssembly 在前端工具领域一个非常典型的应用场景。

相关文章
|
7月前
|
人工智能 弹性计算 自然语言处理
阿里云怎样部署OpenClaw?2026年保姆级攻略来了!
OpenClaw怎样部署?阿里云推出了OpenClaw快速部署方案,零基础也能轻松上手,仅需三步即可拥有专属AI助理!
907 8
|
9月前
|
编解码 Ubuntu 应用服务中间件
手把手教你搭建 Nginx-RTMP 流媒体服务器(Ubuntu/Windows)
本文作者为EZ在线工具网站长,专注多媒体技术与浏览器端工具开发。文章详细介绍如何在Ubuntu和Windows系统编译部署Nginx-RTMP流媒体服务器,实现OBS推流、VLC/浏览器拉流的完整链路,涵盖配置、防火墙、推拉流及内网穿透等实战内容。
2398 9
手把手教你搭建 Nginx-RTMP 流媒体服务器(Ubuntu/Windows)
|
7月前
|
Ubuntu Linux Docker
超全 Docker 镜像源配置指南|Windows/Mac/Linux一键搞定,拉镜像再也不卡顿
Docker拉取官方镜像慢到离谱,要么超时报错,要么中途断连,折腾半天连基础镜像都拉不下来,直接拖慢整个开发进度。 其实解决办法很简单——配置专属镜像源!今天给大家带来镜像源全平台配置教程,覆盖Linux(Ubuntu/CentOS通用)、Windows/Mac版Docker Desktop,甚至Mac专属轻量工具OrbStack,一步一图+命令复制即用,彻底告别镜像拉取卡顿!
4681 10
|
7月前
|
存储 C语言 内存技术
C语言深度解析:大小端字节序——多字节数据的底层存储规则
大小端指CPU对多字节数据在内存中的存放顺序:大端高字节存低地址,小端反之。x86/ARM默认小端,网络字节序统一为大端。跨平台、网络通信、二进制协议开发中必须显式处理字节序转换,否则数据解析必错。
1336 138
|
6月前
|
Java 大数据 双11
一张图看懂 Java 能干什么——从淘宝下单到双11抢货,背后都是它
本文专为Java零基础小白打造,用通俗比喻讲清Java本质(“万能翻译官”)、跨平台特性及核心优势;解析其在电商、支付等真实场景的应用;破除“Java已死”误区,结合数据说明其持续强势;并给出清晰入门路径与实用学习建议,助你科学起步。
一张图看懂 Java 能干什么——从淘宝下单到双11抢货,背后都是它
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
大模型应用:医疗视角看脑电图新应用:大模型让脑电波直观的表达.79
本文介绍脑电图(EEG)与大模型融合的前沿应用:无需开刀,仅通过头皮电极采集脑电信号,即可实时解码“想喝水”“想说话”等大脑意图,并转换为自然语言文字。该技术突破传统诊断边界,已在渐冻症沟通、神经康复和脑机交互中落地,兼具无创性、实时性与临床实用性。
421 17
|
6月前
|
人工智能 弹性计算 关系型数据库
阿里云企业新用户定义及专属优惠政策解读
阿里云面向企业新用户推出多重专属优惠:需完成企业实名认证、无历史付费记录、同一主体仅享一次。涵盖38元/年起的轻量服务器、199元/年u1实例、5亿算力补贴、最高4万元AI抵扣金及10万元出海资源包,助力中小企业降本增效、快速上云。
589 12
|
6月前
|
人工智能 弹性计算 自然语言处理
阿里云学生算力包:大学生上云练手、做毕设、玩 AI 的全能方案
阿里云推出“学生算力包”,19元起享灵活按小时抵扣的云资源,支持一键部署AI简历、个人网站等实战项目;深度联动清华、浙大等数十所高校,提供课程、实训营与赛事支持,助力学生低成本入门AI开发与云实践。
846 9
|
6月前
|
数据采集 人工智能 缓存
ModelEngine思想落地指南:用“智能体 + 插件”构建可复用AI应用.76
ModelEngine是一种AI应用开发范式,通过角色化智能体分工、插件化工具集成与双模式(低代码+代码)开发,解决重复造轮子、流程碎片化、技术门槛高等痛点,实现高效、灵活、可复用的AI应用构建。
494 13
|
6月前
|
机器学习/深度学习 存储 人工智能
大模型应用:批量文档摘要与分类实践:本地合同、报告数据处理与导出.70
本方案基于Qwen 1.5 7B大模型,实现本地化批量文档处理:自动读取Word/PDF,经TextSplitter智能分块、Schema引导式提示,生成标准化摘要与多标签分类,最终导出CSV。全程离线运行,保障敏感数据安全,显著提升合同、报告等高频文档的处理效率与准确性。
844 16