分享

python合并ts视频(三种方法)_ts文件合并_fly

 福兮007 2023-10-06 发布于上海

前言:最近在爬取某个网站的视频,但是里面的视频数据是以ts文件的形式给出的。一个大的视频被切分成了很多小的ts视频,所以,合并这些ts视频就成为必要的了。我在网上搜到了三种方法,现在整理出来分享给大家,同时方便自己以后作参考。

方法一:用python调用windows命令行,使用copy命令进行合并。

  1. copy命令格式:
  2. copy /b 所有ts文件的父目录/*.ts 合成后的文件的绝对路径
  3. 举例:
  4. 1,将F:\f\目录下的所有ts文件合成为一个名为new.ts的文件,并存放在E:\f\下面
  5. copy /b F:\f\*.ts E:\f\new.ts
  6. 2,将F:\f\目录下的所有ts文件合成为一个名为new.mp4的文件,并存放在E:\f\下面
  7. copy /b F:\f\*.ts E:\f\new.mp4

相关python代码:

  1. import os
  2. def merge_ts2():
  3. os.system('copy /b ' + r'F:\f\*.ts ' + r'E:\f\new.ts')
  4. print("合并成功")

目前在使用该方法时还没发现ts文件数量限制

该方法的缺陷:

  • 文件夹下的所有ts文件都会被合并
  • 文件夹下的ts文件的命名必须按照字母顺序排列, 否则合并文件后视频片段会产生混乱.(注意:名为'10.ts’的文件的顺序会排在名为'9.ts'文件的前面,也就是说,这里的字母顺序是指字符串的顺序。如果要用字符数字来命名ts文件,那么就需要给某些数字加上前导0)
  • 有些视频合成之后可能会有卡顿
  • 如果合并时出错了的话,python编译器不会报错

方法二:直接使用python的文件操作

python代码:

  1. import os
  2. def merge_ts(path):
  3. file_names = os.listdir(path)#获取path目录下所有文件的文件名
  4. index = 0
  5. #新建一个名为test1.ts的文件,并打算将其余ts文件全部写入到这个文件中
  6. f0 = open(path+'test1.ts', 'ab')#可以在这行代码处通过更改test1的后缀来更改合成后的文件类型
  7. for one in file_names:
  8. #先检查当前文件是不是ts文件
  9. file_suffix = one.split('.')[1]
  10. if file_suffix != 'ts':#如果当前文件不是ts文件,那就跳过
  11. continue
  12. index += 1
  13. print(index, "准备合并第"+str(index)+"个视频")
  14. f1 = open(path+one, "rb")
  15. f0.write(f1.read())#将当前ts文件写入到test1.ts之中
  16. f1.close()
  17. f0.close()

目前在使用该方法时还没发现ts文件数量限制

该方法的缺陷:

  • 合成后的视频可能会有卡顿
  • .注意各个文件名之间的顺序

方法三:使用ffmpeg合并视频

FFmpeg是集成解码、编码、转码、复用、解复用、流化、滤波、播放等完整解决方案的多媒体开源程序,在多媒体领域广泛使用,可以用它来剪辑、拼接视频。

下载ffmpeg:

官网:

Download FFmpeg

点进去后:

 

 下滑,找到这个界面并点击:

 网速可能会比较慢。

解压路径可选,我就直接解压在C盘下面了。

假设我们下载后的ffmpeg文件名为ffmpeg-2023-03-23-git-30cea1d39b-essentials_build

那么找到它下面的bin文件夹:

C:\ffmpeg-2023-03-23-git-30cea1d39b-essentials_build\bin

配置环境变量以及判断是否成功:

将上述路径添加进系统环境变量path当中。

在cmd下输入ffmpeg

出现该界面即成功

 

这一步可以参考:使用 ffmpeg 进行视频(ts)合并_ffmpeg合并视频_BeefpasteC的博客-CSDN博客

使用ffmpeg合并视频:

需要先把文件名保存到 文本文本中,而且格式必须一致,不能有中文,格式如下:

file  '文件名'

 这一步其实可以用python的文件操作完成,本文将在后面给出相应的python代码。

接下来就是python调用命令行操作----使用ffmpeg合并视频

核心代码:

  1. #其中ffmpeg_bin_dic代表ffmpeg的bin目录,比如:
  2. #C:/ffmpeg-2023-03-23-git-30cea1d39b-essentials_build/bin/
  3. #path+'file_list.txt'是刚刚新建的包含所有ts文件的txt文件绝对路径,比如:
  4. #C:/新建文件夹/file_list.txt
  5. #save_path+ out_file_name代表保存合成后的ts文件的绝对路径
  6. os.system(ffmpeg_bin_dic+'ffmpeg -f concat -safe 0 -i '+path+'file_list.txt'+' -c '+ ' copy ' +save_path+ out_file_name)

python代码:

  1. import os
  2. def test(path, save_path):
  3. file_names = os.listdir(path)
  4. if 'file_list.txt' in file_names:
  5. os.remove(path+'file_list.txt')
  6. out_file_name = 'output.mp4'
  7. while out_file_name in os.listdir(save_path):
  8. out_file_name = '新' + out_file_name
  9. f = open(path+'file_list.txt', 'w+')
  10. for one in file_names:
  11. f.write("file '" + one + "'\n")
  12. f.close()
  13. print("生成txt文件成功!")
  14. start = datetime.datetime.now()
  15. print('开始合成,初始时间为:',datetime.datetime.now())
  16. ffmpeg_bin_dic = 'C:/237端点/软件/ffmpeg/ffmpeg-2023-03-23-git-30cea1d39b-essentials_build/bin/'
  17. os.system(ffmpeg_bin_dic+'ffmpeg -f concat -safe 0 -i '+path+'file_list.txt'+' -c '+ ' copy ' +save_path+ out_file_name)
  18. print('合成后的当前时间为:',datetime.datetime.now())
  19. print('合成视频完成!用时:'+str(datetime.datetime.now()-start))

这种方法比起上面两种方法而言,碰到错误时会报错(方便调试),而且,不会出现卡顿的现象(这一点做得很好)

写在最后:如有错误,敬请指正,礼貌交流,感激不尽

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多