You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从URL下载视频音频并直接转换为numpy数组,无需本地存储?

依赖安装

首先安装所需Python库,同时确保设备已配置ffmpeg环境:

pip install yt-dlp numpy ffmpeg-python
实现逻辑

整个流程全程在内存中完成,无本地文件落地:

  • 用yt-dlp解析视频URL获取直连的音频流地址
  • 调用ffmpeg直接读取音频流解码为原始PCM数据
  • 将PCM二进制数据转换为可用的numpy数组
完整可运行代码
import yt_dlp
import ffmpeg
import numpy as np
from io import BytesIO

def url_audio_to_numpy(video_url: str, sample_rate: int = 16000, mono: bool = True) -> tuple[np.ndarray, int]:
    """
    从视频URL直接提取音频并转换为numpy数组,无本地文件写入
    :param video_url: 目标视频URL
    :param sample_rate: 输出音频采样率,默认16000Hz
    :param mono: 是否转为单声道,默认是
    :return: 音频numpy数组(float32格式,取值范围[-1, 1]),采样率
    """
    ydl_opts = {
        "format": "bestaudio/best",
        "quiet": True,
        "no_warnings": True,
    }
    # 解析获取音频流直链
    with yt_dlp.YoutubeDL(ydl_opts) as ydl:
        info = ydl.extract_info(video_url, download=False)
        audio_stream_url = info["url"]
    
    # ffmpeg解码音频流为PCM数据
    audio_channel = 1 if mono else 2
    out, _ = (
        ffmpeg
        .input(audio_stream_url, threads=0)
        .output("-", format="s16le", acodec="pcm_s16le", ac=audio_channel, ar=sample_rate)
        .run(capture_stdout=True, capture_stderr=True)
    )
    
    # 转换为numpy数组
    audio_np = np.frombuffer(out, dtype=np.int16).astype(np.float32) / 32768.0
    # 双声道情况下调整数组形状为 (声道数, 采样点数)
    if not mono:
        audio_np = audio_np.reshape(-1, 2).T
    
    return audio_np, sample_rate
调用示例
# 替换为你的目标视频URL
audio_arr, sr = url_audio_to_numpy("https://example.com/your-video-url")
print(audio_arr.shape, sr)

内容的提问来源于stack exchange,提问作者ABaron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:45:01