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

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

时间:2024-07-11 22:30:48浏览次数:21  
标签:文件 copy ffmpeg ts mp4 names file 源代码

文章目录

前言

参考:

  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 mp4

import 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.ts
    for 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。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

标签:文件,copy,ffmpeg,ts,mp4,names,file,源代码
From: https://blog.csdn.net/qq_46106285/article/details/140321819

相关文章

  • Keep Spreadsheets Responsive During Calculations
    KeepSpreadsheetsResponsiveDuringCalculationsSpreadJS17.1.0introducesincrementalcomputationwhichhelpsmaintainspreadsheetperformanceduringeventhemostcomplexdataprocessing.SpreadJSbyMESCIUSisaJavaScriptlibraryofferingaco......
  • Simple WPF: S3实现MINIO大文件上传并显示上传进度
    最新内容优先发布于个人博客:小虎技术分享站,随后逐步搬运到博客园。创作不易,如果觉得有用请在Github上为博主点亮一颗小星星吧!目的早两天写了一篇S3简单上传文件的小工具,知乎上看到了一个问题问如何实现显示MINIO上传进度,因此拓展一下这个小工具能够在上传大文件时显示进度。完......
  • 压缩文件的解析方式
            我们常用的压缩文件有两种:后缀为.zip或者.rar,接下来将介绍解析两种压缩文件的代码。需要用到三个jar包:commons-io-2.16.1.jar、junrar-7.5.5.jar、slf4j-api-2.0.13.jar,可以在官网下载,也可以发私信。        这段代码是一个Java程序,包含了一个main方......
  • 使用Java IO进行压缩文件的解析方式
    JavaIO库提供了对ZIP解压缩的支持,主要通过java.util.zip包中的类来实现。ZipEntry:表示ZIP文件中的一个条目,可以是文件或目录。ZipInputStream:用于进行zip格式的压缩文件输入流。ZipOutputStream:用于进行zip格式的压缩文件输出流。对ZIP格式的文件进行解压      ......
  • 如何处理压缩文件de方式总结!!!
    目录1.Java标准库中的压缩相关API2.解压缩过程3.第三方库4.使用第三方库的步骤5.参考代码1.Java标准库中的压缩相关APIJava的标准库java.util.zip提供了处理ZIP和GZIP格式压缩文件的功能。这个包包含以下主要类:(1)ZipFile:用于读取ZIP文件的元数据,如文件列表和注......
  • 深入解析Spring Boot的application.yml配置文件
    目录引言SpringBoot配置文件简介application.yml的优点基本结构与语法YAML语法基础SpringBoot中application.yml的基本结构常见配置项详解服务器配置数据源配置日志配置其他常见配置环境配置与Profile多环境配置激活Profile高级配置与技巧属性的占位符替换自定......
  • 彩虹猫源代码分析bat
    大家好,我今天把一个MEMZ样本用编译器编译成了bat,代码如下:@echooffechoUEsDBBQAAAAIAHV36kiQ6IfZcyEAAAA6AAAIAAAATUVNWi5leGXtew10U8e17kg6soUtjACbGGzi>xechoAxgMyD9Hlm1sY4JkW2AH/wjLP5BgB9k6RhKSjqIfbKcJyBgaqw65tM1NIJckNE1705Tcpi3JJWma>>xechoOD830Da0TptFSQO......
  • Keil5深度探索:高效生成hex、bin与lib文件全攻略
    前言Keil5是一款非常强大的嵌入式开发工具,它支持多种处理器和开发板,包括ARMCortex-M系列。在嵌入式开发中,生成hex、bin和lib文件是非常常见的需求。本文将详细介绍如何使用Keil5高效生成这些文件。原因1.用到IAP升级,需要bin文件2.给别人分享源代码,不想让别人看到源代码......
  • text2speech文生音频模型XTTS-V2部署带UI
    text2speech文生音频模型XTTS-V2部署带UI模型下载链接,及前端代码效果链接见个人博客:https://pylzzz.online效果图:python后端代码flask框架由于使用的是自己电脑的gpu运算,所以中间有转发的过程,利用内网穿透和虚拟局域网通信。内网穿透教程可见个人博客所需依赖tts......
  • 同一局域网网络下怎么实现大文件互传
    目录一、设置共享文件夹二、访问共享文件夹一、设置共享文件夹1.1、右击自己想要共享的文件夹并点击属性1.2、点击属性中的共享并将该文件夹设置成共享即可 1.3、共享完成后网络路径下会有一串路径二、访问共享文件夹2.1、按win+E键打开文件资源管理器2.2、......