FFmpeg 将 .mp3 输出保存到变量中

2023-12-25

在我的应用程序中,我想修改各种mp3,然后将它们混合在一起。我知道我可以在 FFmpeg 中使用单个命令行来完成此操作,但它最终可能会非常混乱,因为我需要在每个样本上使用各种过滤器,而我有五个过滤器。 我的想法是单独编辑每个样本,将它们保存到变量中,最后混合它们。这是我的代码:

import subprocess    

def create_samp():
    sample= subprocess.run(["ffmpeg", "-y", "-i", "https://freesound.org/data/previews/186/186942_2594536-hq.mp3", \
                           "-filter_complex", "adelay=15000|15000", "-codec:v", "copy", "-f", "mp3","-"], stdout=subprocess.PIPE)         
    return(sample)    

def record(samp):
    subprocess.run(["ffmpeg", "-y", "-i", "https://cdns-preview-b.dzcdn.net/stream/c-b0b684fe962f93dc43f1f7ea493683a1-3.mp3", \
                    "-i", samp.stdout, "-f", "-mp3", "copy", "output.mp3"])

samp = create_samp()
record(samp)

我的问题是我必须编码stdout。我试过了'utf-8'但得到这个错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 45: invalid start byte

使用“utf-16”:

UnicodeDecodeError: 'utf-16-le' codec can't decode bytes in position 239454-239455: illegal encoding

为什么有办法解决这个问题呢?我的方法正确吗?

感谢@Rotem,我成功地做了我想做的事。但现在我面临着另一个问题,因为我想混合最多 5 个声音,所以我尝试以懒惰/简单的方式实现它:

import subprocess

def create_samp_2():
    sample= subprocess.run(["ffmpeg", "-i", "https://freesound.org/data/previews/186/186942_2594536-hq.mp3", \
                            "-af", "adelay=15000|15000", "-f", "mp3", "pipe:"], stdout=subprocess.PIPE).stdout
    return(sample)

def create_samp():

    sample= subprocess.run(["ffmpeg", "-i", "https://freesound.org/data/previews/370/370934_6399962-lq.ogg", \
                            "-af", "adelay=1000|1000", "-f", "mp3", "pipe:"], stdout=subprocess.PIPE).stdout
    return(sample)


def record(samp, samp_2):        
    process = subprocess.Popen(["ffmpeg", "-y", '-f', 'mp3', \
                                "-i", "https://cdns-preview-b.dzcdn.net/stream/c-b0b684fe962f93dc43f1f7ea493683a1-3.mp3", \
                                "-i", "pipe:", \
                                "-i", "pipe:", \
                                "-filter_complex", "amix=inputs=3:duration=longest", "output.mp3"], stdin=subprocess.PIPE)

    process.stdin.write(samp) 
    process.stdin.write(samp_2)        
    process.stdin.close()  
    process.wait()

samp = create_samp()
samp_2 = create_samp_2()
record(samp, samp_2)

令人惊讶的是它有效,我的两个声音在正确的时间开始,但第二个声音搞砸了。所以这不是正确的做法。

然后我按照建议尝试命名管道:

"pipe1:"

但我收到这个错误:

pipe1:: Protocol not found
Did you mean file:pipe1:?

阅读命名管道维基,据说我必须使用以下命令创建它们mkfifo().

所以我尝试:

import os
pipe1 = "pipe1"

def create_pipe1():
    os.mkfifo(pipe1)

But now I have this error: pipe1:: Protocol not found
Did you mean file:pipe1:?

您的方法是正确的,但需要修复。

Fixing create_samp():

  • 你不需要"-codec:v", "copy"争论,因为没有视频流。

Fixing record(samp):

  • 你不能使用"-i" "samp.stdout", 因为samp.stdout是一个字节数组(Python 子进程模块将其用作字符串)。
  • Use "-i", "pipe:"用于从标准输入管道接收第二个音频。
  • 由于您想混合两个音频流,因此您必须使用"-filter_complex"论证,以及amix音频滤波器或amerge音频滤波器,如上所述here https://stackoverflow.com/questions/14498539/how-to-overlay-downmix-two-audio-files-using-ffmpeg.
  • Write samp到标准输入管道,并关闭标准输入管道。

这是代码:

import subprocess

def create_samp():
    # Read audio stream from https://freesound.org/data/previews/186/186942_2594536-hq.mp3
    # Apply adelay audio filter.
    # Encode the audio in mp3 format.
    # FFmpeg output is passed to stdout pipe, and stored in sample bytes array.
    sample= subprocess.run(["ffmpeg", "-i", "https://freesound.org/data/previews/186/186942_2594536-hq.mp3", \
                            "-af", "adelay=15000|15000", "-f", "mp3", "pipe:"], stdout=subprocess.PIPE).stdout
    return(sample)


def record(samp):
    # Open FFmpeg as sub-process
    # Use two audio input streams:
    # 1. WEB address
    # 2. PIPE (the input is going to be written stdin pipe).
    # Merge the two audio streams using amix audio filter.
    # Store the result to output file: output.mp3
    process = subprocess.Popen(["ffmpeg", "-y", '-f', 'mp3', \
                                "-i", "https://cdns-preview-b.dzcdn.net/stream/c-b0b684fe962f93dc43f1f7ea493683a1-3.mp3", \
                                "-i", "pipe:", \
                                "-filter_complex", "amix=inputs=2:duration=longest", "output.mp3"], stdin=subprocess.PIPE)

    process.stdin.write(samp)  # Write samp (bytes array containing mp3 data).
    process.stdin.close()  # Close stdin pipe.
    process.wait()  # Wait for FFmpeg sub-process to finish

samp = create_samp()
record(samp)

听起来很棒...


Update:

命名管道实现移至下列的 https://stackoverflow.com/questions/67388548/multiple-named-pipes-in-ffmpeg post.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FFmpeg 将 .mp3 输出保存到变量中 的相关文章

  • Python BigQuery 存储。并行读取多个流

    我有以下玩具代码 import pandas as pd from google cloud import bigquery storage v1beta1 import os import google auth os environ G
  • 如何在python中读取多个文件中的文本

    我的文件夹中有许多文本文件 大约有 3000 个文件 每个文件中第 193 行是唯一包含重要信息的行 我如何使用 python 将所有这些文件读入 1 个文本文件 os 模块中有一个名为 list dir 的函数 该函数返回给定目录中所有文
  • 将字符串转换为带有毫秒和时区的日期时间 - Python

    我有以下 python 片段 from datetime import datetime timestamp 05 Jan 2015 17 47 59 000 0800 datetime object datetime strptime t
  • Pycharm Python 控制台不打印输出

    我有一个从 Pycharm python 控制台调用的函数 但没有显示输出 In 2 def problem1 6 for i in range 1 101 2 print i end In 3 problem1 6 In 4 另一方面 像
  • DreamPie 不适用于 Python 3.2

    我最喜欢的 Python shell 是DreamPie http dreampie sourceforge net 我想将它与 Python 3 2 一起使用 我使用了 添加解释器 DreamPie 应用程序并添加了 Python 3 2
  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • 如何等到 Excel 计算公式后再继续 win32com

    我有一个 win32com Python 脚本 它将多个 Excel 文件合并到电子表格中并将其另存为 PDF 现在的工作原理是输出几乎都是 NAME 因为文件是在计算 Excel 文件内容之前输出的 这可能需要一分钟 如何强制工作簿计算值
  • 如何使用 Scrapy 从网站获取所有纯文本?

    我希望在 HTML 呈现后 可以从网站上看到所有文本 我正在使用 Scrapy 框架使用 Python 工作 和xpath body text 我能够获取它 但是带有 HTML 标签 而且我只想要文本 有什么解决办法吗 最简单的选择是ext
  • Spark的distinct()函数是否仅对每个分区中的不同元组进行洗牌

    据我了解 distinct 哈希分区 RDD 来识别唯一键 但它是否针对仅移动每个分区的不同元组进行了优化 想象一个具有以下分区的 RDD 1 2 2 1 4 2 2 1 3 3 5 4 5 5 5 在此 RDD 上的不同键上 所有重复键
  • 从列表中的数据框列中搜索部分字符串匹配 - Pandas - Python

    我有一个清单 things A1 B2 C3 我有一个 pandas 数据框 其中有一列包含用分号分隔的值 某些行将包含与上面列表中的一项的匹配 它不会是完美的匹配 因为它在其中包含字符串的其他部分 该列 例如 该列中的一行可能有 哇 这里
  • NameError:名称“urllib”未定义”

    CODE import networkx as net from urllib request import urlopen def read lj friends g name fetch the friend list from Liv
  • Pandas Dataframe 中 bool 值的条件前向填充

    问题 如何转发 fill boolTruepandas 数据框中的值 如果是当天的第一个条目 True 到一天结束时 请参阅以下示例和所需的输出 Data import pandas as pd import numpy as np df
  • Python:尝试检查有效的电话号码

    我正在尝试编写一个接受以下格式的电话号码的程序XXX XXX XXXX并将条目中的任何字母翻译为其相应的数字 现在我有了这个 如果启动不正确 它将允许您重新输入正确的数字 然后它会翻译输入的原始数字 我该如何解决 def main phon
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • 使用基于正则表达式的部分匹配来选择 Pandas 数据帧的子数据帧

    我有一个 Pandas 数据框 它有两列 一列 进程参数 列 包含字符串 另一列 值 列 包含相应的浮点值 我需要过滤出部分匹配列 过程参数 中的一组键的子数据帧 并提取与这些键匹配的数据帧的两列 df pd DataFrame Proce
  • Python:元类属性有时会覆盖类属性?

    下面代码的结果让我感到困惑 class MyClass type property def a self return 1 class MyObject object metaclass MyClass a 2 print MyObject

随机推荐

  • 调试了代码我认为这将是这个函数 onSelect

    我在反应类中有工作代码 但是当我更改为 React Component 时 整个 UI 都崩溃了 调试了代码我认为问题将是这个函数 onSelect 因为如果我给出控制台语句 它不会打印任何内容 你能告诉我如何解决它吗 我什至检查了CSS它
  • 将 Heroku 应用程序与 Amazon RDS 实例连接时出现问题

    我是第一次使用 Amazon RDS 并且一直在关注 heroku 文档以使用 RDS 实例获取我的应用程序 到目前为止 我已经创建了一个实例 并使用以下格式设置了插件 heroku addons add amazon rds url my
  • HTTP响应头:多个Link值

    我正在为 Rails 应用程序进行 SEO 该网站已完全本地化 我正在关注这篇谷歌文章 https support google com webmasters answer 189077 hl en to add hreflang 替代品页
  • ggplot2中同一图例内的不同图例键

    假设我不需要 正确的 变量映射 但仍然希望有图例键来帮助图表理解 我的实际数据类似于以下df df lt data frame id 1 10 line rnorm 10 points rnorm 10 library ggplot2 gg
  • xlsxwriter:text_wrap() 不起作用

    我正在创建 Excel 文件并对其进行格式化 并希望将文本换行到列中 我在 xlsxwriter 中找到了 text wrap 方法 但是当我使用此方法时 它对我不起作用 我尝试了一切但失败了 我在脚本中所做的事情 使用 pandas 读取
  • Laravel:$request->hasFile() 不起作用

    我有一张表格 可以在其中获得title description and an image 当我dd requests gt all 它返回以下正确的内容 array 4 projectTitle gt asd project descrip
  • Coldfusion 10 的 cfdocument pdf 中未显示图像

    我使用的是ColdFusion 10企业版 使用时无法显示图像CFDOCUMENT生成 PDF 下面是我正在使用的一段代码
  • matplotlib 中 LaTeX 轴标签的粗体字体粗细

    In matplotlib http matplotlib org 您可以将轴标签的文本设置为粗体 plt xlabel foo fontweight bold 您还可以将 LaTeX 与正确的后端一起使用 plt xlabel r phi
  • PHP - MySQL 从产品表创建树视图

    我有一个类别表如下 我正在该表中保存类别 子类别 多个子类别 我的桌子看起来像 id name parent of created on 1 Name 1 0 2013 05 1 00 00 00 2 Name 2 0 2013 05 1
  • 需要解释此代码如何处理 Arraylist 值

    public static void mystery1 ArrayList
  • Angular 的 ngTouch 库可以用来检测长按(触摸/按住/释放到位)事件吗?

    我的 AngularJS 应用程序需要能够检测触摸事件的开始和停止 无需滑动 例如 我需要在触摸开始时执行一些逻辑 用户按下手指并按住 然后在同一触摸结束时执行不同的逻辑 用户移开手指 我正在考虑为该任务实现 ngTouch 但 ngTou
  • 从Java开始忽略/捕获子进程输出的最简单方法

    java中的子进程非常昂贵 每个进程通常由多个线程支持 托管进程的线程 Linux 上的 JDK 1 6 一个读取 打印 忽略输入流的线程 另一个线程读取 打印 忽略错误流 更多线程来执行超时和监视并由应用程序终止子进程 业务逻辑线程 ho
  • 与 pytest 一起使用时禁用日志记录

    我在同时使用 pytest 和日志记录时遇到问题 当我单独运行一个程序时 我可以看到它的消息打印在屏幕上以及文件 test log 中 python3 main py gt prints on terminal and also in te
  • 确定绝对id

    如何确定organizationUnit的绝对id 来自 webapp resources acme organizationUnit xhtml 当我从树中选择一个节点时 organizationUnit 应显示所选节点 我无法使用相对
  • AVFoundation 使用 Alpha 通道解码 prores4444 电影

    我正在尝试使用 Swift 在 iOS 上使用 alpha 通道解码 prores4444 视频 将其作为复杂的动画叠加在用户视频上并将其导出到他的库中 AVFoundation 文档不是那么好 我正在努力寻找任何代码示例 当我尝试将下面的
  • PHP中如何检查一个方法是否是静态的?

    我需要知道该方法是否在给定其名称和包含该方法的类的名称的情况下声明为静态 method exists提供true对于静态和非静态方法 下面是关于如何使用 ReflectionMethod 的更清晰的方法 MethodChecker new
  • Python 中的字符串反转

    我接受了一个整数输入并尝试在 Python 中反转它 但徒劳 我把它改成了字符串 但仍然不能 有什么办法可以逆转吗 有没有内置的功能 我无法将整数转换为列表 因此无法应用反向函数 您可以使用切片运算符来反转字符串 s hello world
  • nginx proxy_pass 通过 https_proxy

    我正在尝试使用此配置设置 nginx 要访问 backend mygreat server com 我必须通过我的公司代理 即 myproxy server com 80 因此 我将其添加到 etc environment 中 https
  • 如何获取最新的 Chrome(版本 55)以允许混合内容?

    我有一个 chrome 扩展 它在开发中使用 HTTP 进行通信 在生产中使用 HTTPS 进行通信 我从使用 HTTPS 的网页运行它 当我在开发模式下使用此扩展时 出现以下错误 混合内容 页面位于 https somesite com
  • FFmpeg 将 .mp3 输出保存到变量中

    在我的应用程序中 我想修改各种mp3 然后将它们混合在一起 我知道我可以在 FFmpeg 中使用单个命令行来完成此操作 但它最终可能会非常混乱 因为我需要在每个样本上使用各种过滤器 而我有五个过滤器 我的想法是单独编辑每个样本 将它们保存到