使用 AudioDecoder 解码音频流¶
在此示例中,我们将学习如何使用 AudioDecoder
类解码音频文件。
首先,一些样板代码:我们将从网络下载一个音频文件并定义一个音频播放工具。您可以忽略这部分,直接跳转到下面的 创建解码器。
import requests
from IPython.display import Audio
def play_audio(samples):
return Audio(samples.data, rate=samples.sample_rate)
# Audio source is CC0: https://opengameart.org/content/town-theme-rpg
# Attribution: cynicmusic.com pixelsphere.org
url = "https://opengameart.org/sites/default/files/TownTheme.mp3"
response = requests.get(url, headers={"User-Agent": ""})
if response.status_code != 200:
raise RuntimeError(f"Failed to download video. {response.status_code = }.")
raw_audio_bytes = response.content
创建解码器¶
现在我们可以从原始(编码的)音频字节创建解码器。您当然可以使用本地音频文件并将路径作为输入。您还可以解码视频中的音频流!
from torchcodec.decoders import AudioDecoder
decoder = AudioDecoder(raw_audio_bytes)
尚未通过解码器进行解码,但我们已经可以通过 metadata
属性访问一些元数据,该属性是一个 AudioStreamMetadata
对象。
print(decoder.metadata)
AudioStreamMetadata:
duration_seconds_from_header: 97.48898
begin_stream_seconds_from_header: 0.025057
bit_rate: 108039.0
codec: mp3
stream_index: 0
sample_rate: 44100
num_channels: 2
sample_format: fltp
解码样本¶
要获取解码后的样本,我们只需调用 get_all_samples()
方法,该方法返回一个 AudioSamples
对象
samples = decoder.get_all_samples()
print(samples)
play_audio(samples)
AudioSamples:
data (shape): torch.Size([2, 4297722])
pts_seconds: 0.02505668934240363
duration_seconds: 97.45401360544217
sample_rate: 44100