【一】合并语法和步骤参考
- 下面是在Python中使用ffmpeg命令将文件夹中的所有.ts文件合并为一个.mp4文件的步骤和代码示例:
(1)安装FFmpeg库
使用Python之前,您需要安装FFmpeg库。您可以使用如下命令在命令行中安装它:
pip install ffmpeg-python
(2)导入FFmpeg库
在Python脚本中,您需要导入FFmpeg库:
import ffmpeg
(3)编写代码
下面是一个示例代码,使用FFmpeg库将文件夹中的所有.ts文件合并为一个.mp4文件:
import os
import ffmpeg
【二】参考步骤
folder_path = "/path/to/folder"
output_file = "output.mp4"
(1)找到所有.ts文件
input_files = [f for f in os.listdir(folder_path) if f.endswith(".ts")]
(2)构建FFmpeg输入流
input_streams = []
for ts_file in input_files:
input_streams.append(ffmpeg.input(os.path.join(folder_path, ts_file)))
(3)合并输入流
merged = ffmpeg.concat(*input_streams, v=1, a=1).node
(4)构建FFmpeg输出流
output = ffmpeg.output(merged[0], merged[1], output_file)
(5)运行FFmpeg命令
ffmpeg.run(output)
- 这个代码将把所有.ts文件合并,
- 然后将结果保存为output.mp4。
- 您需要将
folder_path
变量设置为包含.ts文件的文件夹的实际路径。
您可以使用Python中的ffmpeg库来合并文件夹中的.ts文件。下面是一个详细步骤和示例代码:
1. 首先,安装ffmpeg库。您可以使用以下命令在命令行中安装:
pip install ffmpeg-python
2. 然后,使用以下代码将文件夹中的所有.ts文件合并成一个.mp4文件:
import os
import ffmpeg
# 定义文件夹路径和.mp4文件名
folder_path = "/path/to/folder/"
output_file = "output.mp4"
# 获取文件夹中的所有.ts文件
ts_files = [f for f in os.listdir(folder_path) if f.endswith('.ts')]
# 使用ffmpeg合并.ts文件为.mp4文件
input_args = []
for f in ts_files:
input_args.append(ffmpeg.input(os.path.join(folder_path, f)))
output = ffmpeg.output(*input_args, output_file)
ffmpeg.run(output)
解释如下:
- `folder_path` :文件夹的路径,替换为您的文件夹路径。
- `output_file` :输出的.mp4文件名,替换为您想要的名称。
- `ts_files` :获取文件夹中所有.ts文件的列表。
- `input_args` :定义输入参数,即所有.ts文件。
- `output` :定义输出参数,即合并后的.mp4文件。
- `ffmpeg.run(output)` :执行ffmpeg命令合并文件。
运行代码后,输出位置将在脚本文件所在目录。
希望这可以帮助您合并文件夹中的.ts文件!
【三】以上仅供参考,接下来为实例
# ffmpeg -i ts文件夹下的m3u8格式文件 -c copy 合成后的视频名字
# ffmpeg -i index.m3u8 -c copy apple.mp4
# 切换到ts文件列表
os.chdir(f'ts文件所存在的文件夹名字')
# 合成文件
os.system(f'ffmpeg -protocol_whitelist "file,http,crypto,tcp" -i index.m3u8 -c copy {filename}.mp4')
#index.m3u8 要存在一个m3u8文件供ffmpeg寻找
#{filename}.mp4 合并后输出的文件名
- 创建m3u8文件参考
```#### 参数说明 ####
# file_path : 将要把文件写入到哪个位置
file_path = f'文件夹名字' + '路径分隔符(在python中 \ 有特殊意义,反义符,即取消其本来的作用)' + 'm3u8文件名。建议默认为index.m3u8'
#http:这里需要将这个key的完整链接补充完整,ffmpeg才可以访问key的地址,进行自动解密
http://v6.dious.cc
```
file_path = f'{self.file_name}' + '\\' + 'index.m3u8'
with open(file_path, 'w') as f:
# 循环获取取到的第二个m3u8文件中的每一个ts文件
for line in page_text.split('\n'):
# 如果文件中不存在以 .ts 文件为结尾的文件
if not line.endswith('.ts'):
# 则直接写入
# 目的是为了合并做准备,ffmpeg合并文件,其中m3u8文件必须带头部,否则会报错
f.write(line + '\n')
# 如果文件中存在 .key 结尾的文件,将其头部补充完整
elif line.endswith('.key'):
# 拼接成完整的url
f.write('http' + line + '\n')
# 如果存在 .ts 为结尾的文件
else:
# 将字符串进行分隔,取最后一部分,因为文件名不能存在 / \ 等特殊字符
line = line.split('/')[-1]
f.write(line + '\n')
【四】报错及解决办法
(1)这是我遇到的一个错误,感谢大佬的指点
原文地址:[https://blog.csdn.net/u014484783/article/details/79350392?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168380001216800192215815%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168380001216800192215815&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduenddefault-1-79350392-null-null.142^v87^control,239^v2^insert_chatgpt&utm_term=index.m3u8%3A%20Invalid%20data%20found%20when%20processing%20input&spm=1018.2226.3001.4187](https://blog.csdn.net/u014484783/article/details/79350392?ops_request_misc={"request_id"%3A"168380001216800192215815"%2C"scm"%3A"20140713.130102334.."}&request_id=168380001216800192215815&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduenddefault-1-79350392-null-null.142v87control,239v2insert_chatgpt&utm_term=index.m3u8%3A Invalid data found when processing input&spm=1018.2226.3001.4187)
(2)错误说明
-
我是通过m3u8文件将所有未解密的ts文件保存到本地,然后用ffmpeg命令进行合并(期间没有保存key文件)
-
然后使用FFmpeg命令来解密并合并ts文件。命令为:
# 切换到ts文件列表 os.chdir(f'ts文件所存在的文件夹名字') # 合成文件 os.system(f'ffmpeg -i index.m3u8 -c copy {filename}.mp4')
- 由于ffmpeg 可以自动加载解密文件,所以很方便。
-
结果遇到了以下错误
-
官方一点的解释如下:
这段代码也是与视频文件相关的代码,使用的是HLS协议。在尝试加载视频时,程序跳过了 '#EXT-X-VERSION:3' 这个标记。同时,程序发现 '/20220428/X2mBs09X/1500kb/hls/key.key' 这个文件扩展名不是常见的多媒体扩展名,出于安全原因被阻止了。如果您想覆盖此设置并允许加载该文件,请将 allowed-extensions 设置为 'All' 以允许所有文件扩展名的加载。随后,程序开启了三个不同的加密视频文件('crypto:SzLVHZFe.ts','crypto:81be1FmV.ts' 和 'crypto:SPkpRnko.ts'),但在尝试加载第一个视频文件 'SzLVHZFe.ts' 时,出现了错误消息 "Error when loading first segment 'SzLVHZFe.ts'",并给出了 "index.m3u8: Invalid data found when processing input" 的具体错误详细信息。
-
简单的理解就是没找到这个key文件,下面的视频也有问题
(3)解决办法一
-
于是在csdn进行寻找答案,有幸看到上面的文章进行了代码修改,最终解决问题
- 先是在key的链接头部加了 'http:// + 你访问的网站的链接公共部分'
- 但是报错:
Protocol http not on whitelist file,crypto
-
然后将http添加在protocol_whitelist中。
-
修改命令如下
ffmpeg -protocol_whitelist "file,http,crypto,tcp" -i index.m3u8 -c copy out.ts
- 完美运行
-
(4)解决办法二
-
仔细查看上述官方解释,其中有一条为
如果您想覆盖此设置并允许加载该文件,请将 allowed-extensions 设置为 'All' 以允许所有文件扩展名的加载。
-
但是这行代码的前提是:
- 已经将key文件保存到本地,且在你的ts文件同级目录里面,才能被识别到,否则还是会报错
-
我们就按照他的解释进行代码修改
- 只要添加 -allowed_extensions ALL 就可以直接使用本地的key.key文件了
- 完整代码如下
ffmpeg -allowed_extensions ALL -protocol_whitelist "file,http,crypto,tcp" -i index.m3u8 -c copy out.mp4
标签:文件,ffmpeg,05,个人版,ts,m3u8,path,output
From: https://www.cnblogs.com/dream-ze/p/17392041.html