【BUG】Python3|COPY 指令合并 ts 文件为 mp4 文件时长不对(含三种可执行源代码和解决方法)
文章目录
- 前言
- 源代码
- FFmpeg的安装
- 1 下载
- 2 安装
 
 
前言
参考:
- python 合并 ts 视频(三种方法)
- 使用 FFmpeg 合并多个 ts 视频文件转为 mp4 格式
Windows 平台下,用 Python 合并 ts 文件为 mp4 文件常见的有三种方法:
- 调用 COPY 指令,运行copy /b *.ts output.mp4;需要注意的是[1],这里提到的 copy 指令应该运行在 cmd 中,而不是 PowerShell 中。因为 Windows 在 PowerShell 的时候运行 copy 指令会调用内置的 Copy-Item 命令,和 cmd 调用的 copy 在用法和功能上都不相同。若你非要在 PowerShell 中运行 CMD 的 COPY 指令,你可以使用cmd /c "copy /b *.ts output.mp4"。
- Python 文件读写,使用 open, read, write 这些指令去合并,注意打开文件的方式是 rb 和 wb;
- 使用 ffmpeg,运行ffmpeg -f concat -safe 0 -i file.txt -c copy output.mp4,其中file.txt中每行的格式是file "xxx.ts";或者运行ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4,其中 1.ts|2.ts 需要换成自己的 ts 文件名列表,并以|分隔。
需要注意的是,以上的三种方式,都需要 TS 文件名排序按照实际的播放顺序。如果文件名与实际播放顺序不符合,那需要修改一下文件的名字。
其中前两种方式合并的视频,时长都可能出错。这也是我写这篇文章的原因。第三种方式 ffmpeg 是最稳健的。比如 copy 指令合并了 100 个 ts 文件,但是打开之后发现合并的结果竟然只有十多秒,并且更离谱的是,这十多秒放完之后,这个视频并不会暂停,而是会继续往后播放,并且播放的内容是正确的。这种情况我的建议是,大量的 ts 合并就直接使用第三种方式 ffmpeg,这就是我提出的解决办法。
源代码
这三种方式的 python 代码如下,想用哪一种方式,就把其他两种方式的代码注释掉就可以。
 请把以下源代码放在 ts 文件所在的目录下。
 其中,前两种方式不需要安装任何的东西。而第三种方式需要安装 ffmpeg,并添加环境变量。安装方式会在后文提到。
# combine ts to mp4import os
file_names = os.listdir(os.getcwd())# 过滤出非空的 ts 文件
file_names = [file_name for file_name in file_names if file_name.endswith('.ts') and os.path.getsize(file_name) != 0]# 方式一:用 COPY 指令合并
file_names_combine = '+'.join(file_names)
os.system(f'copy /b {file_names_combine} output.mp4')# 方式二:用 python 代码合并
with open('output.mp4', 'wb') as f:for file_name in file_names:with open(file_name, 'rb') as f1:f.write(f1.read())# 方式三:用 ffmpeg 合并
# 3.1 少量 ts 文件
file_names_combine = '|'.join(file_names)
os.system(f'ffmpeg -i "concat:{file_names_combine}" -c copy output.mp4')
# 3.2 大量 ts 文件
file_names_file = 'tmp_random_file.txt'
with open(file_names_file, 'w') as f:# file xxx.tsfor file_name in file_names:f.write(f"file '{file_name}'\n")
os.system(f'ffmpeg -f concat -safe 0 -i {file_names_file} -c copy output.mp4')
os.remove(file_names_file)
这里的第三种方式中分两种情况,一种是 ts 数量比较少的,可以直接字符串拼接来完成指令;另一种是数量比较多的,建议用文件,因为第一种有数量限制。
FFmpeg的安装
1 下载
官网:Download FFmpeg
 官网的下载路径比较曲折,点来点去,反正最后可以点到 Github 上:Releases · BtbN/FFmpeg-Builds,点开这个链接,然后根据自己的版本下载一个就行,如下图所示:

2 安装
解压,记住自己解压的位置,然后打开那个位置。比如你解压的路径,假如叫做D:\software\ffmpeg,那你就将D:\software\ffmpeg\bin添加到环境变量里面,这样你在终端里就可以找到ffmpeg指令了。

安装好了之后,打开 CMD,输入ffmpeg,应该能看到如下内容:

本账号所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/qq_46106285/article/details/140321819。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。
相关文章:
 
【BUG】Python3|COPY 指令合并 ts 文件为 mp4 文件时长不对(含三种可执行源代码和解决方法)
文章目录 前言源代码FFmpeg的安装1 下载2 安装 前言 参考: python 合并 ts 视频(三种方法)使用 FFmpeg 合并多个 ts 视频文件转为 mp4 格式 Windows 平台下,用 Python 合并 ts 文件为 mp4 文件常见的有三种方法: 调用…...
 
AI克隆声音,基于函数计算部署GPT-Sovits语音生成模型
阿里云的基于函数计算部署GPT-Sovits语音生成模型 可以直接文字转语音,也可以上传一段自己的语音,根据你上传的语音进行语音播报。 一、打开阿里云的函数计算 https://developer.aliyun.com/adc/scenario/808348a321844a62b922187d89cd5077 还是 函数…...
DP讨论——建造者模式
学而时习之,温故而知新。 敌人出招(使用场景) 组合关系中,如果要A对象创建B对象,或者要A对象创建一堆对象,这种是普遍的需求。 你出招 这种适合创建者模式,我感觉也是比较常见的。 构造函数…...
 
【JavaScript】解决 JavaScript 语言报错:Uncaught SyntaxError: Unexpected token
文章目录 一、背景介绍常见场景 二、报错信息解析三、常见原因分析1. 缺少必要的语法元素2. 使用了不正确的字符或符号3. JSON 格式错误4. 字符串未正确闭合 四、解决方案与预防措施1. 检查语法元素2. 正确使用符号和字符3. 修正 JSON 格式4. 字符串闭合 五、示例代码和实践建议…...
 
oracle数据库的plsql免安装版安装
这个是连接oracle数据库的,注意安装不能有中文路径。以下只是示例。 1、打开D:\ruanjian\plsql\plsql\plsql,发送plsqldev.exe快捷方式到桌面。 2、新弹出的页面填写cancel,什么也不写。 3、将instanceclient解压,并复制文件路径。 修改tool…...
stm32使用通用定时器生成pwm
Driver_TIM5.c 通用定时器的通道1和2可以做时钟源 #include "Driver_TIM5.h"void Driver_TIM5_Init(void) {/* 1. 开启时钟*//* 1.1 定时器5的时钟 */RCC->APB1ENR | RCC_APB1ENR_TIM5EN;/* 1.2 GPIO的时钟 PA */RCC->APB2ENR | RCC_APB2ENR_IOPAEN;/* 2. 设…...
 
老物件线上3D回忆展拓宽了艺术作品的展示空间和时间-深圳华锐视点
在数字技术的浪潮下,3D线上画展为艺术家们开启了一个全新的展示与销售平台。这一创新形式不仅拓宽了艺术作品的展示空间,还为广大观众带来了前所未有的观赏体验。 3D线上画展制作以其独特的互动性,让艺术不再是单一的视觉享受。在这里&#x…...
 
对于多个表多个字段进行查询、F12查看网页的返回数据帮助开发、数据库的各种查询方式(多对多、多表查询、子查询等)。
对于多个表多个字段进行查询、F12查看网页的返回数据帮助开发、数据库的各种查询方式(多对多、多表查询、子查询等)。 一、 前端界面需要展现多个表的其中几个数据的多表查询。1. 三个表查询其中字段返回:(用一下sql语句ÿ…...
 
护网HW面试常问——组件中间件框架漏洞(包含流量特征)
apache&iis&nginx中间件解析漏洞 参考我之前的文章:护网HW面试—apache&iis&nginx中间件解析漏洞篇-CSDN博客 log4j2 漏洞原理: 该漏洞主要是由于日志在打印时当遇到${后,以:号作为分割,将表达式内容分割成两部…...
 
招投标数据采集:为企业决策提供数据支持
在当今数据驱动的时代,招投标信息作为行业竞争情报的重要组成部分,正日益成为企业制定战略决策的关键依据。本文将深入探讨招投标数据采集的重要性,以及它如何为企业决策提供强有力的数据支持,同时揭秘如何高效、精准地获取这些数…...
 
02:项目二:感应开关盖垃圾桶
感应开关盖垃圾桶 1、PWM开发SG901.1、怎样通过C51单片机输出PWM波?1.2、通过定时器输出PWM波来控制SG90 2、超声波测距模块的使用3、感应开关盖垃圾桶 需要材料: 1、SG90舵机模块 2、HC-SR04超声波模块 3、震动传感器 4、蜂鸣器 5、若干杜邦线 1、PWM开…...
 
eNsp公司管理的网络NAT策略搭建
实验拓扑图 实验需求: 7,办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) 8,分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 9,多出口环境基于带…...
 
MUR2060CTR-ASEMI无人机专用MUR2060CTR
编辑:ll MUR2060CTR-ASEMI无人机专用MUR2060CTR 型号:MUR2060CTR 品牌:ASEMI 封装:TO-220 批号:最新 最大平均正向电流(IF):20A 最大循环峰值反向电压(VRRM&#…...
 
Manim的代码练习02:在manim中Dot ,Arrow和NumberPlane对象的使用
Dot:指代点对象或者表示点的符号。Arrow:指代箭头对象,包括直线上的箭头或者向量箭头等。NumberPlane:指代数轴平面对象,在Manim中用来创建包含坐标轴的数学坐标系平面。Text:指代文本对象,用来…...
datawhale - 基于术语词典干预的机器翻译挑战赛 (一)
文章目录 torchtext 库是干什么用的 ?TranslationDataset 类定义 Seq2Seq模型EncoderDecoderSeq2Seq 类 load_terminology_dictionary 函数示例用法 train 函数主程序代码模型评价load_sentences 函数translate_sentence 函数evaluate_bleu 函数主程序 测试集上进行…...
【JavaScript脚本宇宙】提升用户体验:探索 JavaScript 命令行界面开发工具
构建交互式命令行:JavaScript 中的 CLI 开发利器 前言 在现代软件开发中,命令行界面(CLI)和终端应用程序的开发变得越来越重要。为了提高用户体验和交互性,使用合适的工具和库是至关重要的。本文将介绍一些用于构建命…...
ubuntu18.04安装显卡驱动后无法进入桌面的解决办法
我没有尝试完美恢复的方法,只尝试了卸载nvidia显卡的方法 1.第一步 进 安开机键进入 1 开机进入 选项界面,选择高级模式(ubuntu 高级选项) 2.第二步 进去以后选择一个括号里面带recovery mode的选项,数字选最高最大的。 3.然后…...
 
javaScript的面试重点--预解析
目录 一.前言 二.预解析案例 一.前言 关于预解析,我们通过今天学习就能够知道解析器运行JS分为哪两步;能够说出变量提升的步骤和运行过程;能够说出函数提升的步骤和运行过程。 二.预解析案例 预解析,简而言之,也就是…...
 
Gitea 仓库事件触发Jenkins远程构建
文章目录 引言I Gitea 仓库事件触发Jenkins远程构建1.1 Jenkins配置1.2 Gitea 配置引言 应用场景:项目部署 I Gitea 仓库事件触发Jenkins远程构建 Gitea支持用于仓库事件的Webhooks 1.1 Jenkins配置 高版本Jenkins需要关闭跨域限制和开启匿名用户访问 在Jenkins启动前加入…...
 
springboot+vue 开发记录(九)后端打包部署运行
本篇文章主要内容是后端项目写好了,怎么打包部署到服务器上运行。 文章目录 1. 在服务器上安装Docker2. 在Docker中装MySQL3. 在Docker中设置网桥,实现容器间的网络通信4. 修改后端配置文件5. 修改pom.xml文件6. 打包7. 编写DockerFile文件8. 上传文件到…...
 
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
 
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
 
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
