微短劇媒體上傳
微短劇解決方案提供SDK或API的媒體上傳方式。通過閱讀本文,您可以了解微短劇媒體上傳的基本操作步驟。
使用微短劇媒體上傳前,請(qǐng)確保您已基本了解什么是媒體上傳。詳情媒體上傳概述。
媒體上傳基礎(chǔ)流程
在視頻點(diǎn)播服務(wù)內(nèi)獲取上傳憑證和上傳地址。
調(diào)用OSS上傳能力上傳媒體。
上傳SDK(推薦使用)
上傳SDK封裝了獲取上傳憑證及地址的邏輯和OSS上傳的邏輯。開發(fā)者僅需要簡(jiǎn)單配置就可以實(shí)現(xiàn)上傳功能,推薦使用。
調(diào)用相應(yīng)接口完成上傳,示例Demo如下:
public class Sample {
// 賬號(hào)AK信息請(qǐng)?zhí)顚懀ū剡x)
// 阿里云賬號(hào)AccessKey擁有所有API的訪問權(quán)限,建議您使用RAM用戶進(jìn)行API訪問或日常運(yùn)維。
// 強(qiáng)烈建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導(dǎo)致AccessKey泄露,威脅您賬號(hào)下所有資源的安全。
// 本示例通過從環(huán)境變量中讀取AccessKey,來實(shí)現(xiàn)API訪問的身份驗(yàn)證。運(yùn)行代碼示例前,請(qǐng)配置環(huán)境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
private static final String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
private static final String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
public static void main(String[] args) {
// 視頻文件上傳
// 視頻標(biāo)題(必選)
String title = "測(cè)試標(biāo)題";
// 1.本地文件上傳和文件流上傳時(shí),文件名稱為上傳文件絕對(duì)路徑,如:/User/sample/文件名稱.mp4 (必選)
// 2.網(wǎng)絡(luò)流上傳時(shí),文件名稱為源文件名,如文件名稱.mp4(必選)。
// 3.流式上傳時(shí),文件名稱為源文件名,如文件名稱.mp4(必選)。
// 任何上傳方式文件名必須包含擴(kuò)展名
String fileName = "/Users/test/video/test.mp4";
// 本地文件上傳
testUploadVideo(accessKeyId, accessKeySecret, title, fileName);
// 待上傳視頻的網(wǎng)絡(luò)流地址
String url = "http://test.aliyun.com/video/test.mp4";
// 2.網(wǎng)絡(luò)流上傳
// 文件擴(kuò)展名,當(dāng)url中不包含擴(kuò)展名時(shí),需要設(shè)置該參數(shù)
String fileExtension = "mp4";
testUploadURLStream(accessKeyId, accessKeySecret, title, url, fileExtension);
// 3.文件流上傳
testUploadFileStream(accessKeyId, accessKeySecret, title, fileName);
// 4.流式上傳,如文件流和網(wǎng)絡(luò)流
InputStream inputStream = null;
// 4.1 文件流
try {
inputStream = new FileInputStream(fileName);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 4.2 網(wǎng)絡(luò)流
try {
inputStream = new URL(url).openStream();
} catch (IOException e) {
e.printStackTrace();
}
testUploadStream(accessKeyId, accessKeySecret, title, fileName, inputStream);
}
/**
* 本地文件上傳接口
*
* @param accessKeyId
* @param accessKeySecret
* @param title
* @param fileName
*/
private static void testUploadVideo(String accessKeyId, String accessKeySecret, String title, String fileName) {
UploadVideoRequest request = new UploadVideoRequest(accessKeyId, accessKeySecret, title, fileName);
/* 可指定分片上傳時(shí)每個(gè)分片的大小,默認(rèn)為2M字節(jié) */
request.setPartSize(2 * 1024 * 1024L);
/* 可指定分片上傳時(shí)的并發(fā)線程數(shù),默認(rèn)為1,(注:該配置會(huì)占用服務(wù)器CPU資源,需根據(jù)服務(wù)器情況指定)*/
request.setTaskNum(1);
/* 是否開啟斷點(diǎn)續(xù)傳, 默認(rèn)斷點(diǎn)續(xù)傳功能關(guān)閉。當(dāng)網(wǎng)絡(luò)不穩(wěn)定或者程序崩潰時(shí),再次發(fā)起相同上傳請(qǐng)求,可以繼續(xù)未完成的上傳任務(wù),適用于超時(shí)3000秒仍不能上傳完成的大文件。
注意:斷點(diǎn)續(xù)傳開啟后,會(huì)在上傳過程中將上傳位置寫入本地磁盤文件,影響文件上傳速度,請(qǐng)您根據(jù)實(shí)際情況選擇是否開啟*/
//request.setEnableCheckpoint(false);
/* OSS慢請(qǐng)求日志打印超時(shí)時(shí)間,是指每個(gè)分片上傳時(shí)間超過該閾值時(shí)會(huì)打印debug日志,如果想屏蔽此日志,請(qǐng)調(diào)整該閾值。單位:毫秒,默認(rèn)為300000毫秒*/
//request.setSlowRequestsThreshold(300000L);
/* 可指定每個(gè)分片慢請(qǐng)求時(shí)打印日志的時(shí)間閾值,默認(rèn)為300s*/
//request.setSlowRequestsThreshold(300000L);
/* 是否顯示水?。蛇x),指定模板組ID時(shí),根據(jù)模板組配置確定是否顯示水印*/
//request.setIsShowWaterMark(true);
/* 自定義消息回調(diào)設(shè)置及上傳加速設(shè)置(可選), Extend為自定義擴(kuò)展設(shè)置,MessageCallback為消息回調(diào)設(shè)置,AccelerateConfig為上傳加速設(shè)置(上傳加速功能需要先申請(qǐng)開通后才能使用)*/
//request.setUserData("{\"Extend\":{\"test\":\"www\",\"localId\":\"xxxx\"},\"MessageCallback\":{\"CallbackType\":\"http\",\"CallbackURL\":\"http://example.aliyundoc.com\"},\"AccelerateConfig\":{\"Type\":\"oss\",\"Domain\":\"****Bucket.oss-accelerate.aliyuncs.com\"}}");
/* 視頻分類ID(可選) */
//request.setCateId(0);
/* 視頻標(biāo)簽,多個(gè)用逗號(hào)分隔(可選) */
//request.setTags("標(biāo)簽1,標(biāo)簽2");
/* 視頻描述(可選)*/
//request.setDescription("視頻描述");
/* 封面圖片(可選)*/
//request.setCoverURL("http://cover.example.com/image_01.jpg");
/* 模板組ID(可選)*/
//request.setTemplateGroupId("8c4792cbc8694e7084fd5330e5****");
/* 工作流ID(可選)*/
//request.setWorkflowId("d4430d07361f0*be1339577859b0****");
/* 存儲(chǔ)區(qū)域(可選)*/
//request.setStorageLocation("in-201703232118266-5sejd****.oss-cn-shanghai.aliyuncs.com");
/* 開啟默認(rèn)上傳進(jìn)度回調(diào) */
//request.setPrintProgress(false);
/* 設(shè)置自定義上傳進(jìn)度回調(diào)(必須繼承 VoDProgressListener)*/
/*默認(rèn)關(guān)閉。如果開啟了這個(gè)功能,上傳過程中服務(wù)端會(huì)在日志中返回上傳詳情。如果不需要接收此消息,需關(guān)閉此功能*/
//request.setProgressListener(new PutObjectProgressListener());
/* 設(shè)置您實(shí)現(xiàn)的生成STS信息的接口實(shí)現(xiàn)類*/
// request.setVoDRefreshSTSTokenListener(new RefreshSTSTokenImpl());
/* 設(shè)置應(yīng)用ID*/
//request.setAppId("app-100****");
/* 點(diǎn)播服務(wù)接入點(diǎn) */
//request.setApiRegionId("cn-shanghai");
/* ECS部署區(qū)域*/
// request.setEcsRegionId("cn-shanghai");
/* 配置代理訪問(可選) */
//OSSConfig ossConfig = new OSSConfig();
/* <必填>設(shè)置代理服務(wù)器主機(jī)地址 */
//ossConfig.setProxyHost("<yourProxyHost>");
/* <必填>設(shè)置代理服務(wù)器端口 */
//ossConfig.setProxyPort(-1);
/* 設(shè)置連接OSS所使用的協(xié)議(HTTP或HTTPS),默認(rèn)為HTTP */
//ossConfig.setProtocol("HTTP");
/* 設(shè)置用戶代理,指HTTP的User-Agent頭,默認(rèn)為aliyun-sdk-java */
//ossConfig.setUserAgent("<yourUserAgent>");
/* 設(shè)置代理服務(wù)器驗(yàn)證的用戶名,https協(xié)議時(shí)需要填 */
//ossConfig.setProxyUsername("<yourProxyUserName>");
/* 設(shè)置代理服務(wù)器驗(yàn)證的密碼,https協(xié)議時(shí)需要填 */
//ossConfig.setProxyPassword("<yourProxyPassword>");
//request.setOssConfig(ossConfig);
UploadVideoImpl uploader = new UploadVideoImpl();
UploadVideoResponse response = uploader.uploadVideo(request);
System.out.print("RequestId=" + response.getRequestId() + "\n"); //請(qǐng)求視頻點(diǎn)播服務(wù)的請(qǐng)求ID
if (response.isSuccess()) {
System.out.print("VideoId=" + response.getVideoId() + "\n");
} else {
/* 如果設(shè)置回調(diào)URL無效,不影響視頻上傳,可以返回VideoId同時(shí)會(huì)返回錯(cuò)誤碼。其他情況上傳失敗時(shí),VideoId為空,此時(shí)需要根據(jù)返回錯(cuò)誤碼分析具體錯(cuò)誤原因 */
System.out.print("VideoId=" + response.getVideoId() + "\n");
System.out.print("ErrorCode=" + response.getCode() + "\n");
System.out.print("ErrorMessage=" + response.getMessage() + "\n");
}
}
/**
* URL網(wǎng)絡(luò)流上傳。支持?jǐn)帱c(diǎn)續(xù)傳,最大支持48.8TB的單個(gè)文件。
* 該上傳方式需要先將網(wǎng)絡(luò)文件下載到本地磁盤,再進(jìn)行上傳,所以要保證本地磁盤有充足的空間。
* 當(dāng)您設(shè)置的URL中不包括文件擴(kuò)展名時(shí),需要單獨(dú)設(shè)置fileExtension,表示文件擴(kuò)展名。
* @param accessKeyId
* @param accessKeySecret
* @param title
* @param fileExtension
* @param url
*/
private static void testUploadURLStream(String accessKeyId, String accessKeySecret, String title, String url, String fileExtension) {
UploadURLStreamRequest request = new UploadURLStreamRequest(accessKeyId, accessKeySecret, title, url);
/* 文件擴(kuò)展名*/
request.setFileExtension(fileExtension);
/* 網(wǎng)絡(luò)文件下載連接超時(shí),單位毫秒,0-表示不限制*/
request.setDownloadConnectTimeout(1000);
/* 網(wǎng)絡(luò)文件下載讀取超時(shí),單位毫秒,0-表示不限制*/
request.setDownloadReadTimeout(0);
/* 網(wǎng)絡(luò)文件下載后保存的本地目錄*/
request.setLocalDownloadFilePath("/Users/download");
/* 是否顯示水?。蛇x),指定模板組ID時(shí),根據(jù)模板組配置確定是否顯示水印*/
//request.setShowWaterMark(true);
/* 自定義消息回調(diào)設(shè)置及上傳加速設(shè)置(可選),Extend為自定義擴(kuò)展設(shè)置,MessageCallback為消息回調(diào)設(shè)置,AccelerateConfig為上傳加速設(shè)置(上傳加速功能需要先申請(qǐng)開通后才能使用) */
//request.setUserData("{\"Extend\":{\"test\":\"www\",\"localId\":\"xxxx\"},\"MessageCallback\":{\"CallbackType\":\"http\",\"CallbackURL\":\"http://example.aliyundoc.com\"},\"AccelerateConfig\":{\"Type\":\"oss\",\"Domain\":\"****Bucket.oss-accelerate.aliyuncs.com\"}}");
/* 視頻分類ID(可選) */
//request.setCateId(0);
/* 視頻標(biāo)簽,多個(gè)用逗號(hào)分隔(可選) */
//request.setTags("標(biāo)簽1,標(biāo)簽2");
/* 視頻描述(可選) */
//request.setDescription("視頻描述");
/* 封面圖片(可選)*/
//request.setCoverURL("http://cover.example.com/image_01.jpg");
/* 模板組ID(可選)*/
//request.setTemplateGroupId("8c4792cbc8694e7084fd5330e56****");
/* 工作流ID(可選)*/
//request.setWorkflowId("d4430d07361f0*be1339577859b0****");
/* 存儲(chǔ)區(qū)域(可選)*/
//request.setStorageLocation("in-201703232118266-5sejd****.oss-cn-shanghai.aliyuncs.com");
/* 開啟默認(rèn)上傳進(jìn)度回調(diào) */
//request.setPrintProgress(true);
/* 設(shè)置自定義上傳進(jìn)度回調(diào) (必須繼承 VoDProgressListener)*/
/*默認(rèn)關(guān)閉。如果開啟了這個(gè)功能,上傳過程中服務(wù)端會(huì)在日志中返回上傳詳情。如果不需要接收此消息,需關(guān)閉此功能*/
//request.setProgressListener(new PutObjectProgressListener());
/* 設(shè)置應(yīng)用ID*/
//request.setAppId("app-100****");
/* 點(diǎn)播服務(wù)接入點(diǎn) */
//request.setApiRegionId("cn-shanghai");
/* ECS部署區(qū)域*/
// request.setEcsRegionId("cn-shanghai");
/* 配置代理訪問(可選) */
//OSSConfig ossConfig = new OSSConfig();
/* <必填>設(shè)置代理服務(wù)器主機(jī)地址 */
//ossConfig.setProxyHost("<yourProxyHost>");
/* <必填>設(shè)置代理服務(wù)器端口 */
//ossConfig.setProxyPort(-1);
/* 設(shè)置連接OSS所使用的協(xié)議(HTTP或HTTPS),默認(rèn)為HTTP */
//ossConfig.setProtocol("HTTP");
/* 設(shè)置用戶代理,指HTTP的User-Agent頭,默認(rèn)為aliyun-sdk-java */
//ossConfig.setUserAgent("<yourUserAgent>");
/* 設(shè)置代理服務(wù)器驗(yàn)證的用戶名,https協(xié)議時(shí)需要填 */
//ossConfig.setProxyUsername("<yourProxyUserName>");
/* 設(shè)置代理服務(wù)器驗(yàn)證的密碼,https協(xié)議時(shí)需要填 */
//ossConfig.setProxyPassword("<yourProxyPassword>");
//request.setOssConfig(ossConfig);
UploadVideoImpl uploader = new UploadVideoImpl();
UploadURLStreamResponse response = uploader.uploadURLStream(request);
System.out.print("RequestId=" + response.getRequestId() + "\n"); //請(qǐng)求視頻點(diǎn)播服務(wù)的請(qǐng)求ID
if (response.isSuccess()) {
System.out.print("VideoId=" + response.getVideoId() + "\n");
} else {
/* 如果設(shè)置回調(diào)URL無效,不影響視頻上傳,可以返回VideoId同時(shí)會(huì)返回錯(cuò)誤碼。其他情況上傳失敗時(shí),VideoId為空,此時(shí)需要根據(jù)返回錯(cuò)誤碼分析具體錯(cuò)誤原因 */
System.out.print("VideoId=" + response.getVideoId() + "\n");
System.out.print("ErrorCode=" + response.getCode() + "\n");
System.out.print("ErrorMessage=" + response.getMessage() + "\n");
}
}
/**
* 文件流上傳接口
*
* @param accessKeyId
* @param accessKeySecret
* @param title
* @param fileName
*/
private static void testUploadFileStream(String accessKeyId, String accessKeySecret, String title, String fileName) {
UploadFileStreamRequest request = new UploadFileStreamRequest(accessKeyId, accessKeySecret, title, fileName);
/* 是否使用默認(rèn)水?。蛇x),指定模板組ID時(shí),根據(jù)模板組配置確定是否使用默認(rèn)水印*/
//request.setShowWaterMark(true);
/* 自定義消息回調(diào)設(shè)置及上傳加速設(shè)置(可選),Extend為自定義擴(kuò)展設(shè)置,MessageCallback為消息回調(diào)設(shè)置,AccelerateConfig為上傳加速設(shè)置(上傳加速功能需要先申請(qǐng)開通后才能使用)*/
//request.setUserData("{\"Extend\":{\"test\":\"www\",\"localId\":\"xxxx\"},\"MessageCallback\":{\"CallbackType\":\"http\",\"CallbackURL\":\"http://example.aliyundoc.com\"},\"AccelerateConfig\":{\"Type\":\"oss\",\"Domain\":\"****Bucket.oss-accelerate.aliyuncs.com\"}}");
/* 視頻分類ID(可選)*/
//request.setCateId(0);
/* 視頻標(biāo)簽,多個(gè)用逗號(hào)分隔(可選) */
//request.setTags("標(biāo)簽1,標(biāo)簽2");
/* 視頻描述(可選)*/
//request.setDescription("視頻描述");
/* 封面圖片(可選)*/
//request.setCoverURL("http://cover.example.com/image_01.jpg");
/* 模板組ID(可選)*/
//request.setTemplateGroupId("8c4792cbc8694e7084fd5330e56****");
/* 工作流ID(可選)*/
//request.setWorkflowId("d4430d07361f0*be1339577859b0****");
/* 存儲(chǔ)區(qū)域(可選)*/
//request.setStorageLocation("in-201703232118266-5sejd****.oss-cn-shanghai.aliyuncs.com");
/* 開啟默認(rèn)上傳進(jìn)度回調(diào) */
//request.setPrintProgress(true);
/* 設(shè)置自定義上傳進(jìn)度回調(diào)(必須繼承 VoDProgressListener)*/
/*默認(rèn)關(guān)閉。如果開啟了這個(gè)功能,上傳過程中服務(wù)端會(huì)在日志中返回上傳詳情。如果不需要接收此消息,需關(guān)閉此功能*/
//request.setProgressListener(new PutObjectProgressListener());
/* 設(shè)置應(yīng)用ID*/
//request.setAppId("app-100****");
/* 點(diǎn)播服務(wù)接入點(diǎn) */
//request.setApiRegionId("cn-shanghai");
/* ECS部署區(qū)域*/
// request.setEcsRegionId("cn-shanghai");
/* 配置代理訪問(可選) */
//OSSConfig ossConfig = new OSSConfig();
/* <必填>設(shè)置代理服務(wù)器主機(jī)地址 */
//ossConfig.setProxyHost("<yourProxyHost>");
/* <必填>設(shè)置代理服務(wù)器端口 */
//ossConfig.setProxyPort(-1);
/* 設(shè)置連接OSS所使用的協(xié)議(HTTP或HTTPS),默認(rèn)為HTTP */
//ossConfig.setProtocol("HTTP");
/* 設(shè)置用戶代理,指HTTP的User-Agent頭,默認(rèn)為aliyun-sdk-java */
//ossConfig.setUserAgent("<yourUserAgent>");
/* 設(shè)置代理服務(wù)器驗(yàn)證的用戶名,https協(xié)議時(shí)需要填 */
//ossConfig.setProxyUsername("<yourProxyUserName>");
/* 設(shè)置代理服務(wù)器驗(yàn)證的密碼,https協(xié)議時(shí)需要填 */
//ossConfig.setProxyPassword("<yourProxyPassword>");
//request.setOssConfig(ossConfig);
UploadVideoImpl uploader = new UploadVideoImpl();
UploadFileStreamResponse response = uploader.uploadFileStream(request);
System.out.print("RequestId=" + response.getRequestId() + "\n"); //請(qǐng)求視頻點(diǎn)播服務(wù)的請(qǐng)求ID
if (response.isSuccess()) {
System.out.print("VideoId=" + response.getVideoId() + "\n");
} else {
/* 如果設(shè)置回調(diào)URL無效,不影響視頻上傳,可以返回VideoId同時(shí)會(huì)返回錯(cuò)誤碼。其他情況上傳失敗時(shí),VideoId為空,此時(shí)需要根據(jù)返回錯(cuò)誤碼分析具體錯(cuò)誤原因 */
System.out.print("VideoId=" + response.getVideoId() + "\n");
System.out.print("ErrorCode=" + response.getCode() + "\n");
System.out.print("ErrorMessage=" + response.getMessage() + "\n");
}
}
/**
* 流式上傳接口
*
* @param accessKeyId
* @param accessKeySecret
* @param title
* @param fileName
* @param inputStream
*/
private static void testUploadStream(String accessKeyId, String accessKeySecret, String title, String fileName, InputStream inputStream) {
UploadStreamRequest request = new UploadStreamRequest(accessKeyId, accessKeySecret, title, fileName, inputStream);
/* 是否使用默認(rèn)水?。蛇x),指定模板組ID時(shí),根據(jù)模板組配置確定是否使用默認(rèn)水印*/
//request.setShowWaterMark(true);
/* 自定義消息回調(diào)設(shè)置及上傳加速設(shè)置(可選), Extend為自定義擴(kuò)展設(shè)置,MessageCallback為消息回調(diào)設(shè)置,AccelerateConfig為上傳加速設(shè)置(上傳加速功能需要先申請(qǐng)開通后才能使用)*/
//request.setUserData("{\"Extend\":{\"test\":\"www\",\"localId\":\"xxxx\"},\"MessageCallback\":{\"CallbackType\":\"http\",\"CallbackURL\":\"http://example.aliyundoc.com\"},\"AccelerateConfig\":{\"Type\":\"oss\",\"Domain\":\"****Bucket.oss-accelerate.aliyuncs.com\"}}");
/* 視頻分類ID(可選) */
//request.setCateId(0);
/* 視頻標(biāo)簽,多個(gè)用逗號(hào)分隔(可選) */
//request.setTags("標(biāo)簽1,標(biāo)簽2");
/* 視頻描述(可選)*/
//request.setDescription("視頻描述");
/* 封面圖片(可選)*/
//request.setCoverURL("http://cover.example.com/image_01.jpg");
/* 模板組ID(可選)*/
//request.setTemplateGroupId("8c4792cbc8694e7084fd5330e56****");
/* 工作流ID(可選)*/
//request.setWorkflowId("d4430d07361f0*be1339577859b0****");
/* 存儲(chǔ)區(qū)域(可選)*/
//request.setStorageLocation("in-201703232118266-5sejd****.oss-cn-shanghai.aliyuncs.com");
/* 開啟默認(rèn)上傳進(jìn)度回調(diào) */
// request.setPrintProgress(true);
/* 設(shè)置自定義上傳進(jìn)度回調(diào)(必須繼承 VoDProgressListener) */
/*默認(rèn)關(guān)閉。如果開啟了這個(gè)功能,上傳過程中服務(wù)端會(huì)在日志中返回上傳詳情。如果不需要接收此消息,需關(guān)閉此功能*/
// request.setProgressListener(new PutObjectProgressListener());
/* 設(shè)置應(yīng)用ID*/
//request.setAppId("app-100****");
/* 點(diǎn)播服務(wù)接入點(diǎn) */
//request.setApiRegionId("cn-shanghai");
/* ECS部署區(qū)域*/
// request.setEcsRegionId("cn-shanghai");
/* 配置代理訪問(可選) */
//OSSConfig ossConfig = new OSSConfig();
/* <必填>設(shè)置代理服務(wù)器主機(jī)地址 */
//ossConfig.setProxyHost("<yourProxyHost>");
/* <必填>設(shè)置代理服務(wù)器端口 */
//ossConfig.setProxyPort(-1);
/* 設(shè)置連接OSS所使用的協(xié)議(HTTP或HTTPS),默認(rèn)為HTTP */
//ossConfig.setProtocol("HTTP");
/* 設(shè)置用戶代理,指HTTP的User-Agent頭,默認(rèn)為aliyun-sdk-java */
//ossConfig.setUserAgent("<yourUserAgent>");
/* 設(shè)置代理服務(wù)器驗(yàn)證的用戶名,https協(xié)議時(shí)需要填 */
//ossConfig.setProxyUsername("<yourProxyUserName>");
/* 設(shè)置代理服務(wù)器驗(yàn)證的密碼,https協(xié)議時(shí)需要填 */
//ossConfig.setProxyPassword("<yourProxyPassword>");
//request.setOssConfig(ossConfig);
UploadVideoImpl uploader = new UploadVideoImpl();
UploadStreamResponse response = uploader.uploadStream(request);
System.out.print("RequestId=" + response.getRequestId() + "\n"); //請(qǐng)求視頻點(diǎn)播服務(wù)的請(qǐng)求ID
if (response.isSuccess()) {
System.out.print("VideoId=" + response.getVideoId() + "\n");
} else { //如果設(shè)置回調(diào)URL無效,不影響視頻上傳,可以返回VideoId同時(shí)會(huì)返回錯(cuò)誤碼。其他情況上傳失敗時(shí),VideoId為空,此時(shí)需要根據(jù)返回錯(cuò)誤碼分析具體錯(cuò)誤原因
System.out.print("VideoId=" + response.getVideoId() + "\n");
System.out.print("ErrorCode=" + response.getCode() + "\n");
System.out.print("ErrorMessage=" + response.getMessage() + "\n");
}
}
}
URL批量拉取上傳
通過UploadMediaByURL接口,將媒體文件通過公網(wǎng)訪問的URL地址拉取并上傳到視頻點(diǎn)播的存儲(chǔ)地址。
示例Demo如下:
import com.aliyun.tea.*;
public class Sample {
/**
* <b>description</b> :
* <p>使用AK&SK初始化賬號(hào)Client</p>
* @return Client
*
* @throws Exception
*/
public static com.aliyun.vod20170321.Client createClient() throws Exception {
// 工程代碼泄露可能會(huì)導(dǎo)致 AccessKey 泄露,并威脅賬號(hào)下所有資源的安全性。以下代碼示例僅供參考。
// 建議使用更安全的 STS 方式,更多鑒權(quán)訪問方式請(qǐng)參見:http://bestwisewords.com/document_detail/378657.html。
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必填,請(qǐng)確保代碼運(yùn)行環(huán)境設(shè)置了環(huán)境變量 ALIBABA_CLOUD_ACCESS_KEY_ID。
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
// 必填,請(qǐng)確保代碼運(yùn)行環(huán)境設(shè)置了環(huán)境變量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// Endpoint 請(qǐng)參考 https://api.aliyun.com/product/vod
config.endpoint = "vod.cn-shanghai.aliyuncs.com";
return new com.aliyun.vod20170321.Client(config);
}
public static void main(String[] args_) throws Exception {
java.util.List<String> args = java.util.Arrays.asList(args_);
com.aliyun.vod20170321.Client client = Sample.createClient();
com.aliyun.vod20170321.models.UploadMediaByURLRequest uploadMediaByURLRequest = new com.aliyun.vod20170321.models.UploadMediaByURLRequest();
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 復(fù)制代碼運(yùn)行請(qǐng)自行打印 API 的返回值
client.uploadMediaByURLWithOptions(uploadMediaByURLRequest, runtime);
} catch (TeaException error) {
// 此處僅做打印展示,請(qǐng)謹(jǐn)慎對(duì)待異常處理,在工程項(xiàng)目中切勿直接忽略異常。
// 錯(cuò)誤 message
System.out.println(error.getMessage());
// 診斷地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 此處僅做打印展示,請(qǐng)謹(jǐn)慎對(duì)待異常處理,在工程項(xiàng)目中切勿直接忽略異常。
// 錯(cuò)誤 message
System.out.println(error.getMessage());
// 診斷地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
}
基于OSS原生SDK
當(dāng)上傳SDK無法滿足業(yè)務(wù)需求(如開發(fā)語言不匹配)時(shí),開發(fā)者可以結(jié)合點(diǎn)播服務(wù)端SDK(獲取上傳憑證及地址)和OSS原生SDK(Base64解碼獲取到的上傳憑證及地址,然后調(diào)用OSS接口)完成上傳。
基于OSS服務(wù)端API(不推薦)
開發(fā)者也可以直接調(diào)用點(diǎn)播服務(wù)端接口獲取上傳地址和憑證,再調(diào)用OSS原生API完成上傳??紤]到上傳效率和出錯(cuò)概率等因素,一般不推薦這種方式。
常見問題
為什么上傳文件一致處于上傳中?
請(qǐng)排查是否由以下原因造成:
原因一:URL批量拉取上傳為異步上傳,不保證時(shí)效性
如果您是通過UploadMediaByURL - URL批量拉取上傳接口上傳,URL批量拉取上傳是異步任務(wù),非實(shí)時(shí),不保證時(shí)效性,一般提交后會(huì)在數(shù)小時(shí)甚至數(shù)天內(nèi)完成遷移上傳。
原因二:只生成了上傳憑證,但沒有上傳文件
如果您是通過調(diào)用CreateUploadVideo - 獲取音視頻上傳地址和憑證接口上傳,此接口僅用于獲取上傳憑證和創(chuàng)建媒資基礎(chǔ)信息,并非上傳文件,后續(xù)您還需要調(diào)用OSS能力完成上傳,完整的上傳步驟,請(qǐng)參見通過視頻點(diǎn)播API上傳媒體文件。
原因三:上傳文件過大導(dǎo)致上傳時(shí)間較長(zhǎng)
請(qǐng)確認(rèn)上傳文件大小以及處于“上傳中”狀態(tài)的時(shí)間是否處于合理范圍。通過控制臺(tái)、上傳SDK和客戶端上傳工具等方式上傳文件時(shí),默認(rèn)會(huì)使用分片上傳,最大支持上傳48.8 TB的單個(gè)文件;上傳SDK同時(shí)也提供簡(jiǎn)單上傳功能,其最大支持上傳5 GB的單個(gè)文件。
原因四:網(wǎng)絡(luò)問題
請(qǐng)確認(rèn)您的網(wǎng)絡(luò)帶寬是否符合預(yù)期。
使用IOS上傳SDK上傳失敗并報(bào)錯(cuò)Error Domain=NSCocoaErrorDomain
上傳失敗并報(bào)錯(cuò)(錯(cuò)誤碼207,錯(cuò)誤信息Error Domain=NSCocoaErrorDomain),通常是由于讀取文件錯(cuò)誤,沒有權(quán)限導(dǎo)致。您可以通過以下方式解決:
方式一:授予iOS上傳SDK讀取本地資源的權(quán)限。
方式二:將本地資源存放到沙盒路徑下,再上傳。
使用URL批量拉取上傳時(shí)提示“The service is not open in current region”的錯(cuò)誤
提示
The service is not open in current region
表示當(dāng)前服務(wù)地域暫不支持使用URL批量拉取上傳方式進(jìn)行上傳,URL批量拉取上傳目前僅支持在華東2(上海)和新加坡地域使用。如果您非上述地域,建議您將音視頻文件下載到本地,然后再通過上傳SDK進(jìn)行上傳,詳情請(qǐng)參見上傳SDK概述。
微信中使用JS SDK上傳存在兼容性問題,無法正常上傳
經(jīng)過排查由于微信瀏覽器對(duì)于H5存在兼容性問題,需要將
<input type="file" name="file" id="files" multiple="">
中的multiple=""
參數(shù)去掉就可以正常上傳。推流SDK特定分辨率時(shí)出現(xiàn)預(yù)覽頁面拉伸現(xiàn)象
推流SDK在選擇推流分辨率為480p時(shí)預(yù)覽頁面出現(xiàn)拉伸的現(xiàn)象,但是實(shí)際推流是正常的。主要因?yàn)?80p對(duì)應(yīng)的分辨率為480×640,由于大多數(shù)手機(jī)屏幕均不支持該分辨率的比例導(dǎo)致出現(xiàn)拉伸的現(xiàn)象。
解決辦法:修改預(yù)覽頁面surfaceview的比例,請(qǐng)將activity_push.xml內(nèi)容修改如下即可。
Android Studio如何查看和導(dǎo)入aar包數(shù)據(jù)
查看aar包數(shù)據(jù):將
.aar
文件后綴改成.zip
并解壓,查看.class
、.xml
、.jar
、圖片、文本等各種內(nèi)容。導(dǎo)入aar包數(shù)據(jù):拷貝
.aar
文件到工程項(xiàng)目下,路徑一般為projectName/libs/,重新載入工程。在build.gradle根標(biāo)簽下添加本地倉庫路徑,并在dependencies中添加編譯依賴。其中l(wèi)ibs目錄按照實(shí)際工程下的包引入文件夾名稱而定。在compile參數(shù)中,name的值為aar文件的名字,ext為文件的擴(kuò)展名。
選擇 build > rebuild,重新構(gòu)建project。構(gòu)建完成之后,在工程的External Libraries中即可看到引入的aar包。