os模块的视频合并问题
os模块的视频合并问题,视频合并之后,出现了进度条乱跳,画面卡住,声音继续播放,音画不同步问题def merge_dec_ts():
list1 = []
for line in range(300):
name = f'video{line}.ts'
list1.append(f'dec_video/dec_{name}')
ts = '+'.join(list1)
os.system(f'copy/b {ts} 租借女友.mp4')
print('合并完成!!!')
1205768305 发表于 2022-2-16 14:30
这样连合并后的视频都没有了,应该不对
要不用绝对路径,要不把.py脚本放到dec_video文件夹使用文件名+文件名。 代码是没有问题 。
看你的视频是否按你代码顺序排列,视频本身是否有问题 。
copy/b ts合并视频存在的问题 有:拖动进度时会卡顿的现象。 ba21 发表于 2022-2-16 13:05
代码是没有问题 。
看你的视频是否按你代码顺序排列,视频本身是否有问题 。
您好,视频是没问题的,我用potplayer合并完全没问题,自己用代码合并就会出问题,您说顺序不对的话,我就是按照视频名字的标号,放到列表的,也是按顺序的呀,难道合并的时候不按这个顺序吗? 最好是调用用专业的ffmpeg合并,因为copy命令是直接将两个文件接合在一起,而不是真的在处理视频信息 1205768305 发表于 2022-2-16 13:22
您好,视频是没问题的,我用potplayer合并完全没问题,自己用代码合并就会出问题,您说顺序不对的话,我 ...
ts视频顺序截图上来看看。 ba21 发表于 2022-2-16 14:02
ts视频顺序截图上来看看。
我发现了个问题,就算是我只合并5个ts视频,它也是按照全部视频进行合并,仿佛我的ts毫无作用,我的合并顺序就是从零开始往后合并的,真实视频顺序也是这个顺序。
1205768305 发表于 2022-2-16 14:11
我发现了个问题,就算是我只合并5个ts视频,它也是按照全部视频进行合并,仿佛我的ts毫无作用,我的合并 ...
"dec_video/dec_video0.ts"
加上引号试试 视频处理用ffmpeg
下面这个代码是很久之前写的,是一个下载m3u8视频的程序,最后转换成mp4文件
就是把一堆ts文件合并,合并成一个视频文件,可以是任意的格式,下面这个程序最后合并成一个mp4文件
我刚试了一下,这个程序还能用
#!/usr/bin/env python
#coding=utf-8
import re
import requests
import threadpool
import shutil
import os
import sys
import subprocess
def get_file(url):
global session
while True:
try: content = session.get(url, timeout = 60).content
except: sys.stderr.write('"' + url + '": download failed, retry!\n'); continue
break
return content
def get_base_url(url):
return re.search(r'^(.+?://.+?)/', url).group(1)
def get_list_full_path(url_list, base_url):
for i in range(len(url_list)):
url_list = url_list if re.search(r'^.+?://', url_list) else base_url + url_list
return url_list
def get_media_play_list(url):
play_list = get_file(url).decode()
master_play_list = re.findall(r'^.+\.m3u8$', play_list, re.MULTILINE)
if len(master_play_list) == 0: return play_list
master_play_list = get_list_full_path(master_play_list, get_base_url(url))
return get_file(master_play_list).decode()
def get_ts_list(media_play_list):
return re.findall(r'^.+?://.+?\.ts$', media_play_list, re.MULTILINE)
def download_file(url, path):
filename = re.search(r'^.+/(.+)$', url).group(1)
with open(path + '/' + filename, 'wb') as f: f.write(get_file(url))
sys.stdout.write(path + ': ' + url + '\n')
def get_video_info(path):
ffprobe_cmd = ['ffprobe', '-protocol_whitelist', 'https,file,crypto,tls,tcp', '-show_streams', '-print_format', 'json', path]
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
startupinfo.wShowWindow = subprocess.SW_HIDE
ffprobe = subprocess.Popen(ffprobe_cmd, stdout = subprocess.PIPE, startupinfo = startupinfo)
ffprobe.wait()
return json.loads(ffprobe.stdout.read())
def convert_video_format(v1, v2):
ffmpeg_cmd = ['ffmpeg', '-y', '-protocol_whitelist', 'https,file,crypto,tls,tcp', '-i', v1, '-c:v', 'h264', v2]
ffmpeg = subprocess.Popen(ffmpeg_cmd)
ffmpeg.wait()
return ffmpeg.returncode
url = 'https://s1.zoubuting.com/20210731/F9EwiTg8/index.m3u8'
session = requests.Session()
path = 'download'
shutil.rmtree(path, True)
os.mkdir(path)
media_play_list = get_media_play_list(url)
ts_list = get_ts_list(media_play_list)
pool = threadpool.ThreadPool(8)
requests = threadpool.makeRequests(download_file, [((url, path), None) for url in ts_list])
pool.wait()
media_play_list = re.sub(r'^.+/(.+?\.ts)$', r'\1', media_play_list, flags = re.MULTILINE)
with open(path + '/index.m3u8', 'w') as f: f.write(media_play_list)
print(convert_video_format(path + '/index.m3u8', '31.mp4'))
ba21 发表于 2022-2-16 14:21
"dec_video/dec_video0.ts"
加上引号试试
这样连合并后的视频都没有了,应该不对 ba21 发表于 2022-2-16 14:35
要不用绝对路径,要不把.py脚本放到dec_video文件夹使用文件名+文件名。
解决了,放到同一文件夹就可以了,这是什么原理{:10_266:},感谢! 人造人 发表于 2022-2-16 14:21
视频处理用ffmpeg
下面这个代码是很久之前写的,是一个下载m3u8视频的程序,最后转换成mp4文件
就是把一 ...
谢谢啦,感谢帮助! hrpzcf 发表于 2022-2-16 13:27
最好是调用用专业的ffmpeg合并,因为copy命令是直接将两个文件接合在一起,而不是真的在处理视频信息
谢谢啦,感谢帮助! 本帖最后由 isdkz 于 2022-2-16 15:08 编辑
1205768305 发表于 2022-2-16 14:43
解决了,放到同一文件夹就可以了,这是什么原理,感谢!
我觉得应该是windows的命令选项都是用斜杠/,所以它把一些/后面的当成命令的选项了,
你可以试试用反斜杠\
def merge_dec_ts():
list1 = []
for line in range(300):
name = f'video{line}.ts'
list1.append(f'dec_video\dec_{name}') # 这里把斜杠/换成反斜杠\
ts = '+'.join(list1)
os.system(f'copy/b {ts} 租借女友.mp4')
print('合并完成!!!') isdkz 发表于 2022-2-16 15:06
我觉得应该是windows的命令选项都是用斜杠/,所以它把一些/后面的当成命令的选项了,
你可以试试用 ...
你说得对,确实如此,太感谢了{:10_254:}
页:
[1]