短视频(User Generated Short Video,UGSV)基于腾讯云强大的上传、存储、转码、分发的云点播能力,提供集成了采集、剪辑、拼接、特效、分享、播放等功能的客户端 SDK,并整合腾讯的 IM、社交、用户画像数据以及 AI 人脸识别和图像检测技术,帮助用户聚焦业务本身,快速轻松实现基于移动端的短视频应用。
快速开始:https://cloud.tencent.com/document/product/584/9457
Licence申请:https://cloud.tencent.com/document/product/584/20333
官方Demo体验:https://cloud.tencent.com/document/product/584/9365
官方Demo及SDK下载:https://cloud.tencent.com/document/product/584/9366
版本历史:https://cloud.tencent.com/document/product/584/39644
正式版的不能修改!试用版的可以修改。试用版的 Licence 在有效期内修改只会更新相关信息,不会更新过期时间,所以不会占用试用次数。
以下是在SDK Demo调用getLicenceInfo
接口示例:
{
"appData" : [
{
"type" : "formal",
"feature" : 1,
"packageName" : "com.content.liteav.demo",
"startDate" : "2018-07-06T00:00:00Z",
"bundleId" : "com.tencent.liteav.demo",
"endDate" : "2019-07-30T00:00:00Z"
}
],
"pituLicense" : "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”
}
参数说明:
type | formal:正式版test:测试版 |
---|---|
feature | 0:测试版(旧)1:正式版(旧)2:精简版3:基础版4:商业版5:商业版Pro |
packageNamebundleId | 应用程序的包名 |
startDateendDate | 有效期起始日期与截止日期 |
SDK 用到了一些类别的方法,加载类别方法需要在工程配置:Build Settings
-> Linking
-> Other Linker Flags
添加 -ObjC
。
Build Settings
-> Linking
-> Other Linker Flags
设置,不能有 -all_load
。从 4.5 版本开始短视频功能需要 Licence 才可以正常调用接口,调用startRecord接口返回值:
状态码 | 说明 |
---|---|
0 | 成功 |
-1 | 正在录制短视频 |
-2 | videoRecorder初始化失败 |
-3 | 摄像头没有打开 |
-4 | 麦克风没有打开 |
-5 | licence 验证失败 |
-6 | videoPath 无效 |
-7 | coverPath 无效 |
报错信息为errcode=-5 licence 验证失败?
1).可以通过 getLicenceInfo
接口查询licence信息,如出现licence为空,4.9以上版本排查licencen是否
初始化,如:TXUGCBase.getInstance().setLicence(context,url,key),4.5-4.8的建议升级到最新版本;
2).licence信息不为空时,检查获取的licence的信息bundleid/packageName是否和工程一致,licence是否
还在有效期之内,feature对应的licence是否跟sdk版本一致?
3).调用stopRecord接口返回-5,获取licence信息正常。
onRecordComplete(TXRecordResult result)
,result中的retCode是回调错误码-5,首先检查传入的视频路径是否正确,其次看下app是不是禁用了SD卡的权限。1). 确定传的 BGM path 下有没有文件,以及是否可以正常播放。
2). 确定接口的调用顺序:startCameraSimple:preview:
-> setBGM:
-> startRecord
。
注意 很多接口调用有时序要求,不然会无效。一般在注释上会有说明。 比如短视频录制的
setVideoResolution:
、setVideoBitrate:
、setAspectRatio:
等接口都需要在startRecord
之前设置才有效。
endTime
时没有完成回调如果设置的 endTime
小于音乐文件总时长,4.6 及之前的版本是在 BGM 播放完后才会触发完成回调,从 4.7 版本开始在 endTime
时触发完成回调。
苹果手机摄像头第一次打开时(冷启动)耗时相对较长,通过系统接口打开摄像头也是如此。
因为摄像头打开的操作不适合放在子线程去做,经过测试在子线程中进行打开摄像头操作耗时会更大,并且在主线程连续打开/关闭摄像头的时候,子线程的响应延迟会更高,体验不好。
在第一次录制完成的时候,不要调用 stopRecord
和 stopCameraPreview
(调用之后不能再继续录制,只能重新录制),可以调用pauseRecord
,然后通过 TXUGCPartsManager.getVideoPathList
获取已经录取的视频片段,通过 TXVideoJoiner.joinVideo
合成最终视频(4.5之前版本),还可以直接调用 TXUGCPartsManager.joinAllParts
合成最终视频,这个方法合成速度更快(4.5 以后版本支持),这样当返回继续录制的时候,所有的录制状态都在,可以继续录制。
iOS 中的 AudioSession 是所有音视频应用共用的,使用其他播放器播放的时候,AudioSession 会被占用,播放结束时如果 AudioSession 没有让出或者让出不及时,会导致录制模块的 AudioSession 失效,SDK 提供了 -(void) pauseAudioSession
和 -(void) resumeAudioSession
两个接口,在去其他播放器预览的时候先调用 pauseAudioSession
,返回继续录制前调用 resumeAudioSession
。
码率和分辨率不匹配,录制出来的视频就会不清晰。可以通过适当增大码率、开启B帧来提升画质。
回音消除接口关掉就不会有这个问题:
TXUGCCustomConfig * param = TXUGCCustomConfig alloc init;
param.enableAEC = NO;
回音消除接口关掉就不会有这个问题:
TXUGCCustomConfig * param = TXUGCCustomConfig alloc init;
param.enableAEC = NO;
短视频录制可定制参数包括 fps (每秒钟有多少帧画面),GOP(多少秒编出一个关键I帧)大小,视频码率(每秒钟编码器产生的音视频数据的多少),录制最大/最小时长,录制的分辨率以常量方式提供了三种分辨率可供选择:360x640、540x960、720x1280
录制为什么以常量方式而不是用户自定义大小原因有二:一是以上三种是主流的录制分辨率;二是因为 Android 手机兼容问题,不支持一些非主流的分辨率,以免产生一些花屏、绿屏、马赛克的问题。
通过调用 TXUGCRecord
类的 startCameraCustomPreview
接口,将自定义录制的参数传入,代码如下所示:
// 自定义配置
TXRecordCommon.TXUGCCustomConfig customConfig = new TXRecordCommon.TXUGCCustomConfig();
customConfig.videoResolution = TXRecordCommon.VIDEO_RESOLUTION_540_960;
customConfig.minDuration = mMinDuration; // 最小时长
customConfig.maxDuration = mMaxDuration; // 最大时长
customConfig.videoBitrate = mBiteRate; // 视频码率
customConfig.videoGop = mGop; // GOP大小
customConfig.videoFps = mFps; // FPS
customConfig.isFront = mFront; // 是否前置摄像头
mTXCameraRecord.startCameraCustomPreview(customConfig, mVideoView);
TXVideoEditer.generateVideo的回调onGenerateProgress进行到大概99.9%会停止,合成后的moov头移动耗时,手机性能越低、视频越长,会耗时越久,建议在ui上做一些动画处理。
供参考:
手机:魅族pro6S; 视频:15S、720P; 测试时长在600ms
开始录制短视频前,请先通过调用 TXUGCRecord
类的 setVideoRecordListener()
接口设置录制回调的监听器。
结束时,需要调用 TXUGCRecord
类的 stopRecord()
接口结束录制。
// 录制前
mTXCameraRecord = TXUGCRecord.getInstance(this.getApplicationContext());
mTXCameraRecord.setVideoRecordListener(this);
...
// 结束录制
mTXCameraRecord.stopRecord();
Demo 在 onRecordComplete
回调之后,调用了 mTXCameraRecord.getPartsManager().deleteAllParts()
,用于清除分片文件,因为
stopRecord
已经将分片文件合成完成。
如果录制退出,继续上次录制,不需要删除分片,不要调用 mTXCameraRecord.getPartsManager().deleteAllParts()
。
@Override
public void onRecordComplete(TXRecordCommon.TXRecordResult result) {
TXCLog.i(TAG, "onRecordComplete, result retCode = " + result.retCode + ", descMsg = " + result.descMsg + ", videoPath + " + result.videoPath + ", coverPath = " + result.coverPath);
if (mTXRecordResult.retCode < 0) {
Toast.makeText(TCVideoRecordActivity.this.getApplicationContext(), "录制失败,原因:" + mTXRecordResult.descMsg, Toast.LENGTH_SHORT).show();
} else {
mDuration = mTXCameraRecord.getPartsManager().getDuration(); //录制的总时长
if (mTXCameraRecord != null) {
mTXCameraRecord.getPartsManager().deleteAllParts(); //删除多次录制的分片文件
}
startPreview(); //进去预览界面
}
设置背景音乐一定要在启动录制 TXUGCRecord的startRecord
接口之前设置才能生效。代码调用顺序参照下面示例:
TXRecordCommon.TXUGCSimpleConfig simpleConfig = new TXRecordCommon.TXUGCSimpleConfig();
simpleConfig.videoQuality = TXRecordCommon.VIDEO_QUALITY_MEDIUM;
simpleConfig.minDuration = mMinDuration;
simpleConfig.maxDuration = mMaxDuration;
// 1、首先开启预览
mTXCameraRecord.startCameraSimplePreview(simpleConfig, mVideoView);
// 2、再设置背景音乐的路径并播放背景音乐
mBGMDuration = mTXCameraRecord.setBGM(mBGMPath);
mTXCameraRecord.playBGMFromTime(0, mBGMDuration);
// 3、启动录制(customVideoPath:录制后视频路径,customPartFolder:录制视频的文件夹,customCoverPath:录制后视频的封面路径)
int result = mTXCameraRecord.startRecord(customVideoPath, customPartFolder, customCoverPath);
短视频 SDK 有拍照功能,调用 TXUGCRecord
类的 snapshot
接口,以 TXRecordCommon.ITXSnapshotListener
回调异步返回拍照的图片,代码示例如下:
private void snapshot() {
if (mTXCameraRecord != null) {
mTXCameraRecord.snapshot(new TXRecordCommon.ITXSnapshotListener() {
@Override
public void onSnapshot(Bitmap bmp) {
// 拍照的图片
saveBitmap(bmp);
}
});
}
}
变速录制不支持自定义速度。
定义 | TXRecordCommon中对应常量 | 倍数 |
---|---|---|
极慢速 | RECORD_SPEED_SLOWEST | 0.5倍 |
慢速 | RECORD_SPEED_SLOW | 0.8倍 |
标准 | RECORD_SPEED_NORMAL | 1倍 |
快速 | RECORD_SPEED_FAST | 1.25倍 |
极快速 | RECORD_SPEED_FASTEST | 1.5倍 |
变速录制通过调用 TXUGCRecord的setRecordSpeed(record)
,设置不同的录制速度
mTXCameraRecord.setRecordSpeed(TXRecordCommon.RECORD_SPEED_FAST);
目前短视频录制不支持同时录制 BGM 和人声,所以进入编辑后,重新设置 BGM,可以将原声音量设为 0,达到替换 BGM 的目的,代码如下所示:
// 设置视频原声音量大小(设为0,去掉录制的BGM)
mTXVideoEditer.setVideoVolume(0.0f);
// 设置本地的背景音乐路径
String bgmPath = getBGMPath();
mTXVideoEditer.setBGM(bgmPath);
// 设置背景音乐音量大小,范围0.0f-1.0f
mTXVideoEditer.setBGMVolume(1.0f);
动态修改传入 SDK 视频预览 View 父布局的大小,SDK 内部会根据父布局的大小,根据视频宽高动态调整视频的大小。
SDK接口的调用顺序:
先进行 stopPlay
,在修改传入 SDK 的 FrameLayout 的宽高,调用 initWithPreview(parm)
,将新的 FrameLayout 承载播放组建的
layout 传入,再次 startPlay
。
// 停止播放
mTXVideoEditer.stopPlay();
if (isFullScreen) {
// 如果是全屏模式,则下面切换成窗口模式
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1500);
mVideoPlayerLayout.setLayoutParams(params);
initPlayerLayout(false);
isFullScreen = false;
} else {
// 如果是窗口模式,则下面切换成全屏模式
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
mVideoPlayerLayout.setLayoutParams(params);
initPlayerLayout(false);
isFullScreen = true;
}
// 开始播放
mTXVideoEditer.startPlayFromTime(startTime, endTime);
// 重新设置预览View
private void initPlayerLayout(boolean isFullScreen) {
TXVideoEditConstants.TXPreviewParam param = new TXVideoEditConstants.TXPreviewParam();
param.videoView = mVideoPlayerLayout;
if (isFullScreen) {
param.renderMode = TXVideoEditConstants.PREVIEW_RENDER_MODE_FILL_SCREEN;
} else {
param.renderMode = TXVideoEditConstants.PREVIEW_RENDER_MODE_FILL_EDGE;
}
mTXVideoEditer.initWithPreview(param);
}
市面上大部分带有短视频功能的 App ,场景一般是录制短视频,接着跳转到编辑界面。经过这一系列的操作,视频文件会变得很小。因为我们为了保证编辑出来的视频画面的清晰度, 我们没有把录制出来视频文件进行压缩处理。因压缩文件会损失视频的画质。
如果您的场景是直接录制短视频文件,你可以按照以下步骤对录制生成的视频文件进行压缩处理接口。
1).将录制的 Config 中的 needEdit
属性 设置为 False
// 使用推荐配置
TXRecordCommon.TXUGCSimpleConfig simpleConfig = new TXRecordCommon.TXUGCSimpleConfig();
simpleConfig.needEdit = False;
mTXCameraRecord.startCameraSimplePreview(simpleConfig, mVideoView);
// 使用自定义配置
TXRecordCommon.TXUGCCustomConfig customConfig = new TXRecordCommon.TXUGCCustomConfig();
customConfig.needEdit = mNeedEditer;
mTXCameraRecord.startCameraCustomPreview(customConfig, mVideoView);
2)、在视频录制完成回调onRecordComplete()
中,调用视频压缩方法。
@Override
public void onRecordComplete(TXRecordCommon.TXRecordResult result) {
Log.i(TAG, "onRecordComplete, result retCode = " + result.retCode + ", descMsg = " + result.descMsg + ", videoPath + " + result.videoPath + ", coverPath = " + result.coverPath);
// 执行其他操作
// ...
// 先实例化一个 TXVideoEditer 对象,然后再调用 generateVideo() 函数压缩视频
mTXVideoEditer.generateVideo(TXVideoEditConstants.VIDEO_COMPRESSED_720P, mVideoOutputPath);
}
1). 调节分辨率,清晰度从低到高可以选择标清(360P)、高清(540P)、超清(720P)。
2). 调节视频码率(每秒钟编码器产生的音视频数据的多少),建议范围600-12000kbps,默认是6500kbps,没有设置上限。这里码率设置的高,则视频更清晰,但是相应的文件变得更大,码率设置的过小,文件变得小,同样视频清晰度会降低,超过建议给定的范围,可能会出现马赛克。
3). 调节视频帧率FPS(每秒钟有多少帧画面),建议范围15-30,默认20,视频码率一样,FPS越小,视频越清晰。
// 自定义配置
TXRecordCommon.TXUGCCustomConfig customConfig = new TXRecordCommon.TXUGCCustomConfig();
customConfig.videoResolution = TXRecordCommon.VIDEO_RESOLUTION_540_960;
customConfig.videoBitrate = mBiteRate; // 视频码率
customConfig.videoFps = mFps; // FPS
mTXCameraRecord.startCameraCustomPreview(customConfig, mVideoView);
生成视频默认采用的是硬编码(编码效率高,编码出来的图像效果好),硬编码器在程序进后台后会停止工作,从而导致视频生成失败。SDK 提供了两个接口 pauseGenerate
和 resumeGenerate
,APP 进后台时可以调用 pauseGenerate
暂停视频生成,APP 回到前台后再调用 resumeGenerate
继续视频生成。
注意 调用
resumeGenerate
,SDK 将重启硬编码器,有一定的概率重启失败,或重启后前几帧数据编码失败。此时,SDK 内部会在TXVideoGenerateListener
抛出错误事件,收到错误事件后需要重新生成视频。
导入视频目前android端仅支持mp4,分辨率没有做限制,导入文件不限制大小。
TXVideoEditer.h里面有类似接口setBGMLoop,TXUGCRecord.h还没有,计划5.3版本加上。
目前由于短视频录制和短视频编辑使用的音频模式不一样会导致这个问题,计划5.3版本优化。
Android:
定义 | TXVideoEditConstants中对应常量 | 倍数 |
---|---|---|
极慢速 | SPEED_LEVEL_SLOWEST | 0.25倍 |
慢速 | SPEED_LEVEL_SLOW | 0.5倍 |
标准 | SPEED_LEVEL_NORMAL | 1.0倍 |
快速 | SPEED_LEVEL_FAST | 2.0倍 |
极快速 | SPEED_LEVEL_FASTEST | 4.0倍 |
iOS:
定义 | TXSpeedLevel中对应常量 | 倍数 |
---|---|---|
极慢速 | SPEED_LEVEL_SLOWEST | 0.5倍 |
慢速 | SPEED_LEVEL_SLOW | 0.75倍 |
标准 | SPEED_LEVEL_NORMAL | 1.0倍 |
快速 | SPEED_LEVEL_FAST | 1.5倍 |
极快速 | SPEED_LEVEL_FASTEST | 2.0倍 |
注意 由于安卓和ios的系统原因,倍数值只能取某些固定的值,ios与安卓不对齐也并不太影响用户体验,现在各大主流短视频app都没有做对齐,如果客户有强需求做对齐,请联系我们。
目前仅支持 mp3 和 m4a 类型。
短视频编辑可定制视频码率(SDK 4.5 及以上)、音频码率(SDK 4.7 及以上)、分辨率以常量方式提供了四种分辨率可供选择:360x640、480x640、540x960、720x1280
分辨率 | TXVideoEditConstants中对应常量 |
---|---|
360x640 | VIDEO_COMPRESSED_360P |
480x640 | VIDEO_COMPRESSED_480P |
540x960 | VIDEO_COMPRESSED_540P |
720x1280 | VIDEO_COMPRESSED_720P |
//设置输出视频码率
mTXVideoEditer.setVideoBitrate(3600);
//设置输出分辨率
mTXVideoEditer.generateVideo(TXVideoEditConstants.VIDEO_COMPRESSED_720P, mVideoOutputPath);
可以先进行裁剪(setCutTimeFrom
)+预处理(processVideo
)同时执行,结果生成一个裁剪后的视频预处理完的视频,再进行各种编辑的操作,将裁剪设置成整个时长(setCutTimeFrom
),最后调用 generateVideo
生成视频,防止压缩两次导致画质降低。
注意 在预处理进行裁剪了,生成完的预处理视频,在最后生成前,一定要将裁剪时长设置为整个视频时长,不然还会再次进行裁剪。
//裁剪页面
mTXVideoEditer = new TXVideoEditer(mContext);
mTXVideoEditer.setCutFromTime(mTCVideoEditView.getSegmentFrom(), mTCVideoEditView.getSegmentTo());
mTXVideoEditer.processVideo();
// 将裁剪设置成整个时长(setCutTimeFrom)
mTXVideoEditer.setCutFromTime(0, mVideoDuration);
//跳转到特效页面,进行生成
mTXVideoEditer.generateVideo(TXVideoEditConstants.VIDEO_COMPRESSED_720P, mVideoOutputPath);
参考demo中的getPasterInfoList方法,读取的贴纸文件是从sdcard中读取的,所以只要把拓展包拷贝到指定目录下即可。拷贝进来的json字符串要遵循文档中描述的格式。
总pasterList.json的格式如下
{
"pasterList" : [
{
"icon" : "daddy/icon.png",
"name" : "daddy"
},
{
"icon" : "face/icon.png",
"name" : "face"
},
{
"icon" : "girl/icon.png",
"name" : "girl"
},
{
"icon" : "glass/icon.png",
"name" : "glass"
}
]
}
单个动态贴纸包的config.json的格式如下
{
"name":"glass", // 贴纸名称
"count":6, // 贴纸数量
"period":480, // 播放周期:播放一次动态贴纸的所需要的时间(ms)
"width":444, // 贴纸宽度
"height":256, // 贴纸高度
"keyframe":6, // 关键图片:能够代表该动态贴纸的一张图片
"frameArray": [ // 所有图片的集合
{"picture":"glass0"},
{"picture":"glass1"},
{"picture":"glass2"},
{"picture":"glass3"},
{"picture":"glass4"},
{"picture":"glass5"}
]
}
更多的短视频编辑功能的介绍以及用法,可以阅读视频编辑(Android)
1). 调节生成文件的分辨率,清晰度从低到高可以选择360P、480P、540P、720P。
2). 调节生成文件的视频码率,建议设置范围为:600~3600,如果设置了码率,SDK生成视频会优先使用这个码率,注意码率不要太大或则太小,码率太小视频会模糊不清,码率太大,生成视频体积会很大。如果不自定义视频码率,SDK内部会根据设置文件的分辨率,自动计算视频码率
//设置输出视频码率
mTXVideoEditer.setVideoBitrate(3600);
//设置输出分辨率
mTXVideoEditer.generateVideo(TXVideoEditConstants.VIDEO_COMPRESSED_720P, mVideoOutputPath);
1)、查看编辑前和编辑后视频文件大小是否差距过大?
generateVideo(int videoCompressed, String videoOutputPath)
,参数videoCompressed
选择360p,而视频本身是720p或720p+的视频,排查视频因压缩过大导致问题2)、查看编辑前和编辑后视频码率是否存在过大差异?
setVideoBitrate
根据自己的需求设置需要的码率值;1)、作用:预处理的过程是将原视频解码后进行色彩处理
2)、时长:视频时长与帧率大小都会影响需要预处理数据,视频本身的gop差异也会存在一定的影响;
3)、使用:编辑使用时间特效(加速、慢速、倒放、重复)、滤镜特效、单帧预览、精确缩略图都需要做预处理。
1). 使用getSampleImage获取图片不精确,使用getSampleImages返回多张图片效果一样?
2). 使用预处理之后getSampleImage、getSampleImages效果跟原来一样?
3). 使用getSampleImages获取多张缩略图,回调被系统回收,获取的图片数量不对应?
目前还不支持。虽然 TXVideoEditer 能多次被实例化, 但是内部很多配置项是用的单例的。所以多次实例化 TXVideoEditer, 后面实例化的 TXVideoEditer 会使用到之前的 TXVideoEditer 的编辑配置。
如第一次编辑短视频,使用 TXVideoEditer 增加背景音乐,然后没有调用 TXVideoEditer.release();
重新实例化 TXVideoEditer 对象,编辑新的短视频还是会播放背景音乐。
支持多个视频按顺序前后拼接,以及多个视频按照自定义布局分屏合成。
原因是小视频Demo业务层代码逻辑问题,获取BGM音乐总时长为0,导致无法播放,所以设置了BGM没有声音。
1)、在SDK版本5.2及之前可以使用以下方式获取音乐时长:
_BGMDuration = TXVideoInfoReader getVideoInfoWithAsset:(AVAsset *)_BGMPath.duration;
2)、在SDK版本5.3版本及以后的版本建议使用系统接口获取音乐时长,因为SDK接口getVideoInfoWithAsset是给视频使用的,如果调用这个接口传音乐路径获取的音乐时长会为0,可以参考以下系统接口代码:
AVURLAsset\*audioAsset = AVURLAsset URLAssetWithURL:audioFileURL options:nil;
CMTime audioDuration = audioAsset.duration;
float audioDurationSeconds = CMTimeGetSeconds(audioDuration);
iOS参考:https://cloud.tencent.com/document/product/584/20331
Android参考:https://cloud.tencent.com/document/product/584/20332
从 4.5 版本开始,TXUGCPublish
相关的类从 SDK 上移到了 Demo 层,开发者如果需要使用,使用时直接把 VideoUpload
目录整个拖入自己的工程即可。
TXUGCPublish
找不到?视频上传模块从 SDK 中独立出来,并开源到 Demo 中,需要客户去集成短视频上传。
1). 下载Demo
2). 将短视频上传jar(在Demo\app\libs目录下)拷贝到 您的项目\app\src\main\libs 目录下
3). 将短视频上传源代码目录(在 Demo\app\src\main\java\com\tencent\liteav\demo\videoupload 目录下)拷贝到您自己的工程目录下,并修改源代码里面的package名称。
4). 在工程 App 目录下的 build.gradle 中,添加引用 jar 包的代码。
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
在 AndroidManifest.xml 中配置 App 的权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.Camera"/>
<uses-feature android:name="android.hardware.camera.autofocus" />
请检查是否已开启点播服务或者是否负费;
请检查视频文件地址和图片地址是否正确,该路径下是否能找到相应文件。
客户端在发起上传前,需要向 App 服务器请求上传签名,如果 App 服务器允许客户端上传,则应按照签名规则为客户端生成一个上传签名。客户端执行上传操作时,必须携带该签名,让腾讯云点播验证客户端的上传是否被授权。
客户端上传签名的生成包括以下三步,详情参见文档:
1). 获取 API 密钥;
2). 拼接明文串;
3). 将明文串转为最终签名。
4). 服务搭建完毕之后,开发者可以通过腾讯云点播提供的工具来校验签名的正确性:
5). 签名生成工具:根据参数和密钥,快速生成签名;
6). 签名校验工具:对签名进行解析,得到生成签名时所使用的各项参数。
文件上传状态码:
1). 确定上传的文件是否在本地沙盒,如果上传媒体库的文件,需要先 copy 到本地沙盒。
2). 返回错误码1002:签名有问题、时间戳过期、点播服务问题(未开通或停服)。
3). 返回错误码1003:请求参数问题、上传文件格式不支持。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。