如何从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
相关产品推荐
相关产品推荐

