簡單紀錄如何使用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版本上做個紀錄
感謝觀看,若你能夠留下一些建議與感想
都會成為我寫文章的動力,感謝!!