首先说明一下Ts格式
TS(TransportStream,传输流)是一种封装的格式,它的全称为MPEG2-TS。MPEG2-TS是一种标准数据容器格式,传输与存储音视频、节目与系统信息协议数据,主要应用于数字广播系统,譬如DVB、ATSC与IPTV。传输流最初是为广播而设计的。后来,通过在标准的188字节数据包中添加4字节的时间码(TC),从而使该数据包成为192字节的数据包,使其适用于数码摄像机,录像机和播放器。
处理场景
爬取某鱼以及某些网站的视频,会获取到很多的以ts格式结尾的视频文件,这个时候需要进行合成成一个Ts视频文件或者MP4格式视频,我自己的电脑播放不了Ts后缀格式视频,于是就将Ts后缀格式视频转为了MP4。
直接使用os内置模块以下是代码:
import os
def merge_ts_video(ts_path, ts_path_):
all_ts = os.listdir(ts_path)
# 最好是对all_ts 进行排序处理一下
# 我这里获取到后直接对ts视频文件进行了排序处理,所以没有加排序操作
for file in all_ts:
with open(ts_path + file, 'rb') as f1: # 读取视频以二进制进行处理
with open(ts_path_ + "VideoName.mp4", 'ab') as f2: # 存储到指定位置,VideoName为变量值
f2.write(f1.read())
os.remove(os.path.join(ts_path, file)) # 将每次处理后的ts视频文件进行删除
merge_ts_video(r"./VideoPreliminaryStorage/", r"./VideoFinalStorage/")
# 函数调用:merge_ts_video
# 参数值:
# 参数1 存放 ts 的路径 VideoPreliminaryStorage
# 参数2 存放 mp4 的路径 VideoFinalStorage
以上内容虽然可以将Ts格式视频转为MP4格式,但是一些播放器无法识别出来,如:某音
转完之后是MP4,但是视频的格式变为了:媒体文件(.mp4) (.mp4)
所以还是使用ffmpeg了
"""
mp4 --> ts : ffmpeg -i 1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts
ts --> mp4 : ffmpeg -i 2.ts -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4
"""
先将所以的Ts格式视频合并成一个Ts格式文件,合并完成后进行转mp4
def merge_ts_video(ts_path, ts_path_, ffmpeg_path, video_name):
all_ts = os.listdir(ts_path)
all_ts_mp4 = [ts_path + file for file in all_ts]
for all_ in all_ts_mp4:
with open(all_, 'rb') as f1:
with open(ts_path + f"{video_name}.ts", 'ab') as f2:
f2.write(f1.read())
# 删除多余ts文件
os.remove(os.path.join(all_))
# Ts视频转MP4
new_ts = os.listdir(ts_path)
cmd = ffmpeg_path + " -i " + f"{ts_path + new_ts[0]}" + " -acodec copy -vcodec copy -absf aac_adtstoasc " + ts_path_ + "\\" + f"{video_name}.mp4"
os.popen(cmd)
# 删除多余ts文件,清空文件夹(VideoPreliminaryStorage)
os.remove(video_name + '.ts')
for i in range(0, len(all_ts_mp4)):
ts_name = os.path.basename(all_ts_mp4[i]) # 去掉文件名前面的文件路径
mp4_name = os.path.splitext(ts_name)[0] # 去掉文件名的后缀
"""
mp4 --> ts : ffmpeg -i 1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts
ts --> mp4 : ffmpeg -i 2.ts -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4
"""
# # 拼接好运行ffmpeg的命令行语句
cmd = ffmpeg_path + " -i " + all_ts_mp4[
i] + " -acodec copy -vcodec copy -absf aac_adtstoasc " + ts_path_ + "\\" + mp4_name + ".mp4"
os.popen(cmd)
# 函数调用:merge_ts_video
# 参数值:
# 参数1 存放 ts 的路径 ts_path
# 参数2 存放 mp4 的路径 ts_path_
# 参数3 ffpmpeg 的路径 ffmpeg_path
# 参数4 视频存储 的名称 video_name