11

Pythonのサブプロセスモジュールでffmpegを使用して、いくつかのオーディオファイルを変換しようとしています。URLからオーディオファイルを取得し、最初にディスクに保存するのではなく、Pythonファイルオブジェクトをffmpegに渡すことができるようにしたいと思います。また、ffmpegに出力をファイルに保存させる代わりに、ファイルストリームを取り戻すことができれば非常に便利です。

参考までに、これは私が今していることです:

tmp = "/dev/shm"
audio_wav_file = requests.get(audio_url)
##              ##                         ##
## This is what I don't want to have to do ##
wavfile = open(tmp+filename, 'wrb')   
wavfile.write(audio_wav_file.content)
wavfile.close()
##              ##                         ##
conversion = subprocess.Popen('ffmpeg -i "'+tmp+filename+'" -y "'+tmp+filename_noext+'.flac" 2>&1', shell = True, stdout = subprocess.PIPE).stdout.read()

誰かがこれを行う方法を知っていますか?

ありがとう!

4

4 に答える 4

7

ffmpegを使用する-と、入力/出力ファイル名として使用して、stdinからデータを読み取る/stdoutに書き込む必要があることを示すことができます。

次に、のstdin/stdout引数を使用しPopenてデータの読み取り/書き込みを行うことができます。

例:

from subprocess import Popen, PIPE

with open("test.avi", "rb") as infile:
    p=Popen(["ffmpeg", "-i", "-", "-f", "matroska", "-vcodec", "mpeg4",
        "-acodec", "aac", "-strict", "experimental", "-"],
           stdin=infile, stdout=PIPE)
    while True:
        data = p.stdout.read(1024)
        if len(data) == 0:
            break
        # do something with data...
        print(data)
    print p.wait() # should have finisted anyway

代わりに、ファイルを提供して、を使用してプロセスの入力ストリームに直接書き込むstdinこともできます( )。またはあなたの場合、あなたは単にwavfileを使うでしょう...PIPEp.stdin

ffmpegは通常のようにファイル拡張子からそれらを推測できないため、出力形式とコーデックを明示的に指定する必要があることに注意してください。
シーク可能な出力ストリームを必要としないマルチプレクサでのみ機能しますが、flacは機能するはずです...

于 2012-05-01T17:33:32.653 に答える
2

まだこれを読んでいる人のために:これは、代わりにFFMPEGのパイププロトコルを使用することにより、サブプロセスなしで行うことができます。パッケージを使用してFFMPEGが呼び出された場合、FFMPEGコマンドffmpeg-pythonstdout, stderr出力は、次のようにPython変数に入力できます

out, err = inpstream.output('pipe:', ... ).run(capture_stdout=True)
于 2020-03-25T18:24:08.440 に答える
0

Unixを使用しているように見えるので(「ffmpeg」の末尾に.exeはありません)、名前付きパイプ、別名fifoを使用することをお勧めします。

mkfifo multimedia-pipe

Pythonスクリプトにオーディオデータを「multimedia-file」に書き込んでもらい、FFmpegに同じファイルから読み取るように依頼します。私はこのパターンを使用して、ディスク領域を占有することなく、検証のためにマルチメディアファイルを巨大な生の表現にデコードしました。

または、「http://...」URLをFFmpegの入力オプションに直接渡してみてください。

于 2012-05-01T16:55:58.823 に答える
0

PyAVは、ドキュメントのパスまたはファイルのようなオブジェクトで使用できます。

file(str)–開くファイル。文字列またはファイルのようなオブジェクトのいずれかです。

(バイト配列がある場合は、io.BytesIOに渡す前にラップすることができますav.open

于 2022-01-26T15:46:21.557 に答える