一句旱、接入前準(zhǔn)備
- 下載ShareREC SDK地址 :下載Android_unity3d和iOS_unity3d
- android集成文檔 ---- ios集成文檔
二阳藻、Android端
將下載的ShareRec-xxx-for-Unity.unitypackage導(dǎo)入工程中,將ShareREC組件加入場景中谈撒,配置參數(shù)如下(Key和Secret填入在mob注冊應(yīng)用的信息):
之后按照文檔只需調(diào)用相應(yīng)的開啟錄制結(jié)束錄制方法即可以實現(xiàn)錄制
// 判斷是否支持錄制腥泥,在啟動錄制之前判斷(在虛擬機上不可用一直false)
ShareREC.IsAvailable();
// 啟動錄制
ShareREC.StartRecorder();
// 暫停錄制
ShareREC.PauseRecorder();
// 恢復(fù)錄制
ShareREC.ResumeRecorder();
// 停止錄制
ShareREC.StopRecorder();
2.1 接入中遇到的問題
- 按照文檔的配置完成后,在真機上測試IsAvailable()一直返回false啃匿,shareREC的demo工程可以運行蛔外,這種情況下,修改打包選項playerSeeting中的設(shè)置溯乒,下面是配置項:
shareRec Seeting設(shè)置.png
重要的是矩形框里的設(shè)置夹厌,Multuthreaded Rendering、 Graphics Jobs裆悄、 Protect Graphics Memory設(shè)置錯誤在錄制結(jié)束時會閃退
在plugins/Android/ShareREC中的AndroidManifest文件中<application>節(jié)點下加上秘鑰信息:<meta-data android:name="Mob-AppKey" android:value="xxx"/> <meta-data android:name="Mob-AppSecret" android:value="xxx"/>
- 在固定屏幕方向為橫屏?xí)r矛纹,通過ShareREC.ShowVideoCenter()打開視頻中心播放視頻程序會崩潰,豎屏下不會光稼,沒找到shareRec具體原因崖技,只得通過再打開shareREC的頁面時候改變屏幕方向,在頁面返回的回調(diào)
Screen.orientation = ScreenOrientation.Portrait;
三钟哥、加入shareSDK分享
下載shareSDK導(dǎo)入迎献,有幾點需要注意
-
在導(dǎo)入shareREC的時候的時候Plugins/Android/shareRec下和ShareSDK重復(fù)的jar包需要刪除,打包過程中AndroidManifest文件中沖突的部分也要刪除
ShareREC下jar包一覽.png
ShareSDK下jar包一覽.png shareSdk中的一個jar包需要在android環(huán)境下重新生成jar替換腻贰,清單文件中包名吁恍、key信息也要改,以后會整理一篇詳細說明
分享模塊配置完成后,在錄制完成后調(diào)用ShareREC.ShowShare ()如果分享的結(jié)果是一張圖片冀瓦,檢查清單文件中是否正確加入mob的key信息(2.1)伴奥,同時在shareRec組件掛載的物體上加上shareSDK組件,組件上的ByPass Approval設(shè)置為false翼闽,表示不繞過微信的包名簽名驗證拾徙,同時正確填入申請的微信的key信息,測試時把生成的包按照微信開發(fā)平臺填寫的包進行簽名感局,因為分享視頻的時候不能繞過驗證 附:不同平臺分享內(nèi)容的詳細說明
四尼啡、接入iOS ShareREC
-
導(dǎo)入在導(dǎo)入ios的shareREC包時千萬不要直接覆蓋,否則會把android的ShareREC文件覆蓋(ios和android的ShareREC腳本不同)询微,如果導(dǎo)入前已經(jīng)導(dǎo)入過ShareSDK包崖瞭,要取消勾選MiniJson(shareSDK中有),Editor下的sdk目錄不勾選是因為編譯成ios工程時在Xcode打開庫工程并未加入,還需手動導(dǎo)入撑毛,所以在unity中就不加入了;
iOS端導(dǎo)入ShareREC文件.png - 沒有導(dǎo)入ios的ShareREC.cs是因為會覆蓋书聚,更名后復(fù)制內(nèi)容加入工程,讓人想吐槽的是這個文件有兩處還是錯誤的藻雌,更正后如下雌续。這個腳本也需要掛載在場景中iOS才能分享
using UnityEngine;
using System.Collections;
using System;
namespace com.mob
{
/// <summary>
/// Finished record event.
/// </summary>
public delegate void FinishedRecordEvent (Exception ex);
/// <summary>
/// Close event.
/// </summary>
public delegate void CloseEvent ();
/// <summary>
/// Edit result event.
/// </summary>
public delegate void EditResultEvent (bool cancelled);
/// <summary>
///Custom platform event
/// </summary>
public delegate void CustomPlatformEvent(string platformName, string title, Hashtable recording);
public delegate void ShareEvent (SocialShareState state);
public delegate void ConfirmEditLastRecordingResultEvent (string mainVideoPath);
public enum SocialPageType
{
Share = 0, // share
ViewCenter = 1, // video center
Profile = 2 // profile
}
public enum SocialShareState
{
ShareStateBegin = 0,
ShareStateSuccess = 1,
ShareStateFail = 2,
ShareStateCancel = 3
}
/// <summary>
/// Share rec.
/// </summary>
public class ShareRecIOs : MonoBehaviour
{
/// <summary>
/// _callback the specified data.
/// </summary>
/// <param name="data">Data.</param>
private void shareRECCallback (string data)
{
if (Application.platform == RuntimePlatform.IPhonePlayer)
{
#if UNITY_IPHONE
ShareRECIOS.shareRECCallback(data);
#endif
}
else if (Application.platform == RuntimePlatform.Android)
{
#if UNITY_ANDROID
#endif
}
}
/// <summary>
/// Sets the name of the callback object.
/// </summary>
/// <param name="objectName">Object name.</param>
public static void setCallbackObjectName(string objectName)
{
if (objectName == null)
{
objectName = "Main Camera";
}
if (Application.platform == RuntimePlatform.IPhonePlayer)
{
#if UNITY_IPHONE
ShareRECIOS.setCallbackObjectName(objectName);
#endif
}
else if (Application.platform == RuntimePlatform.Android)
{
#if UNITY_ANDROID
#endif
}
}
/// <summary>
/// Pause the recoring.
/// </summary>
public static void pauseRecoring ()
{
#if UNITY_IPHONE
ShareRECIOS.pauseRecoring();
#elif UNITY_ANDROID
#endif
}
/// <summary>
/// Resume the recoring.
/// </summary>
public static void resumeRecoring ()
{
#if UNITY_IPHONE
ShareRECIOS.resumeRecoring();
#elif UNITY_ANDROID
#endif
}
/// <summary>
/// Starts the recoring.
/// </summary>
public static void startRecoring ()
{
#if UNITY_IPHONE
ShareRECIOS.startRecording();
#elif UNITY_ANDROID
#endif
}
/// <summary>
/// Stops the recording.
/// </summary>
public static void stopRecording (FinishedRecordEvent evt)
{
#if UNITY_IPHONE
ShareRECIOS.stopRecording(evt);
#elif UNITY_ANDROID
#endif
}
/// <summary>
/// Plaies the last recording.
/// </summary>
public static void playLastRecording()
{
#if UNITY_IPHONE
ShareRECIOS.playLastRecording();
#elif UNITY_ANDROID
#endif
}
/// <summary>
/// Sets the bit rate.
/// </summary>
/// <param name="bitRate">Bit rate.</param>
public static void setBitRate(int bitRate)
{
#if UNITY_IPHONE
ShareRECIOS.setBitRate(bitRate);
#elif UNITY_ANDROID
#endif
}
/// <summary>
/// Sets the FPS.
/// </summary>
/// <param name="fps">Fps.</param>
public static void setFPS(int fps)
{
#if UNITY_IPHONE
ShareRECIOS.setFPS(fps);
#elif UNITY_ANDROID
#endif
}
/// <summary>
/// Sets the minimum recording time.
/// </summary>
/// <param name="time">Time.</param>
public static void setMinimumRecordingTime(float time)
{
#if UNITY_IPHONE
ShareRECIOS.setMinimumRecordingTime(time);
#elif UNITY_ANDROID
#endif
}
/// <summary>
/// Lasts the recording path.
/// </summary>
/// <returns>The recording path.</returns>
public static string lastRecordingPath()
{
#if UNITY_IPHONE
return ShareRECIOS.lastRecordingPath();
#elif UNITY_ANDROID
#endif
return null;
}
/// <summary>
/// Edits the lasting recording.
/// </summary>
/// <param name="title">Title.</param>
/// <param name="userData">User data.</param>
/// <param name="evt">Evt.</param>
public static void editLastingRecording(string title, Hashtable userData, CloseEvent evt)
{
#if UNITY_IPHONE
ShareRECIOS.editLastRecording(title, userData, evt);
#elif UNITY_ANDROID
#endif
}
/// <summary>
/// Edits the last recording.
/// </summary>
/// <param name="evt">Evt.</param>
public static void editLastRecording(EditResultEvent evt)
{
#if UNITY_IPHONE
ShareRECIOS.editLastRecording(evt);
#elif UNITY_ANDROID
#endif
}
/// <summary>
/// Sets the sync audio comment.
/// </summary>
/// <param name="flag">If set to <c>true</c> flag.</param>
public static void setSyncAudioComment(bool flag)
{
#if UNITY_IPHONE
ShareRECIOS.setSyncAudioComment(flag);
#elif UNITY_ANDROID
#endif
}
/// <summary>
/// Opens the social.
/// </summary>
/// <param name="title">Title.</param>
/// <param name="userData">User data.</param>
/// <param name="pageType">Page type.</param>
/// <param name="evt">Evt.</param>
public static void openSocial(string title, Hashtable userData, SocialPageType pageType, CloseEvent evt)
{
#if UNITY_IPHONE
ShareRECIOS.openSocial(title, userData, pageType, evt);
#elif UNITY_ANDROID
#endif
}
public static void addCustomPlatform(string platformName, CustomPlatformEvent evt)
{
#if UNITY_IPHONE
// ShareRECIOS.addCustomPlatform();
#elif UNITY_ANDROID
#endif
}
public static void closeSocial()
{
//#if UNITY_IPHONE
// ShareRECIOS.
//#elif #elif UNITY_ANDROID
// #endif
}
public static void setShareAfterUploadCompleted(bool flag)
{
#if UNITY_IPHONE
ShareRECIOS.setShareAfterUploadCompleted(flag);
#elif UNITY_ANDROID
#endif
}
public static void openSocialWithShareResult (string title, Hashtable userData, SocialPageType pageType, CloseEvent evt, ShareEvent shareEvt)
{
#if UNITY_IPHONE
ShareRECIOS.openSocialWithShareResult(title, userData, pageType, evt, shareEvt);
#elif UNITY_ANDROID
#endif
}
public static void confirmEditLastRecording(ConfirmEditLastRecordingResultEvent evt)
{
#if UNITY_IPHONE
ShareRECIOS.confirmEditLastRecording(evt);
#elif UNITY_ANDROID
#endif
}
}
}
修改了文件名,對應(yīng)的Plugins/iOS/ShareREC/Editor/ShareRECConfigEditor.cs文件中的對原來文件名的引用處也要改為修改后的[CustomEditor(typeof(ShareRecIOs))]
- 在調(diào)用錄制方法處通過判斷平臺進行錄制,以下腳本我實現(xiàn)了簡單的ios和android的錄制胯杭,有需要可以參考
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using cn.sharerec;
using System;
using com.mob;
/// <summary>
/// 錄制視頻和分享的主要腳本.
/// </summary>
public class RecoderController : MonoBehaviour {
private bool isrecing = false;
public GameObject luzhiBtn; // 錄制顯示的按鈕
private Text timeText; // 顯示錄制時間的文本
float duration = 10f;
// Use this for initialization
void Start () {
timeText = luzhiBtn.transform.Find ("Text").GetComponent<Text> ();
}
// Update is called once per frame
void Update () {
if (isrecing) {
duration -= Time.deltaTime;
timeText.text = (int)duration + "''";
}
}
// 開始錄制視頻
public void recoderStart() {
// 正在錄制中
if (isrecing)
return;
duration = 10;
timeText.text = "10''";
#if UNITY_ANDROID
// 設(shè)備不支持錄制
if (!ShareREC.IsAvailable())
return;
ShareREC.OnRecorderStartedHandler = onStarted;
ShareREC.StartRecorder ();
#elif UNITY_IPHONE
// ios如果ShareRec腳本不在Main Camera上掛載需要說明
ShareRecIOs.setCallbackObjectName("shareRec");
ShareRecIOs.startRecoring();
onStarted();
#endif
}
// 開始錄制的監(jiān)聽
void onStarted() {
// 開始錄制驯杜,倒計時10S
isrecing = true;
Invoke("stopRecorder",10f);
// 顯示錄制UI
luzhiBtn.SetActive(true);
}
void stopRecorder() {
#if UNITY_ANDROID
ShareREC.OnRecorderStoppedHandler = onStopped;
ShareREC.StopRecorder ();
#elif UNITY_IPHONE
FinishedRecordEvent fin = new FinishedRecordEvent(recordFinishedHandler);
ShareRecIOs.stopRecording(fin);
#endif
luzhiBtn.SetActive(false);
}
// ios停止錄制
void recordFinishedHandler(Exception ex)
{
isrecing = false;
if (ex == null)
{
//調(diào)到分享界面
//Hashtable userData = new Hashtable();
//userData["DayOfWeek"] = System.DateTime.Today.DayOfYear;
Screen.orientation = ScreenOrientation.Portrait;
ShareRecIOs.openSocial ("分享一個視頻", null, SocialPageType.Share, new CloseEvent(()=>{
onShareReturn();
}));
}
}
// 停止錄制的監(jiān)聽
void onStopped() {
isrecing = false;
#if UNITY_ANDROID
// 視頻上傳完畢才能分享,不然上傳失敗也沒辦法觀看
// 修改屏幕方向歉摧,不然mob在觀看視頻會崩潰
Screen.orientation = ScreenOrientation.Portrait;
ShareREC.OnReturnFromShareHandler = onShareReturn;
ShareREC.setShareAfterUpload ();
ShareREC.ShowShare ();
#elif UNITY_IPHONE
#endif
}
// android 從分享界面返回
void onShareReturn() {
Screen.orientation = ScreenOrientation.LandscapeLeft;
}
}
- 在Xcode下需要加入SDK包到工程根目錄,在加入libz.td libicu.td libstdc.td javascript libsqlite 等設(shè)置不再詳細說明
五腔呜、將shareRec錄制的視頻顯示在相冊中
錄制結(jié)束后android端會保存一個視頻文件在設(shè)備上(位置可在shareREC上指定),在相冊中顯示把這個路徑通知到相冊就可以了
ios 錄制的視頻位置不能指定叁温,錄制的視頻存放在沙盒里的,同樣的通過sdk提供的方法得到路徑核畴,在根據(jù)路徑保存視頻膝但,相冊顯示
(1)、android
獲取剛錄制視頻的路徑
long[] aaa = ShareREC.ListLocalVideos();
//得到最后一個視頻的視頻id
long b = aaa[aaa.Length - 1];
//通過id得到視頻的存儲路徑
string videoPathAndroid = ShareREC.GetLocalVideoPath(b);
StartCoroutine (ScreenshotManager.SaveExisting (videoPathAndroid, false));
(2)谤草、iOS
string videoPathIos = ShareRecIOs.lastRecordingPath ();
saveVideoAtPathToPhotoalbum (videoPathIos);
(2.1) saveVideoAtPathToPhotoalbum 說明
此方法是一個插件方法跟束,在Plugins/iOS下加入兩個文件
1.PhotoAlbumUtil.h
#import <Foundation/Foundation.h>
#import <Security/Security.h>
@interface PhotoAlbumUtil : NSObject
+ (bool)saveVideoAtPathToPhotoalbum:(NSString *)path;
@end
2.PhotoAlbumUtil.m
#import "PhotoAlbumUtil.h"
#import <AssetsLibrary/AssetsLibrary.h>
@implementation PhotoAlbumUtil
+ (bool)saveVideoAtPathToPhotoalbum:(NSString *)path {
NSLog(@"存入視頻地址%s-------------",path);
if (path == NULL) {
return false;
}
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeVideoAtPathToSavedPhotosAlbum:[NSURL fileURLWithPath:path]
completionBlock:^(NSURL *assetURL, NSError *error) {
if (error) {
NSLog(@"Save video fail:%@",error);
} else {
NSLog(@"Save video succeed.");
}
}];
return true;
}
@end
最后,在調(diào)用方法的腳本中加入
[DllImport("__Internal")]
private static extern void saveVideoAtPathToPhotoalbum( string path );
說明:本文接入的shareREC版本 android:ShareREC for Unity Android 2.0.11.unitypackage iOS:v2.0.3