python脚本使用ffmeg合并超多ts文件到.mp4

遇到的坑:

  • 合并ts文件过多时提示”too many open files”错误
  • ffmpeg不支持mp4文件的合并

刚开始完python,感觉python操作起文件真爽,一些基本的函数我都感觉特别高大上啊[捂脸]:

  • os.listdir()列出文件夹所有文件并等额分割
  • 路径与文件名完美拼接
  • ffmpeg合并ts文件到mp4
  • ffmpeg合并多个mp4文件到一个mp4

贴代码

import os
dirs = "/data/vod/ts/"
mp4 = "/data/vod/mp4/"
filename = "asddaas.mp4"
a = 1
content = ""
lists = os.listdir(dirs)
b = [lists[i:i+250] for i in range(0,len(lists),250)]
for lis in b:
    cmd = "cd %s && ffmpeg -i \"concat:"%mp4
    for file in lis:
        if file != '.DS_Store':
            file_path = os.path.join(dirs, file)
            cmd += file_path + '|';
            # print("文件:%s"%file_path)
    cmd = cmd[:-1]
    cmd += '" -bsf:a aac_adtstoasc -c copy -vcodec copy %s.mp4'%a
    try:
        os.system(cmd)
        content += "file '%s.mp4'\n"%a
        a = a+1
    except:
        print("Unexpected error")

fp = open("%smp4list.txt"%mp4,'a+')
fp.write(content)
fp.close()
mp4cmd = "cd %s && ffmpeg -y -f concat -i mp4list.txt -c copy %s"%(mp4,filename)
os.system(mp4cmd)
  • 合并ts文件过多时总是提示”too many open files”错误
    系统支持最大打开文件数有限制。终端输入 >ulimit -n 查看最大打开文件数量.我的电脑最大限制为256。自己设置 >ulimit -n 256000 提示设置成功但运行ffmpeg合并命令仍然报错。最后只好将所有ts文件切片分到不同数组中。

  • lists = os.listdir(dirs)
    b = [lists[i:i+250] for i in range(0,len(lists),250)]
    将dirs下所有文件名放到lists中 并以250个元素一组分割,不够250视为一组。list = [1,2,3,4,5] a=[list[i:i+2] for i in range(0,len(list),2)]此时打印a将会看到 a=[[1,2],[3,4],[5,]]

  • 合并ts文件到mp4文件:ffmpeg -i “concat:1.ts|2.ts|3.ts|4.ts|5.ts -bsf:a aac_adtstoasc -c copy -vcodec copy 1.mp4

  • ffmpeg不支持直接mp4文件的合并,查了一下好多是说先说mp4文件转ts文件在进行合并,太麻烦。找到一种将所有mp4文件名放到一个txt文件中再去合并txt文件,刚好符合预期。就喜欢这种简单暴力的方法:ffmpeg -y -f concat -i mp4list.txt -c copy asddaas.mp4
    mp4list.txt文件内容:
    file “1.mp4”
    file “2.mp4”
    file “3.mp4”

你可能感兴趣的:(玩物丧志)