【问题标题】:How to combine audio and video tracks for playback or get StorageFile from the web?如何组合音频和视频轨道进行播放或从 Web 获取 StorageFile?
【发布时间】:2019-01-02 03:11:14
【问题描述】:

我开发 YouTube UWP 客户端,我需要合并视频和音频轨道(混合文件只有 480p 和更低)。但是因为PathTooLongException,我无法获取StorageFile(网址长度约为800个字符)

我在 x64 机器上使用 Visual Studio 2019 Preview。最低目标版本是 Fall Creators Update,目标是 2018 年 10 月更新。

我做了什么:

  • 将最低版本升级到 2018 年 10 月更新

  • 使用StorageFile.GetFileFromApplicationUriAsync(Uri) 而不是StorageFile.GetFileFromPathAsync(string)

然后它上升

System.ArgumentException: '值不在预期范围内。'

根据微软文档 (https://docs.microsoft.com/ru-ru/dotnet/api/system.io.pathtoolongexception?view=netframework-4.7.2):

此异常可能是由于框架不兼容造成的,但在 UWP 应用中没有明显的方法可以直接更改目标框架。

这是我的代码:

MediaComposition muxedStream = new MediaComposition();

BackgroundAudioTrack audioTrack = await BackgroundAudioTrack.CreateFromFileAsync(await StorageFile.GetFileFromPathAsync(audioInfo.Url));   //Trying to get file throws an exception
MediaClip videoTrack = await MediaClip.CreateFromFileAsync(await StorageFile.GetFileFromPathAsync(videoInfo.Url));

muxedStream.BackgroundAudioTracks.Add(audioTrack);
muxedStream.Clips.Add(videoTrack);

videoSource.SetMediaStreamSource(muxedStream.GenerateMediaStreamSource());

我需要以某种方式绕过此异常或找到另一种组合流的方法。

网址示例:https://r9---sn-n8v7znsz.googlevideo.com/videoplayback?mime=video%2Fmp4&expire=1546167117&lmt=1543098677581810&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C298%2C299%2C302%2C303&sparams=aitags,clen,dur,ei,expire,gir,id,ip,ipbits,ipbypass,itag,keepalive,lmt,mime,mip,mm,mn,ms,mv,nh,pl,requiressl,source&key=cms1&pl=24&ipbits=0&txp=5532432&keepalive=yes&itag=137&requiressl=yes&ei=7U4oXNOULs-fyAWHl74I&ip=95.47.116.128&c=WEB&gir=yes&dur=274.999&id=o-ACk7-_Fgu_caJbjuRbtlayK-dgmNtLEqypLyLfwWbA2j&signature=8173BAF30157D47064F9BE1DB85CB5A910AA5008.28DA3ACEEE47AD89D56E1F162602C99D73751E02&source=youtube&clen=102247371&fvip=15&video_id=xO_XyOsHK6A&title=WOLFENSTEIN+2+SONG+%28COLOSSAL+CARNAGE%29+LYRIC+VIDEO+-+DAGames&rm=sn-uixgxjvh-ig3e7e,sn-3c2ed7y&fexp=23763603&req_id=69d1c8f74394a3ee&redirect_counter=2&cms_redirect=yes&ipbypass=yes&mip=5.187.79.66&mm=29&mn=sn-n8v7znsz&ms=rdu&mt=1546157635&mv=m&nh=IgpwcjA0LnN2bzA2KgkxMjcuMC4wLjE&ir=1&rr=12(976 个字符)

【问题讨论】:

  • 您能否改用HttpClient,并将StorageFile 与来自httpResponse.Content.ReadAsStreamAsync() 的流一起使用?
  • 不要使用 StorageFile 下载网络资源。 stackoverflow.com/a/37806443/17034
  • @HansPassant,我不需要下载文件。我需要流式传输它们。至少因为下载将比流式传输和在运行中组合它们花费更多的时间
  • @Matthew,你能提供更多细节吗?
  • 这非常模糊,谷歌搜索“uwp 流音频”之类的内容来查找相关匹配。

标签: c# uwp


【解决方案1】:

你不能。

StorageFile.* 用于直接访问 UWP 应用沙盒文件系统中的文件;访问已为其声明 Capabilities 的已知文件夹中的文件;或用于制作所选文件的副本用于从 Internet 下载/流式传输内容。

我引用:

StorageFile.GetFileFromPathAsync

获取一个 StorageFile 对象来表示指定路径下的文件。

ArgumentException`

路径不能是相对路径或Uri。检查路径的值。

...和

StorageFile.GetFileFromApplicationUriAsync

获取一个 StorageFile 对象来表示指定的统一资源标识符 (URI) 应用程序资源。有关示例 URI 的示例,请参阅Load images and assets tailored for scale, theme, high contrast, and others.

var uri = new Windows.Foundation.Uri("ms-appx:///datafile.xml") // <----- SEE Windows.Storage.StorageFile.getFileFromApplicationUriAsync(uri).done( /* Your success and error handlers */ );

您可以通过“ms-appx://”或“ms-appdata://”统一资源标识符 (URI) 使用此方法访问您应用的资源

操作:

但由于 PathTooLongException(url 长度约为 800 个字符),我无法获取 StorageFile

这是一个提示,因为 Windows 文件系统最大路径约为 255 个字符,因此您也会收到错误消息。它甚至在意识到这不是一条路径之前就直接拒绝了它。

【讨论】:

    【解决方案2】:

    我找到了另一个解决方案。

    很遗憾,无法从网络获取StorageFile。但我可以使用与一个时间线控制器链接的两个不同的播放器。这里有更详细的解决方案:How to play video and audio from separate URLs in UWP app?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      • 2018-02-25
      • 2012-10-18
      • 1970-01-01
      • 2020-01-28
      相关资源
      最近更新 更多