代码之家  ›  专栏  ›  技术社区  ›  Linus Unnebäck

Python使用管道和大文件的子处理

  •  7
  • Linus Unnebäck  · 技术社区  · 16 年前

    我正在尝试使用python+ffmpeg+oggenc将任何音频文件转换为ogg。这个程序几乎可以运行。但对于大文件(我认为>~6mb)ffmpeg进程在管道等待时开始休眠。我不知道它在等哪根管子。

    如果我停止ffmpeg进程,oggenc进程将继续,我将得到一个包含大约2:40所有声音的ogg文件。

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    from subprocess import Popen, PIPE
    from sys import argv
    
    ffmpeg = Popen([
        "ffmpeg",
        "-i", argv[1],
        "-vcodec", "null",
        "-acodec", "pcm_s16le",
        "-ac", "2",
        "-ab", "44100",
        "-f", "wav",
        "-"
    ],stdout = PIPE,stderr = PIPE)
    
    oggenc = Popen([
        "oggenc",
        "-", "--raw",
        "-q", "4",
        "-o", argv[2]
    ],stdin = ffmpeg.stdout,stderr = PIPE)
    
    oggenc.communicate()
    ffmpeg.communicate()
    

    我想补充一句,这很好:

    #!/bin/bash
    
    ffmpeg -i "$1" -vcodec null -acodec pcm_s16le -ac 2 -ab 44100 -f wav - | oggenc - --raw -q 4 -o "$2"
    
    2 回复  |  直到 16 年前
        1
  •  5
  •   Matt Joiner    15 年前

    你到底是怎么处理这些东西的 stderr 两条管道的通道?

    ffmpeg.stderr.read() 提前打电话(我想没用) .communicate 打电话,或者更好,放下电话 stderr=PIPE 完全没有争论。

    更新

    对于 >/dev/null 同样,请执行以下操作:

    nulfp = open(os.devnull, "w")
    …
    … = subprocess.Popen(…, stderr=nulfp.fileno())
    

    显然,您可以重复使用相同的 nulfp 总的来说 标准错误 你想忽略的是什么。

        2
  •  0
  •   rook    16 年前