Unity - 上傳/下載 及 撥放影片

簡單紀錄如何使用Unity API 進行 上傳、下載以及撥放影片

上傳/下載 影片 - WebRequest

正常情況下,在Unity 5.4後一直到2018、2019的版本

UnityWebRequest已經可以充分替代舊有的www做使用

具體使用方法可以直接參考官方文件的UnityWebRequest條目,或是這篇技術文章來加強理解

以下針對我近期使用UnityWebRequest.Post進行上傳/下載的程式碼進行舉例

/// <summary>
/// 針對Post請求做流程處理
/// </summary>
/// <param name="uri">請求資源的Uri</param>
/// <param name="formData">附加的資料表單</param>
/// <param name="headers">附加的封包表頭</param>
/// <param name="onResp">事件回應時的處理</param>
/// <param name="onProgress">請求過程中的進度顯示</param>
/// <returns></returns>
public static IEnumerator Post(string uri, WWWForm formData, Dictionary<string, string> headers = null,
	Action<long, string> onResp = null,
	Action<float> onProgress = null)
{

	UnityWebRequest webRequest = UnityWebRequest.Post(uri, formData);
	if (headers != null)
	{
		var header = headers.GetEnumerator();

		while (header.MoveNext())
		{
			var curr = header.Current;
			webRequest.SetRequestHeader(curr.Key, curr.Value);
		}
	}

	if (onProgress == null)
	{
		yield return webRequest.SendWebRequest();
	}
	else
	{
		webRequest.SendWebRequest();
		while (!webRequest.isDone)
		{
			yield return null;
			onProgress.Invoke(webRequest.uploadProgress);
		}
	}

	if (webRequest.isNetworkError || webRequest.isHttpError)
	{
		onResp?.Invoke(webRequest.responseCode, webRequest.error);
	}
	else
	{
		onResp?.Invoke(webRequest.responseCode, webRequest.downloadHandler.text);
	}
}

其中WWWForm的欄位,基本的設定大致上使用 (文字欄位)AddField 及 (多媒體欄位)AddBinaryData 即可

上傳 / 下載 當前裝置影片

若是想要在處理上傳的請求時,加入當前裝置上所存放的多媒體資源(ex.影片、圖片)等

那你同樣可以透過UnityWebRequest.Get 配合 File Protocol (file:///)進行存取
※比較值得注意的是,根據當前實際運行平台類型不同,若是是從iOS平台取得檔案路徑,基本上檔案的根路徑就已經包含file:/// 了,要記得額外處理

//In IEnumerator function


//Media Data
string locFileProtocol = Application.platform == RuntimePlatform.IPhonePlayer ? "" : "File:///";
Debug.Log($"{locFileProtocol}{"yourMediaPath"}");
UnityWebRequest localFile = UnityWebRequest.Get($"{locFileProtocol}{ _recorder.MediaPath}");
yield return localFile.SendWebRequest();
if (localFile.isNetworkError || localFile.isHttpError)
{
	Debug.LogError("影片路徑抓取失敗\n請檢查授權中的儲存權限");
	yield break;
}

然後存取資源成功的情況下,就能直接取用 localFile.downloadHandler.data 的位元組資料,
並作為AddBinaryData的資料來源進行上傳了(如下)


var form = new WWWForm();
form.AddBinaryData("video", localFile.downloadHandler.data);

 

播放影片 - HandHeld

而在2018.2板之後,Unity提供了同時支援iOS/Android的內建方法 - HandHeld.PlayFullScreenMovie

基本上用法就只需要把檔案路徑填入,就可以搭配實際需求的邏輯進行觸發(ex.點擊按鈕後觸發)

※比較特別的是,在Editor上這個Function並不會真正的在GameView上運行,所以也可以搭配Application.OpenURL進行開發時的流程確認
Application.OpenURL在編輯器上進行呼叫時,預設來說會以其他的檢視工具程式將目標檔案進行開啟(ex.影片資源 會開啟影片撥放器、圖片 會開啟圖片檢視器)

public void PlayRecord()
{
	if (string.IsNullOrEmpty(MediaPath))
	{
		return;
	}

	if (CheckIsRuntimeInEditor())
	{
		Application.OpenURL(MediaPath);
	}
	else
	{
		Handheld.PlayFullScreenMovie(MediaPath);
	}
}




public static bool CheckIsRuntimeInEditor()
{
	var runtime = Application.platform;
	if (runtime == RuntimePlatform.WindowsEditor ||
		runtime == RuntimePlatform.OSXEditor ||
		runtime == RuntimePlatform.LinuxEditor)
	{
		return true;
	}

	return false;
}

 

追記

在開發的過程中,只有iOS平台基本上在獲取檔案位置時的根路徑是直接含有FileProtocol(file:///)

這會導致了在各種讀取檔案時抓取路徑的做法,要針對情況跟平台去特別處理是否要追加有FileProtocol(file:///)

 

以上,簡單在2019版本上做個紀錄

 


感謝觀看,若你能夠留下一些建議與感想
都會成為我寫文章的動力,感謝!!