如何使用 PyAV 设置 mp3 编解码器的质量

问题描述 投票:0回答:1

我编写了一个简单的代码,使用 PyAV 从任何音频输入创建 .mp3 文件。它正在工作(粘贴在问题末尾)。但是,当使用

ffmpeg
时,可以设置 .mp3 文件的质量,我也想在我的代码中执行此操作。根据 ffmpeg 文档

q (-V)

为 VBR 设置恒定质量设置。该选项仅在使用 ffmpeg 命令行工具时有效。对于图书馆界面用户,请使用

global_quality

那么,问题是如何将

global_quality
与 PyAV 一起使用?

我在PyAV文档中找到了它,在

Wrapped C Types and Functions
下列为
struct AVCodecContext
,但我仍然不明白如何使用它。

我尝试使用

AudioCodecContext
创建一个
c = av.Codec('mp3').create()
(这是我发现的最接近 AVCodecContext 的东西),但它似乎没有
global_quality
字段。

我现有的功能:

    def encode_audio_to_mp3(input_file_path, output_file_path):
        input_container = av.open(input_file_path)
        output_container = av.open(output_file_path, 'w')
        output_stream = output_container.add_stream('mp3')
    
        for in_packet in input_container.demux():
            for in_frame in in_packet.decode():
                for out_packet in output_stream.encode(in_frame):
                    output_container.mux(out_packet)
    
        # Flush stream
        for packet in output_stream.encode():
            output_container.mux(packet)
    
        output_container.close()
        input_container.close()
python ffmpeg mp3 codec pyav
1个回答
0
投票

您可以设置音频流的比特率,从而控制质量。

import av


def encode_audio_to_mp3(input_path: str, output_path: str) -> None:
    input_ = av.open(input_path)
    output_container = av.open(output_path, "w")

    input_stream = input_.streams.audio[0]
    output_stream = output_container.add_stream("mp3")

    # Set the bitrate for the output stream
    output_stream.bit_rate = 50_000

    for packet in input_.demux(input_stream):
        for frame in packet.decode():
            for out_packet in output_stream.encode(frame):
                output_container.mux(out_packet)

    # Flush stream
    for packet in output_stream.encode():
        output_container.mux(packet)

    output_container.close()
    input_.close()
© www.soinside.com 2019 - 2024. All rights reserved.