using UnityEngine;
using System;
using RenderHeads.Media.AVProVideo;
#if NETFX_CORE
using Windows.Storage;
using Windows.Storage.Pickers;
using Windows.Storage.Streams;
using System.Threading.Tasks;
#endif
//-----------------------------------------------------------------------------
// Copyright 2015-2018 RenderHeads Ltd. All rights reserverd.
//-----------------------------------------------------------------------------
namespace RenderHeads.Media.AVProVideo.Demos
{
///
/// Demonstration of how to use StorageFiles with AVProVideo in UWP builds
/// The code is put behind NETFX_CORE macros as it is only valid in UWP
/// This example loads a video picked by the user after clicking the Pick Video File button,
/// and directly from the CameraRoll with the right app capabilities set
///
public class NativeMediaOpen : MonoBehaviour
{
[SerializeField]
private MediaPlayer _player;
#if NETFX_CORE
private FileOpenPicker _picker;
private IRandomAccessStreamWithContentType _fileStream;
private string _fileName;
#endif
private void Start()
{
#if NETFX_CORE
_picker = new FileOpenPicker();
_picker.ViewMode = PickerViewMode.Thumbnail;
_picker.SuggestedStartLocation = PickerLocationId.VideosLibrary;
_picker.FileTypeFilter.Add(".mp4");
_picker.FileTypeFilter.Add(".m4v");
_picker.FileTypeFilter.Add(".mkv");
_picker.FileTypeFilter.Add(".avi");
_picker.FileTypeFilter.Add(".mp3");
_picker.FileTypeFilter.Add(".aac");
#endif
}
#if NETFX_CORE
private void StartFilePicker()
{
// Loads file on UI thread (note you can also use PickSingleFileAndContinue for better compatibility)
UnityEngine.WSA.Application.InvokeOnUIThread(async () =>
{
StorageFile file = await _picker.PickSingleFileAsync();
if (file != null)
{
await LoadFile(file);
}
}, true);
}
private void StartDirectLoad(StorageFolder folder, string relativeFilePath)
{
UnityEngine.WSA.Application.InvokeOnUIThread(async () =>
{
// NOTE: In order to access Camera Roll you need to set permission in the capabilities manifest
StorageFolder f = KnownFolders.CameraRoll;
// TODO: catch file not found exceptions
StorageFile file = await folder.GetFileAsync(relativeFilePath);
if (file != null)
{
await LoadFile(file);
}
}, true);
}
private async Task LoadFile(StorageFile file)
{
if (file != null)
{
_fileStream = await file.OpenReadAsync();
if (_fileStream != null)
{
_fileName = file.Name;
}
}
return true;
}
#endif
private void Update()
{
#if NETFX_CORE
// The actual loading of the video must happen in the Unity thread, so we do it here
if (_fileStream != null)
{
_player.OpenVideoFromStream(_fileStream, _fileName, true);
_fileStream = null;
}
#endif
}
private void OnGUI()
{
if (GUILayout.Button("Pick Video File"))
{
#if NETFX_CORE
StartFilePicker();
#endif
}
if (GUILayout.Button("Load 'myvideo.mp4' From Camera Roll"))
{
#if NETFX_CORE
StartDirectLoad(KnownFolders.CameraRoll, "myvideo.mp4");
#endif
}
if (_player != null && !string.IsNullOrEmpty(_player.m_VideoPath))
{
GUILayout.Label("Currently Playing: " + _player.m_VideoPath);
}
}
}
}