我编写了一个简单的代码,使用 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()
您可以设置音频流的比特率,从而控制质量。
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()