126 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C#
		
	
	
	
| 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
 | |
| {
 | |
| 	/// <summary>
 | |
| 	/// 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
 | |
| 	/// </summary>
 | |
| 	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<bool> 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);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| } |