首页 > 其他分享 >05 ffmpeg语法使用参考(个人版)

05 ffmpeg语法使用参考(个人版)

时间:2023-05-11 19:57:30浏览次数:66  
标签:文件 ffmpeg 05 个人版 ts m3u8 path output

【一】合并语法和步骤参考

  • 下面是在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

相关文章

  • [NOIP2005 普及组] 陶陶摘苹果
    [NOIP2005普及组]陶陶摘苹果题目描述陶陶家的院子里有一棵苹果树,每到秋天树上就会结出\(10\)个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个\(30\)厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。现在已知\(10\)个苹果到地面的高度,以及陶陶......
  • 【2023.05.07 模拟赛】T3 树数树
    Description牛牛有一棵\(n\)个点的有根树,根为1。我们称一个长度为\(m\)的序列\(a\)是好的,当且仅当:\(\foralli\in(1,m],\mathrm{a}_{\mathrm{i}}\)为\(\mathrm{a}_{\mathrm{i}-1}\)的祖先或\(\mathrm{a}_{\mathrm{i}-1}\)是\(\mathrm{a}_{\mathrm{i}}\)的......
  • 【2023-05-08】保持淳朴
    20:00读书做人,不是两件事。将所读之书,句句体贴到自己身上来,便是做人之法,如此方叫得能读书;人若不将来身上理会,则读书自读书,做人自做人,只算做“不曾读书的人”。                                    ......
  • C/C++模拟银行排队叫号系统[2023-05-11]
    C/C++模拟银行排队叫号系统[2023-05-11]2、模拟银行排队叫号系统(难度等级A)[问题描述]模拟实现银行的排队叫号系统。[基本要求](1)假定银行上午9点开门,下午5点关门,期间每个小时的客流量不超过35人;(2)每个客户的基本信息包括:到达银行时间、业务需要办理的时长。这两项数据均......
  • 在 CentOS 7上安装和使用 FFmpeg
    网上找了那么多资料,还是这个最靠谱...ChatGPT也是在乱教人根据解压包进行安装ffmpeg会导致我的golang使用exec.Command函数的时候没办法调用ffmpeg命令,即使在终端中我可以使用ffmpeg命令。会报不在%PATH的错误,即使我根据网上的教程把他加入了%PATH也还是不行。还是下述最靠谱,都......
  • C/C++交通咨询系统设计哈夫曼编码问题[2023-05-11]
    C/C++交通咨询系统设计哈夫曼编码问题[2023-05-11]题目三、交通咨询系统设计最短路径问题设计要求及分析:设计一个交通咨询系统,能让旅客咨询从任一个城市顶点到另一城市顶点之间的最短路径(里程)、最低花费、最少时间等问题。对于不同咨询要求,可输出城市间的路程、所需时间......
  • 产品原型23-20230510
       ......
  • HO引擎近况20230510
    上个月想起来的时候已经25号了,然后下一分钟又忘了...公司的项目开始忙起来了,各种杂事不过比起项目中的技术部分,与其它人的沟通更费事,如此难以沟通的人事情况还是第一次碰上一直想学个车本,但是一直没有去考,模拟考试中科目一总是40来分,不知道为什么别人都说简单的题到我这......
  • 2023-05-10:给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表 如果在二叉
    2023-05-10:给你一棵以root为根的二叉树和一个head为第一个节点的链表如果在二叉树中,存在一条一直向下的路径且每个点的数值恰好一一对应以head为首的链表中每个节点的值,那么请你返回True否则返回False。一直向下的路径的意思是:从树中某个节点开始,一直连续向下的路径......
  • 每日总结2023-05-10
    今天完成了对于Android中Fragment的了解:Fragment有自己的生命周期Fragment依赖于ActivityFragment通过getActivity()可以获取所在的Activity;Activity通过FragmentManager的findFragmentById()或findFragmentByTag()获取FragmentFragment和Activity是多对多......