鱼C论坛

 找回密码
 立即注册
查看: 1660|回复: 14

[已解决]os模块的视频合并问题

[复制链接]
发表于 2022-2-16 12:51:21 | 显示全部楼层 |阅读模式
20鱼币
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('合并完成!!!')
最佳答案
2022-2-16 12:51:22
1205768305 发表于 2022-2-16 14:30
这样连合并后的视频都没有了,应该不对

要不用绝对路径,要不把.py脚本放到dec_video文件夹使用文件名+文件名。

最佳答案

查看完整内容

要不用绝对路径,要不把.py脚本放到dec_video文件夹使用文件名+文件名。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-16 12:51:22 | 显示全部楼层    本楼为最佳答案   
1205768305 发表于 2022-2-16 14:30
这样连合并后的视频都没有了,应该不对

要不用绝对路径,要不把.py脚本放到dec_video文件夹使用文件名+文件名。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-16 13:05:15 | 显示全部楼层
代码是没有问题 。
看你的视频是否按你代码顺序排列,视频本身是否有问题 。

copy/b ts合并视频存在的问题 有:拖动进度时会卡顿的现象。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-16 13:22:06 | 显示全部楼层
ba21 发表于 2022-2-16 13:05
代码是没有问题 。
看你的视频是否按你代码顺序排列,视频本身是否有问题 。

您好,视频是没问题的,我用potplayer合并完全没问题,自己用代码合并就会出问题,您说顺序不对的话,我就是按照视频名字的标号,放到列表的,也是按顺序的呀,难道合并的时候不按这个顺序吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-16 13:27:03 From FishC Mobile | 显示全部楼层
最好是调用用专业的ffmpeg合并,因为copy命令是直接将两个文件接合在一起,而不是真的在处理视频信息
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-16 14:02:01 | 显示全部楼层
1205768305 发表于 2022-2-16 13:22
您好,视频是没问题的,我用potplayer合并完全没问题,自己用代码合并就会出问题,您说顺序不对的话,我 ...

ts视频顺序截图上来看看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-16 14:11:31 | 显示全部楼层
ba21 发表于 2022-2-16 14:02
ts视频顺序截图上来看看。

我发现了个问题,就算是我只合并5个ts视频,它也是按照全部视频进行合并,仿佛我的ts毫无作用,我的合并顺序就是从零开始往后合并的,真实视频顺序也是这个顺序。
QQ截图20220216141018.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-16 14:21:26 | 显示全部楼层
1205768305 发表于 2022-2-16 14:11
我发现了个问题,就算是我只合并5个ts视频,它也是按照全部视频进行合并,仿佛我的ts毫无作用,我的合并 ...

"dec_video/dec_video0.ts"
加上引号试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-16 14:21:57 | 显示全部楼层
视频处理用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[i] = url_list[i] if re.search(r'^.+?://', url_list[i]) else base_url + url_list[i]
    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[0]).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.putRequest(req) for req in requests]
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'))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-16 14:30:41 | 显示全部楼层
ba21 发表于 2022-2-16 14:21
"dec_video/dec_video0.ts"
加上引号试试

QQ截图20220216142913.png
这样连合并后的视频都没有了,应该不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-16 14:43:04 | 显示全部楼层
ba21 发表于 2022-2-16 14:35
要不用绝对路径,要不把.py脚本放到dec_video文件夹使用文件名+文件名。

解决了,放到同一文件夹就可以了,这是什么原理,感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-16 14:43:39 | 显示全部楼层
人造人 发表于 2022-2-16 14:21
视频处理用ffmpeg
下面这个代码是很久之前写的,是一个下载m3u8视频的程序,最后转换成mp4文件
就是把一 ...

谢谢啦,感谢帮助!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-16 14:44:15 | 显示全部楼层
hrpzcf 发表于 2022-2-16 13:27
最好是调用用专业的ffmpeg合并,因为copy命令是直接将两个文件接合在一起,而不是真的在处理视频信息

谢谢啦,感谢帮助!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-16 15:06:11 | 显示全部楼层
本帖最后由 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('合并完成!!!')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-16 15:22:09 | 显示全部楼层
isdkz 发表于 2022-2-16 15:06
我觉得应该是windows的命令选项都是用斜杠/,所以它把一些/后面的当成命令的选项了,

你可以试试用 ...

你说得对,确实如此,太感谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 06:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表