linux下将多个ts文件合并为一个MP4文件

时间:2024-03-07 20:57:26

1. 安装ffmpeg工具

sudo apt  install ffmpeg

2. 确保所有ts文件无损坏后,确保当前目录(即存放ts文件的目录)无txt文件及mp4文件,在存放ts文件的目录下建立test文件夹,将所有ts文件拷贝到test,运行以下脚本(该脚本与test文件夹在同一级目录)

大致目录结构:

.
├── film_00000.ts
├── film_00001.ts
├── ... ...
├── test
│   ├── film_00000.ts
│   ├── film_00001.ts
│   ├── ... ...
└── ts2mp4.py

import os

def get_tslist(_list, outname):
    _list.sort(key= lambda x:int(x[5:9]))
    out_list = \'concat:\'
    for n in _list:
        out_list = out_list + n + \'|\'
    str1 = \'ffmpeg -i \'
    str2 = \' -acodec copy -vcodec copy -absf aac_adtstoasc \'
    end_list = str1 + "\"" +out_list[:-1] + "\"" + str2 + outname
    os.system(end_list)

def get_mp4list(dstroot, outname2):
    __list = os.listdir(dstroot)
    __list.sort()
    print(__list)
    _list = []
    for n in __list:
        if n[-3:] == \'.ts\':
            _list.append(n)
    _list.sort(key= lambda x:int(x[5:9]))
    print(_list)
    print(_list)
    temp = []
    cnt = 0
    cnt2 = 1
    cnt3 = 0
    for n in _list:
        if n[-3:] == \'.ts\':
            temp.append(n)
            cnt = cnt + 1
            cnt3 = cnt3 + 1
            if cnt == 10 or cnt3 == len(_list):
                outname = str(cnt2) + \'.mp4\'
                get_tslist(temp, outname)
                temp = []
                cnt = 0
                cnt2 = cnt2 + 1
    end_mp4(outname2)

def end_mp4(outname2):
    __list = os.listdir(\'./\')
    _list = []
    for n in __list:
        if n[-4:] == \'.mp4\':
            _list.append(n)
    _list.sort()
    cnt = 0
    for k in _list:
        if k[-4:] == \'.mp4\':
            cnt = cnt + 1

    for m in range(len(_list)):
        n = str(m+1) + \'.mp4\'
        print(n)
        str1 = \'file \' + n + \'\n\'
        f = open(\'1.txt\', \'a+\')
        f.write(str1)
        f.close()
        if m == cnt:
            break
    end_str = \'ffmpeg -y -f concat -safe 0 -i \' + \'1.txt\' + \' -c copy output.mp4\'
    print(end_str)
    os.system(end_str)

if __name__ == "__main__":
    dstroot = \'./test\'
    outname = \'out.mp4\'
    get_mp4list(dstroot, outname)

3. 保存当前名为out.mp4的视频文件,其他的文件删掉即可