Mediaelement in Windows 8 Metro App - c#

I have a scenario specific to my app. I am managing music file playlist in XML for my metro app. And its saving music files actual path like this
D:\MyMedia\1.mp3
I have media element in my XAML page and I am setting its Source like this.
mediaElement.Source = new Uri(#"D:\MyMedia\1.mp3", UriKind.Absolute);
mediaElement.Play();
but its not playing the media and its giving the error like this
MF_MEDIA_ENGINE_ERR_SRC_NOT_SUPPORTED : HRESULT - 0x80070005
So someone tell me how I can play some media file in MediaElement of metro app with absoulte path. Or how I can get stream of my local file to play this media in my mediaElement of Metro app.

To open files on the local system, you can use the FileOpenPicker to get the file and SetSource to set the media source.
var openPicker = new Windows.Storage.Pickers.FileOpenPicker();
openPicker.FileTypeFilter.Add(".mp3");
var file = await openPicker.PickSingleFileAsync();
var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
if (null != file)
{
mediaElement.SetSource(stream, file.ContentType);
mediaElement.Play();
}

There is only a limited number of locations on a user's PC that you can access. "D:\Mymedia" is not one of those. You will find all the necessary information in the Microsoft help. Check out these two articles:
Quickstart: Accessing files programmatically
File access and permissions in Windows Store apps

This can be done without a file picker. You just have to add Music Library capabilities to your app manifest, make sure the music is in My Music or on an SD Card, and use KnownFolders.MusicLibrary.
In short and in keeping with the music theme of the question:
"You might think file picker...
...but all I need is StorageFile"
//
// Opens and plays song titled "[Cars]You_Might_Think.mp3"
// in the 80s folder.
//
// IMPORTANT: the example song must be in the user's Music
// folder or SD card to be found. Also, the app manifest
// must have 'Music Library' capabilities enabled.
//
//
//
async void OpenAndPlayAwesomeSongFromThe80s()
{
Windows.Storage.StorageFolder folder = KnownFolders.MusicLibrary;
StorageFile song = await folder.GetFileAsync("80s\\[Cars]You_Might_Think.mp3");
if (song != null)
{
IRandomAccessStream stream = await song.OpenAsync(Windows.Storage.FileAccessMode.Read);
if (stream != null)
{
mediaElement = new MediaElement();
mediaElement.SetSource(stream, song.ContentType);
mediaElement.Play();
}
}
}

I know it's an old problem, I found a really simple solution..
Windows.Storage.StorageFile file = null;
mediaElement player = new MediaElement();
async Task PlayAsync()
{
if (file == null)
{
file = await OpenFileAsync();
try { player.MediaOpened -= Player_MediaOpenedAsync; } catch { }
try { player.MediaEnded -= Player_MediaEnded; } catch { }
try { player.MediaFailed -= Player_MediaFailed; } catch { }
player.MediaOpened += Player_MediaOpenedAsync;
player.MediaEnded += Player_MediaEnded;
player.MediaFailed += Player_MediaFailed;
player.SetPlaybackSource(MediaSource.CreateFromStorageFile(file)); //Works with media playback..
//player.Source = new Uri(mediasource, UriKind.RelativeOrAbsolute); //Doesn't work with media playback for some reason..
Playing = true;
Paused = false;
}
else
{
if (Paused)
{
player.Play();
Paused = false;
}
else
{
player.Pause();
Paused = true;
}
}
}
async Task<StorageFile> OpenFileAsync()
{
try
{
var ofd = new FileOpenPicker();
ofd.FileTypeFilter.Add("*");
return await ofd.PickSingleFileAsync();
}
catch { }
return null;
}

Related

Uploading video to Azure Storage through Xamarin

I'm trying to upload a video file to my Azure Storage account. I've got it working with images, however trying to view an uploaded video gives the message "Video format or MIME-type is not supported". The video format is mp4.
I use the following code to upload:
public async Task UploadVideo(Stream video, string path)
{
var container = GetContainer("videos");
// Creates the container if it does not exist
await CreateContainer(container);
//Gets the file extension
string lastPart = path.Split('.').Last();
// Uploads the video to the blob storage
CloudBlockBlob videoBlob = container.GetBlockBlobReference(path);
videoBlob.Properties.ContentType = "video/" + lastPart;
await videoBlob.UploadFromStreamAsync(video);
}
Am I doing something wrong?
Thanks
Edit:
Here's the code I use to capture video on the phone:
private async Task TakeVideoButton_Clicked(object sender, EventArgs e)
{
if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakeVideoSupported)
{
await DisplayAlert("No Camera", ":( No camera avaialble.", "OK");
return;
}
mediaFile = await CrossMedia.Current.TakeVideoAsync(new Plugin.Media.Abstractions.StoreVideoOptions
{
Name = "video.mp4",
Directory = "DefaultVideos",
});
if (mediaFile == null)
return;
await DisplayAlert("Video Recorded", "Location: " + mediaFile.Path, "OK");
videoStream = mediaFile.GetStream();
file.Dispose();
}
I just tested this on my phone instead of my emulator and it worked perfectly there, so I'm going to assume it's purely a emulator related issue.

UWP playing a .aif file with AudioGraph

I am trying to play a sound with audio graph and it is failing on creating a file output node from a storage file. I have checked and the storage file is not null; The error I am getting is just unknown error and is of no help
Any ideas?
private async void HandlePlayCommand()
{
if (_audioGraph == null)
{
var settings = new AudioGraphSettings(AudioRenderCategory.Media);
var createResults = await AudioGraph.CreateAsync(settings);
if (createResults.Status != AudioGraphCreationStatus.Success) return;
_audioGraph = createResults.Graph;
var deviceResult = await _audioGraph.CreateDeviceOutputNodeAsync();
if(deviceResult.Status != AudioDeviceNodeCreationStatus.Success) return;
var outputNode = deviceResult.DeviceOutputNode;
StorageFile file = await GetStorageFiles();
var fileResult = await _audioGraph.CreateFileInputNodeAsync(file);
if (fileResult.Status != AudioFileNodeCreationStatus.Success) return;
var fileInputNode = fileResult.FileInputNode;
fileInputNode.AddOutgoingConnection(outputNode);
_audioGraph.Start();
}
}
private async Task<StorageFile> GetStorageFiles()
{
string CountriesFile = #"Assets\909_1.aif";
StorageFolder InstallationFolder = Windows.ApplicationModel.Package.Current.InstalledLocation;
StorageFile file = await InstallationFolder.GetFileAsync(CountriesFile);
return file;
}
By testing on my side, I'm afraid the .aif format currently is not supported by AudioGraph.CreateFileInputNodeAsync method. The formats sure to be supported that are .mp3,.wav,.wna,.m4a and so on. So the solution maybe change the audio files to other formats.
More details please reference the audio official sample.

How to access StorageFile from another method

So im making a windows store app that you select a file with one button, via file picker, then with another button it processes that file but im having trouble getting the selected file to processing method.
Since the Picker sets one of my text blocks to the path of the file to be displayed for the user i've tried using:
StorageFile file = await StorageFile.GetFileFromPathAsync(fullFilePath.Text);
But due to Windows RT limitations I just get access it denied from most locations
Any other suggestions on what to try?
First button click:
private async Task getFile()
{
FileOpenPicker openPicker = new FileOpenPicker();
openPicker.ViewMode = PickerViewMode.List;
openPicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
openPicker.FileTypeFilter.Add(".txt");
StorageFile file = await openPicker.PickSingleFileAsync();
if (file != null)
{
fullFilePath.Text = file.Path;
}
else
{
updateStatus("File Selection cancelled.");
}
}
Second button start this but needs to use the file from above
private async Task processFile()
{
...
string content = await FileIO.ReadTextAsync(file);
...
}
Make the StorageFile a field in your class:
class MyClass
{
StorageFile m_pickedFile;
async Task GetFile()
{
// Setup the picker...
m_pickedFile = await openPicker.PickSingleFileAsync();
// Show the path to the user...
}
async Task ProcessFile()
{
if (m_pickedFile != null)
{
// now use m_pickedFile...
}
}
}

Windows phone 8 and Surface pro 2 OpenStreamForWriteAsync blocks the app

I'm working on a project for windows phone and surface pro 2 app and I'm looking for reading a text from a .txt file.
I'm new in windows app development and I take over the project of an other guy.
I didn't change his code for the moment but there are some things I don't understand and the main problem is that when I use the app, this one is blocked when I call the method OpenStreamForWriteAsync().
Here is the code:
public async void FillIn()
{
Stream stream1 = null;
StorageFolder storageFolder = KnownFolders.DocumentsLibrary; // Gets Documents library
//The following structure code in comment is from me, is it necessary to
//do all these verification or "StorageFolder storageFolder =
//KnownFolders.DocumentsLibrary;" is enough ?
//try
//{
// folder = await KnownFolders.DocumentsLibrary.GetFolderAsync(AppFolderName);
//}
//catch (Exception)
//{
// // Folder does not exist, but we cannot await in a catch block, so we can not create it here.
//}
//if (folder == null)
//{
// folder = await KnownFolders.DocumentsLibrary.CreateFolderAsync(AppFolderName, CreationCollisionOption.OpenIfExists);
//}
// Test if the file exist
StorageFile report1 = null;
try
{
report1 = await storageFolder.GetFileAsync("report_final.txt"); // Take the .txt file.
}
catch { }
if (report1 == null)
{
// Could not find file
}
// PROBLEM IS HERE
stream1 = await report1.OpenStreamForWriteAsync(); // the app is blocked at this line
using (StreamReader sr1 = new StreamReader(stream1))
{
Texte = sr1.ReadToEnd();
sr1.Dispose(); // the guy before me use this but when we use "using"
//isn't it suppose to call "Dispose" at the end automatically ??
}
}
Thanks for your help and feel free to ask me more information if you don't understand something.

Open a file in Windows 8 Metro App C#

I have an array with file paths (like "C:\...") and I would like to open them with the default app, from my app. Let's say it's a list and when I click one of them, it opens.
This is the way to launch a file async:
await Windows.System.Launcher.LaunchFileAsync(fileToLaunch);
It requires a Windows.Storage.StorageFile type of file, which has a Path read-only property, so I cannot set the Path. How can I open them once they're tapped/clicked?
Copied from my link in the comments:
// Path to the file in the app package to launch
string exeFile = #"C:\Program Files (x86)\Steam\steamapps\common\Skyrim\TESV.exe";
var file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(exeFile);
if (file != null)
{
// Set the option to show the picker
var options = new Windows.System.LauncherOptions();
options.DisplayApplicationPicker = true;
// Launch the retrieved file
bool success = await Windows.System.Launcher.LaunchFileAsync(file, options);
if (success)
{
// File launched
}
else
{
// File launch failed
}
}
You can of course omit the var options = **-Part so the ApplicationPicker doesn't get opened
or you can use this:
StorageFile fileToLaunch = StorageFile.GetFileFromPathAsync(myFilePath);
await Windows.System.Launcher.LaunchFileAsync(fileToLaunch);
you should use this method
http://msdn.microsoft.com/en-US/library/windows/apps/windows.storage.storagefile.getfilefrompathasync
on the Type StorageFile
This method is used to get file if you have a path already
the answer is within this sample: http://code.msdn.microsoft.com/windowsapps/Association-Launching-535d2cec
short answer is :
// First, get the image file from the package's image directory.
string fileToLaunch = #"images\Icon.Targetsize-256.png";
var file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(fileToLaunch);
// Next, launch the file.
bool success = await Windows.System.Launcher.LaunchFileAsync(file);
Best solution is this:
string filePath = #"file:///C:\Somewhere\something.pdf";
if (filePath != null)
{
bool success = await Windows.System.Launcher.LaunchUriAsync(new Uri(filePath));
if (success)
{
// File launched
}
else
{
// File launch failed
}
}
Tha app launches it with the system default application, in this case with the Adobe Reader.

Categories

Resources