UWP下C#如何从googlevideos videoplayback链接下载音频
问题背景
已获取YouTube音频的临时直链(示例链接如下),需要在UWP项目的public async Task Download(string url)方法中实现高效下载:
https://rr6---sn-n8v7znsr.googlevideo.com/videoplayback?expire=1691861737&ei=iW7XZM3hHciwv_IP3oe_oAk&ip=kekw&id=o-AH6t-rpPJjbEN9qDVOJlCEU2FTLNrvRtMslTqQ0T4as4&itag=251&source=youtube&requiressl=yes&mh=QC&mm=31%2C26&mn=sn-n8v7znsr%2Csn-c0q7lnse&ms=au%2Conr&mv=m&mvi=6&pl=21&gcr=ru&initcwndbps=1281250&vprv=1&mime=audio%2Fwebm&gir=yes&clen=1641566&dur=108.561&lmt=1689370605701687&mt=1691839772&fvip=5&keepalive=yes&fexp=24007246&c=ANDROID_TESTSUITE&txp=5432434&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cgcr%2Cvprv%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AOq0QJ8wRQIgV1LPFsKrQ558nwhqkatBGRWchRXYBWo1fSrc0fSujtkCIQDfpHxCk8hwwyTezP6e6yIGXR7yGNxLfv9qEkP99C_eiw%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIgFvFgT1ALo6OrKY_QRvD6-XilXezUdxdObEtQ3Xo9DaQCIQCD-LWIv8v0y04x0ZExDjfZ_kFZbbxBYHaDejTILMmHug%3D%3D
此前尝试的YoutubeExplode方案因UWP无法使用File类导致权限报错,VideoLibrary+MediaToolKit需先下载视频再转码,效率低下。以下是适配UWP的原生高效下载方案:
解决方案代码
利用UWP原生的HttpClient和StorageFileAPI实现直接音频流下载,无需转码:
using Windows.Storage; using Windows.Storage.Pickers; using System.Net.Http; using System.IO; public async Task Download(string url) { // 初始化HttpClient,设置浏览器UA避免请求被拦截 using var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.UserAgent.ParseAdd( "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" ); // 获取音频流 using var audioStream = await httpClient.GetStreamAsync(url); // 让用户选择保存位置和文件名 var savePicker = new FileSavePicker(); savePicker.SuggestedStartLocation = PickerLocationId.Downloads; savePicker.FileTypeChoices.Add("WebM 音频文件", new List<string> { ".webm" }); savePicker.SuggestedFileName = "YouTube_Audio"; var targetFile = await savePicker.PickSaveFileAsync(); if (targetFile == null) return; // 用户取消操作 // 将音频流写入目标文件 using var fileStream = await targetFile.OpenStreamForWriteAsync(); await audioStream.CopyToAsync(fileStream); await fileStream.FlushAsync(); }
关键注意事项
- 权限配置:在项目的
Package.appxmanifest中开启Internet (Client)权限,确保应用能发起网络请求;使用FileSavePicker无需额外文件访问权限(用户主动选择路径)。 - 请求头设置:必须添加浏览器UA,否则Google视频服务器可能拒绝请求(返回403错误)。
- 链接有效期:YouTube的直链带有
expire参数,需确保调用下载时链接未过期。 - 高效性:直接下载音频流,跳过视频下载和转码步骤,与浏览器下载效率一致。
内容的提问来源于stack exchange,提问作者aexra

