如何使用带有字节而不是文件的Python子进程

2024-01-02

我可以使用以下命令将 mp4 转换为 wavffmpeg, 通过做这个:

ffmpeg -vn test.wav  -i test.mp4 

我也可以使用subprocess做同样的事情,只要我的输入和输出是文件路径。

但如果我想用怎么办ffmpeg直接在字节或“类似文件”的对象上io.BytesIO()?

这是一个尝试:

import subprocess
from io import BytesIO
b = BytesIO()

with open('test.mp4', 'rb') as stream:
    command = ['ffmpeg', '-i']
    proc = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=b)
    proc.communicate(input=stream.read())
    proc.wait()
    proc.stdin.close()
    proc.stdout.close()

给我:

---------------------------------------------------------------------------
UnsupportedOperation                      Traceback (most recent call last)
<ipython-input-84-0ddce839ebc9> in <module>
      5 with open('test.mp4', 'rb') as stream:
      6     command = ['ffmpeg', '-i']
----> 7     proc = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=b)
...
   1486                 # Assuming file-like object
-> 1487                 c2pwrite = stdout.fileno()
   1488 
   1489             if stderr is None:

UnsupportedOperation: fileno

当然,我可以使用临时文件来汇集字节,但我希望能够避免写入磁盘(因为这一步只是转换管道中的一个链接)。


根据 @thorwhalen 的回答,以下是它如何从字节到字节工作。 您可能缺少@thorwhalen,是与进程交互时发送和获取数据的实际管道到管道方式。发送字节时,应先关闭标准输入,然后进程才能从中读取数据。

def from_bytes_to_bytes(
        input_bytes: bytes,
        action: str = "-f wav -acodec pcm_s16le -ac 1 -ar 44100")-> bytes or None:
    command = f"ffmpeg -y -i /dev/stdin -f nut {action} -"
    ffmpeg_cmd = subprocess.Popen(
        shlex.split(command),
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE,
        shell=False
    )
    b = b''
    # write bytes to processe's stdin and close the pipe to pass
    # data to piped process
    ffmpeg_cmd.stdin.write(input_bytes)
    ffmpeg_cmd.stdin.close()
    while True:
        output = ffmpeg_cmd.stdout.read()
        if len(output) > 0:
            b += output
        else:
            error_msg = ffmpeg_cmd.poll()
            if error_msg is not None:
                break
    return b
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用带有字节而不是文件的Python子进程 的相关文章

随机推荐

  • ActiveRecord 回调列表

    我已经浏览 Rails 源代码有一段时间了 我认为没有更好的方法来获取列表all除以下回调之外的回调 ActiveRecord Callbacks CALLBACKS 这是一个常量列表 意思是如果您使用像 devise invitable
  • sqlite 表中的最大行数

    给出一个简单的 sqlite3 表 create table data key PRIMARY KEY value 键大小为 256 字节 值大小为 4096 字节 该 sqlite3 表中的最大行数限制 忽略磁盘空间限制 是多少 它们的限
  • Bugzilla Rest api 激活

    我在 Fedora 服务器上安装了 Bugzilla 我想使用 Rest Api 但找不到如何激活它 有人能帮我吗 这个问题可以通过安装一些列为可选的 Perl 模块来解决 对我有用的是启用 mod rewrite 并安装与 Bugzill
  • JAX-RS(泽西岛)ExceptionMapper - @Context 注入静态/单例类 - 它有效,但为什么呢?

    我有一个单实例类 实现 ExceptionMapper 它不是一个静态类 但我知道它只创建了一个实例 我检查过 构造函数仅被调用一次 我的班级使用 Context HttpServletRequest 我可以清楚地观察到 当我的Except
  • 无法更改 actionbarsherlock SearchView 图标

    当我使用以下配置时
  • jQuery:查找下一个不是兄弟元素的元素

    假设我有以下 HTML span span class x X1 span span span span span class x X2 span span span And this is the span 找到下一个元素匹配的最佳方法是
  • 绑定套接字是否可以确保其端口始终相同?

    我在互联网上发现有关套接字的信息少之又少 也许是因为我的搜索策略 将套接字绑定到操作系统 NAT 选择的端点 实际上是由什么选择的 是否可以确保使用它发送的数据包始终具有相同的源端口 例如 如果我要创建套接字并将其绑定到 Windows 选
  • 从http地址读取XML文件

    我需要使用 c net 从源读取 xml 文件 如下所示 https 10 1 12 15 xmldata item all 这基本上只是一个 xml 文件 StreamReader 不喜欢这样 阅读该链接内容的最佳方式是什么 该文件看起来
  • 如何在单击 EditText 时禁用键盘?

    您好 我想做下一件事 当我单击 EditText 时 我想隐藏键盘但看到光标 我尝试这样做 editText test setCursorVisible false editText test setFocusableInTouchMode
  • C++ 在初始化列表之外显式调用父构造函数

    因此 调用父类构造函数的普通方法是在初始化列表中 e g include
  • 如何在 Zend Framework 2 中打开 PHP 错误报告?

    每次我在 Zend Framework 2 中收到错误时 我只会显示 500 Internal Server Error 并且必须搜索 Zend Server 错误日志 我尝试将其放入我的 config autoload local php
  • 我们如何在 grunt cssmin 任务中设置目标?

    我正在尝试cssmin https github com gruntjs grunt contrib cssmin对于咕噜 根据文档 目标可以 根据 grunt 配置任务指南 进行定义 当我使用该模式创建 cssmin 任务时 例如 css
  • 如何在 Swift 中访问程序参数?

    C 及其衍生物有argc and argv and envp 参数到它们的入口点函数 但是 Swift 没有一个合适的参数 顶级代码只是代码 它没有参数 一个人怎样才能获得相当于argc and argv在 Swift 程序中 Proces
  • 如何使用 C# 注释 XMLElement?

    我的应用程序从我每次执行应用程序时写入的 xml 文件中读取值 这就是我对台词的评论 XmlComment DirCom doc CreateComment Comment XmlElementName AppendChild DirCom
  • 使用 Owl Carousel 2 缩放自定义动画

    我在用猫头鹰旋转木马 2 https owlcarousel2 github io OwlCarousel2 index html 我在图像中添加了一些比例动画 我遇到两个问题 我不想将滑块从右向左滑动 如何重新启动动画 我的意思是 如果我
  • 使用vba的.ExportAsFixedFormat方法从Excel打印没有边距的图表表?

    我使用以下例程将图表导出 保存 为 pdf 该函数获取集合中用户选择的图表表的名称 然后将其一张一张导出为pdf 用户可以选择导出的pdf的保存文件夹 这是我的代码 Private Function ExportCurvesPDF Curv
  • 异步编程就像僵尸病毒吗?

    我正在尝试用 C 进行异步编程 主要是尝试将 API 调用发送到我创建的 API 但根据我的理解 只能调用async另一个方法async方法 然而 我的Main方法不能是异步的 我不想使用同步调用该方法 Result属性 因为这破坏了异步编
  • Power BI / 在报表视图上添加刷新按钮

    我在 Power BI 方面没有太多专业知识 我开始研究它 发现它非常简单 并且我创建了一份报告 该报告运行良好 现在 我需要在报表上添加刷新按钮 该按钮将刷新数据源并从中获取最新数据 我尝试对其进行大量搜索 但仍然无法找到任何合理的解决方
  • 如何配置任务以在 vscode 中运行/调试 C# 控制台应用程序

    从 build中 我看到了运行nodejs和asp net 5的酷感 我正在尝试使用 vscode 来运行一些基本的 C 控制台应用程序 我应该如何配置任务来构建和运行 调试它 有样品吗 yeoman aspnet 生成器有一个可以在 VS
  • 如何使用带有字节而不是文件的Python子进程

    我可以使用以下命令将 mp4 转换为 wavffmpeg 通过做这个 ffmpeg vn test wav i test mp4 我也可以使用subprocess做同样的事情 只要我的输入和输出是文件路径 但如果我想用怎么办ffmpeg直接