如何合并音频和视频轨道以进行回放或从Web获取StorageFile?

时间:2018-12-31 21:51:46

标签: c# uwp

我开发了YouTube UWP客户端,我需要结合视频和音频轨道(混合文件只有480p及以下)。但由于StorageFile(URL长度约为800个字符),我无法得到PathTooLongException

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

我尝试了什么:

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

  • 使用StorageFile.GetFileFromApplicationUriAsync(Uri)代替StorageFile.GetFileFromPathAsync(string)

然后升起

  

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

根据Microsoft文档(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个字符)

2 个答案:

答案 0 :(得分:0)

不能。

StorageFile。*用于直接访问UWP应用的沙盒文件系统中的文件;访问已声明其功能的已知文件夹中的文件;或复制所选择的文件以从Internet下载/流式传输内容。

我引用:

  

magnific.js

     

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

     

ArgumentException`

     

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

...和

  

StorageFile.GetFileFromPathAsync

     

获取一个StorageFile对象,以表示指定的统一资源标识符(URI)应用程序资源。有关示例URI的示例,请参见StorageFile.GetFileFromApplicationUriAsync

     

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)使用此方法访问应用程序的资源

OP:

  

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

这有点暗示,因为Windows文件系统的最大路径约为255个字符,因此为什么也会出现此错误。完全拒绝它,甚至还没有意识到这不是一条路。

答案 1 :(得分:-1)

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

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