【BUG】Python3|COPY 指令合并 ts 文件为 mp4 文件时长不对(含三种可执行源代码和解决方法)

文章目录

    • 前言
    • 源代码
    • FFmpeg的安装
      • 1 下载
      • 2 安装

前言

参考:

  1. python 合并 ts 视频(三种方法)
  2. 使用 FFmpeg 合并多个 ts 视频文件转为 mp4 格式

Windows 平台下,用 Python 合并 ts 文件为 mp4 文件常见的有三种方法:

  1. 调用 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"
  2. Python 文件读写,使用 open, read, write 这些指令去合并,注意打开文件的方式是 rb 和 wb;
  3. 使用 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。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/45964.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS NEXT:一次开发,多端部署

寄语 这几年特别火的uni-app实现了“一次开发,多端使用”,它这个端指的是ios、安卓、各种小程序这些,而HarmonyOS NEXT也提出了“一次开发,多端部署”,而它这个端指的是终端设备,也就是我们的手机、平板、电…

MySQL-MySQL数据类型

文章目录 〇. 数据类型分类一、整形1. tinyint [unsigned]2. bit[(M)] 二、浮点数类型float[(m, d)] [unsigned]decimal(m, d) [unsigned] 三、字符串类型1.char(L)2.varchar(L) 四、日期类型五、enum和set查询enum和set 总结 〇. 数据类型分类 一、整形 整形我们今天只讲两个…

整洁架构SOLID-接口隔离原则(ISP)

文章目录 定义ISP与编程语言ISP与软件架构小结 定义 在上图中有多个用户需要操作OPS类。现在,我们假设这里的User1只需要使用op1,User2只需要使用op2,User3只需要使用op3。 在这种情况下,如果OPS类是用Java编程语言编写的,那么很明显&#x…

对B-树的理解

目录 前言-为什么要使用B-树?B-树概念 前言-为什么要使用B-树? 首先,我们正常的搜索都有一下方式: 搜索二叉树,极端场景下会退化,类似于单支,此时的效率变成了O(N);为了解决1的问题…

spring boot(学习笔记第十三课)

spring boot(学习笔记第十三课) Spring Security的logout,传统后端开发模式和前后端分离模式的不同,invalidateHttpSession不好用,bug? 学习内容: 传统后端开发模式 vs 前后端分离模式Spring Security的logout功能 1.…

最新 Kubernetes 集群部署 + Containerd容器运行时 + flannel 网络插件(保姆级教程,最新 K8S 1.28.2 版本)

资源列表 操作系统配置主机名IP所需插件CentOS 7.92C4Gk8s-master192.168.60.143flannel-cni-plugin、flannel、coredns、etcd、kube-apiserver、kube-controller-manager、kube-proxy、 kube-scheduler 、containerd、pause 、crictlCentOS 7.92C4Gk8s-node01192.168.60.144f…

Python 实现股票指标计算——BOLL布林线

1 公式 中轨线 N日的移动平均线,N一般取20 上轨线 中轨线 X倍的标准差,X一般取2 下轨线 中轨线-Y倍的标准差, Y一般取2 2 数据准备 我们以科创50指数 000688 为例,指数开始日期为2019-12-31,数据格…

强化学习:bellman方程求解state value例题

最近在学习强化学习相关知识,强烈推荐西湖大学赵世钰老师的课程,讲解的非常清晰流畅,一路学习下来令人身心大爽,感受数学抽丝剥茧,化繁为简的神奇魅力。 bellman方程还是比较容易理解的:当前状态下的state …

java Web学习笔记(三)

文章目录 1. 前置知识2. Vue使用vite构建项目SFC入门使用ref和.value体会响应式数据&#xff08;使用ES6和setup&#xff09; 3. Vue视图渲染技术及其语法模板语法&#xff1a;命令插值表达式渲染双标><中的文本&#xff08;还挺可爱&#xff09;属性渲染命令事件渲染命令…

UWB定位系统在智能制造行业中的主要功能

定位系统全套源码&#xff0c;UWB定位系统 UWB&#xff08;超宽带&#xff09;定位系统在智能制造行业赋能可以实现多种功能&#xff0c;这些功能不仅提升了企业的管理水平和生产效率&#xff0c;还增强了生产现场的安全性和灵活性。 开发语言&#xff1a;JAVA 开发工具&…

vue3使用Echarts图表生成项目进度甘特图

先看效果 代码展示 <template><h1>项目进度甘特图</h1><div id"app"><!-- Echarts 图表 --><div ref"progressChart" class"progressChart"></div></div> </template><script setup&…

微博图片下载助手

开发的一款「微博图片下载助手」支持一键保存用户图片 / 原图保存 / 支持保存 live 动图&#xff0c;支持免登录&#xff0c;但是不支持去水印哦。另外软件是易语言编写的&#xff0c;一些杀毒软件可能会误报。 链接: https://pan.baidu.com/s/1ZwDuuS2AF0-nxGgYYPve_g?pwdwn…

Qt项目中添加自定义文件夹,进行整理归类

Qt项目中添加文件夹进行归类 1、在windows的工程目录下创建一个文件夹&#xff0c;如widgets 2、将.h 、.cpp、.ui文件拷贝到windows该文件夹widgets 3、在qt工程中&#xff0c;根目录右键&#xff0c;选择添加现有文件&#xff0c;批量选择 .h 、.cpp、.ui文件之后&#xf…

内网信息收集:手动、脚本和工具查IP、端口

1.手动查IP和端口 2.工具查IP 3.工具查端口 我们在内网中拿下目标机器后&#xff0c;需要进行一系列的信息收集&#xff0c;以下为总结的收集方法 1.手动信息收集&#xff1a; 以下命令在CS执行时命令前须加shell,如&#xff1a;shell ipconfig 1.收集IP网卡&#xff1a; ip…

使用Jan,把你的PC变成AI机器!支持在Windows,MacOS,Linux上运行大语言模型

最近有个概念叫“AIPC” ,听起来很牛逼,其实就是让PC运行AI算法&软件,比如运行大语言模型。 我们并不需要特意去买台联想电脑,完全可以用现成的软件把你的电脑变成AIPC。 昨天分享了一个运行Llama3大语言模型的软件叫LMStudio。 有人在评论中反馈,有更好的开源软件叫…

LabVIEW学习-LabVIEW储存Excel表格

上述实现了将格式化的时间和正弦波的频率振幅相位以及正弦波数据输入到excel表格中。 下面介绍其中使用到的函数&#xff1a; 1. 所在位置&#xff0c;函数选板->定时->获取日期/时间(秒) 2. 将获取的时间进行格式化处理&#xff0c;输出格式化的日期/时间字符串。 函…

MySQL更新和删除(DML)

DML-修改数据 UPDATE 表名 SET 字段1 值1&#xff0c;字段2值2&#xff0c;....[WHERE 条件] 例如 1.这个就是把employee表中的这个name字段里面并且id字段为1的名字改为itheima update employee set nameitheima where id 1; 2.这个就是把employee这个表中的name字段和…

acrobat 中 PDF 复制时不能精确选中所选内容所在行的一种解决方法

现象&#xff1a;划取行的时候&#xff0c;自动扩展为多行 如果整段选中复制&#xff0c;粘贴后是乱码 解决步骤 识别完&#xff0c;保存 验证 可以按行复制了。

【算法】平衡二叉树

难度&#xff1a;简单 题目 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 示例&#xff1a; 示例1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;true 示例2&#xff1a; 输入&#xff1a;root [1,2,2,3,3,null,null,4,4] 输出&…

7.8 CompletableFuture

Future 接口理论知识复习 Future 接口&#xff08;FutureTask 实现类&#xff09;定义了操作异步任务执行的一些方法&#xff0c;如获取异步任务的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行是否完毕等。 比如主线程让一个子线程去执行任务&#xff0c;子线…