如何将字符串解析为 subprocess.Popen 的输入?

Posted

技术标签:

【中文标题】如何将字符串解析为 subprocess.Popen 的输入?【英文标题】:How can i parse strings as the inputs to subprocess.Popen? 【发布时间】:2013-06-23 10:42:22 【问题描述】:

在这里,我尝试将第一个和第二个 30 秒长的视频文件从“path/connect.flv”剪切到文件 output1.flv 和 output2.flv。有用。我能够连接这两个文件以形成一个 60 秒长的新文件“final.flv”。所以这行得通,我得到了输出 output1.flv [30sec]、output2.flv[30sec] 和 final.flv[1min]。

这是python代码:

import subprocess

ffmpeg_command1 = ["ffmpeg", "-i", "/home/xincoz/test/connect.flv", "-acodec", "copy", "-ss", "00:00:00", "-t", "00:00:30", "/home/xincoz/test/output1.flv"]

ffmpeg_command2 = ["ffmpeg", "-i", "/home/xincoz/test/connect.flv", "-acodec", "copy", "-ss", "00:00:30", "-t", "00:00:30", "/home/xincoz/test/output2.flv"]

ffmpeg_command3 = ["mencoder", "-forceidx", "-ovc", "copy", "-oac", "pcm", "-o", "/home/xincoz/test/final.flv", "/home/xincoz/test/output1.flv", "/home/xincoz/test/output2.flv"]

subprocess.call(ffmpeg_command1)

subprocess.call(ffmpeg_command2)

subprocess.Popen(ffmpeg_command3)

但我真正想要的是连接两个字符串 out1 和 out2 并将这两个字符串连接到一个文件而不是连接“/home/xincoz/test/output1.flv”和“/home/xincoz/test/output2.flv ”。那么如何将字符串 out1 和 out2 解析为 mencoder 的输入呢?请编辑我的代码以实现结果。

import subprocess,os

ffmpeg_command = ["ffmpeg", "-i", "/home/xincoz/test/connect.flv", "-acodec", "copy", "-ss", "00:00:00", "-t", "00:00:30","-f", "flv", "pipe:1"]

p = subprocess.Popen(ffmpeg_command,stdout=subprocess.PIPE)

out1, err = p.communicate()

ffmpeg_command1 = ["ffmpeg", "-i", "/home/xincoz/test/connect.flv", "-acodec", "copy", "-ss", "00:00:30", "-t", "00:00:30","-f", "flv", "pipe:1"]

p1 = subprocess.Popen(ffmpeg_command1,stdout=subprocess.PIPE)

out2, err1 = p1.communicate()

ffmpeg_command2 = ["mencoder", "-forceidx", "-ovc", "copy", "-oac", "pcm", "-o", "/home/xincoz/test/final.flv", out1, out2 ]

p2=subprocess.Popen(ffmpeg_command2)

请帮助我。提前非常感谢。

【问题讨论】:

你能告诉我们out1和out2的内容是什么吗? 感谢@TomP 的回复。它是 output1.flv 和 output2.flv 中的二进制数据(即 connect.flv 的第一个和第二个 30 秒二进制数据)。这里我们没有创建 output1.flv 和 output2.flv,而是将二进制数据放入字符串 out1 和 out2。 我相信 Tom P 在询问视频和音频格式是什么,因为格式类型可以决定如何继续加入。很明显,它是“二进制数据”。 谢谢兄弟@LordNeckbeard。 -forceidx 选项可能需要一个真实文件,即通过标准输入管道数据,命名管道可能不起作用。无论如何你都可以测试它。 Here's an example that shows how to pass data using stdin, named pipe, NamedTemporaryFile。一个临时文件应该可以工作(它与您的第一个代码示例基本相同,除了当您并行启动多个脚本时文件名不会冲突)。 【参考方案1】:

您还没有说明您的代码是如何失败的,但看起来您正试图将 MEncoder 二进制字符串作为命令行参数。 http://www.mplayerhq.hu/DOCS/html/en/menc-feat-selecting-input.html 表示可以在命令行中给出文件名,而不是文件的内容。

所以回答你的问题:

with open('merged.flv', 'wb') as f:
    f.write(out1 + out2)

ffmpeg_command2 = ["mencoder", "your", "other", "args", "merged.flv"]

【讨论】:

以上是关于如何将字符串解析为 subprocess.Popen 的输入?的主要内容,如果未能解决你的问题,请参考以下文章

Python、子进程、管道和选择

python subprocess模块 监控子进程的2种方式 忙等待和立即返回同时设置子进程超时

如何使用 Dart 将字符串解析为数字?

如何将字符串解析为int

如何将字符串解析为 java.sql.date

如何将字符串解析为无类型