前言:最近在爬取某個網(wǎng)站的視頻,但是里面的視頻數(shù)據(jù)是以ts文件的形式給出的。一個大的視頻被切分成了很多小的ts視頻,所以,合并這些ts視頻就成為必要的了。我在網(wǎng)上搜到了三種方法,現(xiàn)在整理出來分享給大家,同時方便自己以后作參考。
方法一:用python調(diào)用windows命令行,使用copy命令進(jìn)行合并。
copy命令格式:
copy /b 所有ts文件的父目錄/*.ts 合成后的文件的絕對路徑
舉例:
1,將F:\f\目錄下的所有ts文件合成為一個名為new.ts的文件,并存放在E:\f\下面
copy /b F:\f\*.ts E:\f\new.ts
2,將F:\f\目錄下的所有ts文件合成為一個名為new.mp4的文件,并存放在E:\f\下面
copy /b F:\f\*.ts E:\f\new.mp4
相關(guān)python代碼:
import os
def merge_ts2():
os.system('copy /b ' + r'F:\f\*.ts ' + r'E:\f\new.ts')
print("合并成功")
目前在使用該方法時還沒發(fā)現(xiàn)ts文件數(shù)量限制
該方法的缺陷:
- 文件夾下的所有ts文件都會被合并
- 文件夾下的ts文件的命名必須按照字母順序排列, 否則合并文件后視頻片段會產(chǎn)生混亂.(注意:名為‘10.ts’的文件的順序會排在名為'9.ts'文件的前面,也就是說,這里的字母順序是指字符串的順序。如果要用字符數(shù)字來命名ts文件,那么就需要給某些數(shù)字加上前導(dǎo)0)
- 有些視頻合成之后可能會有卡頓
- 如果合并時出錯了的話,python編譯器不會報錯
方法二:直接使用python的文件操作
python代碼:
import os
def merge_ts(path):
file_names = os.listdir(path)#獲取path目錄下所有文件的文件名
index = 0
#新建一個名為test1.ts的文件,并打算將其余ts文件全部寫入到這個文件中
f0 = open(path+'test1.ts', 'ab')#可以在這行代碼處通過更改test1的后綴來更改合成后的文件類型
for one in file_names:
#先檢查當(dāng)前文件是不是ts文件
file_suffix = one.split('.')[1]
if file_suffix != 'ts':#如果當(dāng)前文件不是ts文件,那就跳過
continue
index += 1
print(index, "準(zhǔn)備合并第"+str(index)+"個視頻")
f1 = open(path+one, "rb")
f0.write(f1.read())#將當(dāng)前ts文件寫入到test1.ts之中
f1.close()
f0.close()
目前在使用該方法時還沒發(fā)現(xiàn)ts文件數(shù)量限制
該方法的缺陷:
- 合成后的視頻可能會有卡頓
- .注意各個文件名之間的順序
方法三:使用ffmpeg合并視頻
FFmpeg是集成解碼、編碼、轉(zhuǎn)碼、復(fù)用、解復(fù)用、流化、濾波、播放等完整解決方案的多媒體開源程序,在多媒體領(lǐng)域廣泛使用,可以用它來剪輯、拼接視頻。
下載ffmpeg:
官網(wǎng):
Download FFmpeg
點進(jìn)去后:
?
?下滑,找到這個界面并點擊:
?網(wǎng)速可能會比較慢。
解壓路徑可選,我就直接解壓在C盤下面了。
假設(shè)我們下載后的ffmpeg文件名為ffmpeg-2023-03-23-git-30cea1d39b-essentials_build
那么找到它下面的bin文件夾:
C:\ffmpeg-2023-03-23-git-30cea1d39b-essentials_build\bin
配置環(huán)境變量以及判斷是否成功:
將上述路徑添加進(jìn)系統(tǒng)環(huán)境變量path當(dāng)中。
在cmd下輸入ffmpeg
出現(xiàn)該界面即成功
?
這一步可以參考:使用 ffmpeg 進(jìn)行視頻(ts)合并_ffmpeg合并視頻_BeefpasteC的博客-CSDN博客
使用ffmpeg合并視頻:
需要先把文件名保存到 文本文本中,而且格式必須一致,不能有中文,格式如下:
file '文件名'
?這一步其實可以用python的文件操作完成,本文將在后面給出相應(yīng)的python代碼。
接下來就是python調(diào)用命令行操作----使用ffmpeg合并視頻
核心代碼:
#其中ffmpeg_bin_dic代表ffmpeg的bin目錄,比如:
#C:/ffmpeg-2023-03-23-git-30cea1d39b-essentials_build/bin/
#path+'file_list.txt'是剛剛新建的包含所有ts文件的txt文件絕對路徑,比如:
#C:/新建文件夾/file_list.txt
#save_path+ out_file_name代表保存合成后的ts文件的絕對路徑
os.system(ffmpeg_bin_dic+'ffmpeg -f concat -safe 0 -i '+path+'file_list.txt'+' -c '+ ' copy ' +save_path+ out_file_name)
python代碼:文章來源:http://www.zghlxwxcb.cn/news/detail-453964.html
import os
def test(path, save_path):
file_names = os.listdir(path)
if 'file_list.txt' in file_names:
os.remove(path+'file_list.txt')
out_file_name = 'output.mp4'
while out_file_name in os.listdir(save_path):
out_file_name = '新' + out_file_name
f = open(path+'file_list.txt', 'w+')
for one in file_names:
f.write("file '" + one + "'\n")
f.close()
print("生成txt文件成功!")
start = datetime.datetime.now()
print('開始合成,初始時間為:',datetime.datetime.now())
ffmpeg_bin_dic = 'C:/237端點/軟件/ffmpeg/ffmpeg-2023-03-23-git-30cea1d39b-essentials_build/bin/'
os.system(ffmpeg_bin_dic+'ffmpeg -f concat -safe 0 -i '+path+'file_list.txt'+' -c '+ ' copy ' +save_path+ out_file_name)
print('合成后的當(dāng)前時間為:',datetime.datetime.now())
print('合成視頻完成!用時:'+str(datetime.datetime.now()-start))
這種方法比起上面兩種方法而言,碰到錯誤時會報錯(方便調(diào)試),而且,不會出現(xiàn)卡頓的現(xiàn)象(這一點做得很好)文章來源地址http://www.zghlxwxcb.cn/news/detail-453964.html
寫在最后:如有錯誤,敬請指正,禮貌交流,感激不盡
到了這里,關(guān)于python合并ts視頻(三種方法)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!