먼저 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