1

我正在尝试使用 ffmpy 从整个音频文件中提取某个音频片段,而我之前并没有真正使用过。到目前为止,我已经研究过提取某个时间范围,这建议使用如下命令:

ffmpeg -ss 00:01:00 -i input.mp3 -to 00:02:00 -c copy output.mp3

就我而言,我正在尝试编写一个 Python 脚本来对多个音频文件执行此操作。由于我正在从 csv 读取数据,因此我将重要信息存储在变量中。但是,作为 ffmpy 和 ffmpeg 的第一次用户,我真的不确定我应该如何做到这一点。

下面是我到目前为止的代码(包括到目前为止我尝试做的提取音频位的操作):

for line in reader:
        # Get access to the stored file as found in the audio_files dir
        print(line)
        folder_name = line[1].split("/")[len(line[1].split("/")) - 2]
        file_name = line[1].split("/")[len(line[1].split("/")) - 1]

        
        audio_file_path = "./audio_files/" + folder_name + "/" + file_name.split(".")[0] + ".mp3"
        print(audio_file_path)

        start_time = line[2]
        end_time = line[3]

        # Use ffmpy/ffmpeg to extract the audio bits
        ff = FFmpeg(inputs={file_name + ".mp3": "None"}, outputs={file_name + "_truncated.mp3": "None"})
        ff.cmd = 'ffmpeg -i "' + audio_file_path + '" -ss ' + start_time + ' -to ' + end_time + ' -async 1 ' + '"./audio_files/' + folder_name + '/' + file_name.split(".")[0] + '_cut.mp3"'
        print(ff.cmd)
        ff.run()

我目前面临的主要问题是我在运行ff.run(). 即使在命令行上运行相同的命令(使用 ffmpeg)似乎完美无缺,但当尝试使用ffmpy它运行时,我会给出“FFRuntime Exited With Status Code 1”,我不确定是什么原因造成的。由于我才刚刚开始使用 ffmpy 和 ffmpeg 我不完全确定我在做什么是正确的,所以任何帮助将不胜感激。

4

1 回答 1

0

该属性ff.cmd仅供您构建命令后参考。构建命令的关键在于FFmpeg() 调用。在您的情况下,您的ff创作应如下所示:

file_name = "spam"
start_time = '02:10'
end_time = '02:19'
ff = FFmpeg(
    inputs={file_name + ".mp3": None},
    outputs={file_name + "_truncated.mp3":
        '-ss ' + start_time + ' -to ' + end_time + ' -async 1 '})

ff.cmd
>> 'ffmpeg -i spam.mp3 -ss 02:10 -to 02:19 -async 1 spam_truncated.mp3'

对于调试,该调用ff.run()采用诸如stdoutand之类的参数stderr,您可以利用这些参数将ffmpeg的输出重定向到文件:

ff.run(
    stdout=open('out.txt', 'w'),
    stderr=open('err.txt', 'w')
)

查看这些文件的内容以调试您的命令。

我还建议查看 Python 文档以获取pathlib(以更直观地构建路径)和f-strings以获取可读的字符串格式。

于 2021-07-08T20:10:37.793 回答