短视频(User Generated Short Video,UGSV)基于腾讯云强大的上传、存储、转码、分发的云点播能力,提供集成了采集、剪辑、拼接、特效、分享、播放等功能的客户端 SDK,并整合腾讯的 IM、社交、用户画像数据以及 AI 人脸识别和图像检测技术,帮助用户聚焦业务本身,快速轻松实现基于移动端的短视频应用。
一、集成SDK
1. 如何快速开始集成?
快速开始: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
2. 申请短视频 Licence 后是否还能修改信息?
正式版的不能修改!试用版的可以修改。试用版的 Licence 在有效期内修改只会更新相关信息,不会更新过期时间,所以不会占用试用次数。
3. 调用TXUGCBase的getLicenceInfo接口可以获取哪些信息?
以下是在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 | 有效期起始日期与截止日期 |
4. iOS集成 SDK 运行工程时报 undefined symbols 错误或者 crash?
SDK 用到了一些类别的方法,加载类别方法需要在工程配置:Build Settings
-> Linking
-> Other Linker Flags
添加 -ObjC
。
5. iOS集成 SDK 报 duplicate symbol(符号重复)冲突错误?
- 检查
Build Settings
->Linking
->Other Linker Flags
设置,不能有-all_load
。 - 更换 rename 版 SDK。
二、短视频录制
1. 关于短视频录制报错 -5 的问题
从 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信息正常。
- 在调用stopReocrd的时候,会有个回调
onRecordComplete(TXRecordResult result)
,result中的retCode是回调错误码-5,首先检查传入的视频路径是否正确,其次看下app是不是禁用了SD卡的权限。 - 直播专业版对应短视频基础版sdk,licence版本需要与sdk版本一致,精简版license只适用于短视频精简版SDK。
2. 录制短视频时设置背景音乐无效
1). 确定传的 BGM path 下有没有文件,以及是否可以正常播放。
2). 确定接口的调用顺序:startCameraSimple:preview:
-> setBGM:
-> startRecord
。
注意 很多接口调用有时序要求,不然会无效。一般在注释上会有说明。 比如短视频录制的
setVideoResolution:
、setVideoBitrate:
、setAspectRatio:
等接口都需要在startRecord
之前设置才有效。
3. 录制设置 BGM,endTime
时没有完成回调
如果设置的 endTime
小于音乐文件总时长,4.6 及之前的版本是在 BGM 播放完后才会触发完成回调,从 4.7 版本开始在 endTime
时触发完成回调。
4. 为什么录制时第一次打开摄像头比较慢?
苹果手机摄像头第一次打开时(冷启动)耗时相对较长,通过系统接口打开摄像头也是如此。
因为摄像头打开的操作不适合放在子线程去做,经过测试在子线程中进行打开摄像头操作耗时会更大,并且在主线程连续打开/关闭摄像头的时候,子线程的响应延迟会更高,体验不好。
5. 返回继续录制怎么实现?
在第一次录制完成的时候,不要调用 stopRecord
和 stopCameraPreview
(调用之后不能再继续录制,只能重新录制),可以调用pauseRecord
,然后通过 TXUGCPartsManager.getVideoPathList
获取已经录取的视频片段,通过 TXVideoJoiner.joinVideo
合成最终视频(4.5之前版本),还可以直接调用 TXUGCPartsManager.joinAllParts
合成最终视频,这个方法合成速度更快(4.5 以后版本支持),这样当返回继续录制的时候,所有的录制状态都在,可以继续录制。
6. 短视频录制完成时收不到完成回调
- 确定有没有调用 stopRecord,只有调用 stopRecord 后才会有完成回调。
- 确定函数的调用是否都在主线程。
7. iOS录制过程中用其他播放器播放视频,返回继续录制,声音录制不了
iOS 中的 AudioSession 是所有音视频应用共用的,使用其他播放器播放的时候,AudioSession 会被占用,播放结束时如果 AudioSession 没有让出或者让出不及时,会导致录制模块的 AudioSession 失效,SDK 提供了 -(void) pauseAudioSession
和 -(void) resumeAudioSession
两个接口,在去其他播放器预览的时候先调用 pauseAudioSession
,返回继续录制前调用 resumeAudioSession
。
8. 为什么录制出来的视频不清晰?
码率和分辨率不匹配,录制出来的视频就会不清晰。可以通过适当增大码率、开启B帧来提升画质。
9. iOS端短视频录制完成生成的预览视频没有把动效背景音录制进去?
回音消除接口关掉就不会有这个问题:
TXUGCCustomConfig * param = TXUGCCustomConfig alloc init;
param.enableAEC = NO;
10. iOS端短视频录制先调用pauseAudioSession然后又调用了resumeAudioSession,特效的背景音明显变大声?
回音消除接口关掉就不会有这个问题:
TXUGCCustomConfig * param = TXUGCCustomConfig alloc init;
param.enableAEC = NO;
11. 目前短视频录制生成的分辨率支持自定义吗?有哪些可定制化的输出?
短视频录制可定制参数包括 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);
12. 安卓短视频生成,进度回调的99.9%与完成回调之间有较大的时间间隔?
TXVideoEditer.generateVideo的回调onGenerateProgress进行到大概99.9%会停止,合成后的moov头移动耗时,手机性能越低、视频越长,会耗时越久,建议在ui上做一些动画处理。
供参考:
手机:魅族pro6S; 视频:15S、720P; 测试时长在600ms
13. Android短视频录制结束,为什么没有收到onRecordComplete回调?
开始录制短视频前,请先通过调用 TXUGCRecord
类的 setVideoRecordListener()
接口设置录制回调的监听器。
结束时,需要调用 TXUGCRecord
类的 stopRecord()
接口结束录制。
// 录制前
mTXCameraRecord = TXUGCRecord.getInstance(this.getApplicationContext());
mTXCameraRecord.setVideoRecordListener(this);
...
// 结束录制
mTXCameraRecord.stopRecord();
14. 短视频退出录制,开启第二次录制,如何继续接着上一次内容录制?
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(); //进去预览界面
}
15. 为什么短视频录制设置背景音没有生效?
设置背景音乐一定要在启动录制 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);
16. 录制是否有拍照功能?
短视频 SDK 有拍照功能,调用 TXUGCRecord
类的 snapshot
接口,以 TXRecordCommon.ITXSnapshotListener
回调异步返回拍照的图片,代码示例如下:
private void snapshot() {
if (mTXCameraRecord != null) {
mTXCameraRecord.snapshot(new TXRecordCommon.ITXSnapshotListener() {
@Override
public void onSnapshot(Bitmap bmp) {
// 拍照的图片
saveBitmap(bmp);
}
});
}
}
17. 变速录制速度的倍数是多少?
变速录制不支持自定义速度。
定义 | 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);
18. 通过短视频录制功能录制的视频,其中的音频是可以剥离出来的吗?
目前短视频录制不支持同时录制 BGM 和人声,所以进入编辑后,重新设置 BGM,可以将原声音量设为 0,达到替换 BGM 的目的,代码如下所示:
代码语言:txt复制// 设置视频原声音量大小(设为0,去掉录制的BGM)
mTXVideoEditer.setVideoVolume(0.0f);
// 设置本地的背景音乐路径
String bgmPath = getBGMPath();
mTXVideoEditer.setBGM(bgmPath);
// 设置背景音乐音量大小,范围0.0f-1.0f
mTXVideoEditer.setBGMVolume(1.0f);
19. 预览画面在同一个Activity窗口和全屏模式如何切换?
动态修改传入 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);
}
20. 使用短视频录制功能,录制出来的视频文件大小很大?
市面上大部分带有短视频功能的 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);
}
21. 短视频录制效果问题?
1). 调节分辨率,清晰度从低到高可以选择标清(360P)、高清(540P)、超清(720P)。
2). 调节视频码率(每秒钟编码器产生的音视频数据的多少),建议范围600-12000kbps,默认是6500kbps,没有设置上限。这里码率设置的高,则视频更清晰,但是相应的文件变得更大,码率设置的过小,文件变得小,同样视频清晰度会降低,超过建议给定的范围,可能会出现马赛克。
3). 调节视频帧率FPS(每秒钟有多少帧画面),建议范围15-30,默认20,视频码率一样,FPS越小,视频越清晰。
代码语言:txt复制// 自定义配置
TXRecordCommon.TXUGCCustomConfig customConfig = new TXRecordCommon.TXUGCCustomConfig();
customConfig.videoResolution = TXRecordCommon.VIDEO_RESOLUTION_540_960;
customConfig.videoBitrate = mBiteRate; // 视频码率
customConfig.videoFps = mFps; // FPS
mTXCameraRecord.startCameraCustomPreview(customConfig, mVideoView);
三、短视频编辑
1. 视频编辑时退后台再回到前台,视频生成失败
生成视频默认采用的是硬编码(编码效率高,编码出来的图像效果好),硬编码器在程序进后台后会停止工作,从而导致视频生成失败。SDK 提供了两个接口 pauseGenerate
和 resumeGenerate
,APP 进后台时可以调用 pauseGenerate
暂停视频生成,APP 回到前台后再调用 resumeGenerate
继续视频生成。
注意 调用
resumeGenerate
,SDK 将重启硬编码器,有一定的概率重启失败,或重启后前几帧数据编码失败。此时,SDK 内部会在TXVideoGenerateListener
抛出错误事件,收到错误事件后需要重新生成视频。
2. 导入视频的格式要求?是否支持导入分辨率大于720P(例如2K,4K)的视频?导入文件限制有具体大小吗?
导入视频目前android端仅支持mp4,分辨率没有做限制,导入文件不限制大小。
- 导入视频的分辨率没有做限制,不管原视频多大,经过预处理后最大是 720P。
- 为了快速的导入视频,SDK 4.7 版本后可以不经过预处理(部分功能会受到限制,如倒放,单针预览等),对于分辨率大于 720P 的视频,建议需要加上预处理,因为预览是将每一帧解码,一些手机的性能不好,解码一帧并渲染到界面的时间过长,导致卡顿。
3. TXUGCRecord.h短视频录制里面有设置背景音乐循环播放的接口吗?
TXVideoEditer.h里面有类似接口setBGMLoop,TXUGCRecord.h还没有,计划5.3版本加上。
4. iOS端短视频录制和短视频编辑添加同一首BGM,声音大小不一样?
目前由于短视频录制和短视频编辑使用的音频模式不一样会导致这个问题,计划5.3版本优化。
5. 短视频编辑时,设置快速/慢速播放的倍数值各是多少?
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都没有做对齐,如果客户有强需求做对齐,请联系我们。
6. 目前短视频编辑支持哪种格式的背景音乐?
目前仅支持 mp3 和 m4a 类型。
7. 目前短视频编辑有哪些可定制化的输出?
短视频编辑可定制视频码率(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);
8. 短视频编辑时,腾讯云短视频 Demo 是把“剪辑”和“滤镜”等等功能放在一个页面处理,能否把“剪辑”和“滤镜”分成两个页面?
可以先进行裁剪(setCutTimeFrom
) 预处理(processVideo
)同时执行,结果生成一个裁剪后的视频预处理完的视频,再进行各种编辑的操作,将裁剪设置成整个时长(setCutTimeFrom
),最后调用 generateVideo
生成视频,防止压缩两次导致画质降低。
代码语言:txt复制注意 在预处理进行裁剪了,生成完的预处理视频,在最后生成前,一定要将裁剪时长设置为整个视频时长,不然还会再次进行裁剪。
//裁剪页面
mTXVideoEditer = new TXVideoEditer(mContext);
mTXVideoEditer.setCutFromTime(mTCVideoEditView.getSegmentFrom(), mTCVideoEditView.getSegmentTo());
mTXVideoEditer.processVideo();
// 将裁剪设置成整个时长(setCutTimeFrom)
mTXVideoEditer.setCutFromTime(0, mVideoDuration);
//跳转到特效页面,进行生成
mTXVideoEditer.generateVideo(TXVideoEditConstants.VIDEO_COMPRESSED_720P, mVideoOutputPath);
9. 安卓短视频编辑时,动态/静态贴纸都是放入到assets目录下的,也就是只能在打包apk时写死。那客户要做贴纸包动态拓展,能支持吗,如何做?
参考demo中的getPasterInfoList方法,读取的贴纸文件是从sdcard中读取的,所以只要把拓展包拷贝到指定目录下即可。拷贝进来的json字符串要遵循文档中描述的格式。
代码语言:txt复制总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"
}
]
}
代码语言:txt复制单个动态贴纸包的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)
10. 短视频编辑效果问题?
1). 调节生成文件的分辨率,清晰度从低到高可以选择360P、480P、540P、720P。
2). 调节生成文件的视频码率,建议设置范围为:600~3600,如果设置了码率,SDK生成视频会优先使用这个码率,注意码率不要太大或则太小,码率太小视频会模糊不清,码率太大,生成视频体积会很大。如果不自定义视频码率,SDK内部会根据设置文件的分辨率,自动计算视频码率
代码语言:txt复制//设置输出视频码率
mTXVideoEditer.setVideoBitrate(3600);
//设置输出分辨率
mTXVideoEditer.generateVideo(TXVideoEditConstants.VIDEO_COMPRESSED_720P, mVideoOutputPath);
11. 使用短视频编辑之后视频模糊或者花屏
1)、查看编辑前和编辑后视频文件大小是否差距过大?
- 在编辑时使用自定义视频输出
generateVideo(int videoCompressed, String videoOutputPath)
,参数videoCompressed
选择360p,而视频本身是720p或720p 的视频,排查视频因压缩过大导致问题
2)、查看编辑前和编辑后视频码率是否存在过大差异?
- 短视频sdk默认码率360p为2400kbps,540p为6500kbps,720p为9000kbps;
- 使用了自定义码率
setVideoBitrate
根据自己的需求设置需要的码率值; - 例子:视频源是抖音下载的,普遍为1200kbps,使用默认的码率会大于原视频,码率提高压缩视频质量,从而导致花屏或者模糊现象;
12. 预处理(processVideo)的作用与使用
1)、作用:预处理的过程是将原视频解码后进行色彩处理
2)、时长:视频时长与帧率大小都会影响需要预处理数据,视频本身的gop差异也会存在一定的影响;
3)、使用:编辑使用时间特效(加速、慢速、倒放、重复)、滤镜特效、单帧预览、精确缩略图都需要做预处理。
13. 使用TXVideoInfoReader.getInstance().getSampleImages获取缩略图常见问题
1). 使用getSampleImage获取图片不精确,使用getSampleImages返回多张图片效果一样?
- TXVideoInfoReader为视频信息类,使用getSampleImage(s)方法是将视频源的指定时间或相近(指定时间没有关键帧时)抽取一个关键帧作为图片返回,由于每个视频的gop差异,而获取缩略图片必须要返回相应数量的图片,会存在多个时间段内都获取为同一张画面,这个是正常的,如需获取精确的缩略图参考setThumbnail方法
2). 使用预处理之后getSampleImage、getSampleImages效果跟原来一样?
- getSampleImage(s)方法获取为视频源数据,跟编辑类的其他操作无关;
3). 使用getSampleImages获取多张缩略图,回调被系统回收,获取的图片数量不对应?
- sdk对外提供接口,大部分使用为弱引用,使用匿名内部类调用接口(如下图所示),在一些内存比较吃紧的手机上会触发系统回收,导致收不到回调而获取图片数量不对称;
- 不推荐使用匿名内部类实现,可转为内部类方式实现;
14. 短视频编辑功能中 TXVideoEditer 是否支持多实例化?
目前还不支持。虽然 TXVideoEditer 能多次被实例化, 但是内部很多配置项是用的单例的。所以多次实例化 TXVideoEditer, 后面实例化的 TXVideoEditer 会使用到之前的 TXVideoEditer 的编辑配置。
如第一次编辑短视频,使用 TXVideoEditer 增加背景音乐,然后没有调用 TXVideoEditer.release();
重新实例化 TXVideoEditer 对象,编辑新的短视频还是会播放背景音乐。
15. 通过短视频编辑获取封面?
- getThumbnail(count, width, height,fast,listener) 快速导入获取缩略图,第四个参数表示是否获取关键帧图片,true:表示在原视频上直接抽取I帧作为图片返回,优点是:获取图片快速,缺点:在对应时间点的附近找最精确的关键帧(不精准);false:表示,获取的时间点对应的图片需要处理成I帧,再回调出去,优点是:精确获取缩略图;缺点:花费的时间会较多;
- setThumbnail(thumbnail) 全功能导入获取缩略图,getThumbnail包括:count、width、height参数,跟getThumbnail参数作用一直,该方法是在预处理前调用,跟预处理结合使用,优点是:准确获取对应时间点的图片;缺点:预处理时间相对比较长,而预处理成全I帧文件过大,最大支持720p,大于720p会处理成720p;
- getThumbnailList(list, width, height) 根据时间获取缩略图,list:时间组;优点:可以精确的获取指定时间点缩略图;缺点:在处理图片上也会消耗点时间;
四、短视频合成/拼接
1. 短视频SDK目前支持哪几种视频拼接方式?
支持多个视频按顺序前后拼接,以及多个视频按照自定义布局分屏合成。
五、小视频
1. iOS端小视频demo短视频编辑获取mp3音乐时长问题?
原因是小视频Demo业务层代码逻辑问题,获取BGM音乐总时长为0,导致无法播放,所以设置了BGM没有声音。
1)、在SDK版本5.2及之前可以使用以下方式获取音乐时长:
_BGMDuration = TXVideoInfoReader getVideoInfoWithAsset:(AVAsset *)_BGMPath.duration;
2)、在SDK版本5.3版本及以后的版本建议使用系统接口获取音乐时长,因为SDK接口getVideoInfoWithAsset是给视频使用的,如果调用这个接口传音乐路径获取的音乐时长会为0,可以参考以下系统接口代码:
代码语言:txt复制AVURLAsset*audioAsset = AVURLAsset URLAssetWithURL:audioFileURL options:nil;
CMTime audioDuration = audioAsset.duration;
float audioDurationSeconds = CMTimeGetSeconds(audioDuration);
六、高级功能
1. 短视频录制和编辑如何定制视频数据自己处理?
iOS参考:https://cloud.tencent.com/document/product/584/20331
Android参考:https://cloud.tencent.com/document/product/584/20332
七、更多
1. 关于 TXUGCPublish.h 的问题
从 4.5 版本开始,TXUGCPublish
相关的类从 SDK 上移到了 Demo 层,开发者如果需要使用,使用时直接把 VideoUpload
目录整个拖入自己的工程即可。
2. 视频上传功能 TXUGCPublish
找不到?
视频上传模块从 SDK 中独立出来,并开源到 Demo 中,需要客户去集成短视频上传。
1). 下载Demo
2). 将短视频上传jar(在Demoapplibs目录下)拷贝到 您的项目appsrcmainlibs 目录下
3). 将短视频上传源代码目录(在 Demoappsrcmainjavacomtencentliteavdemovideoupload 目录下)拷贝到您自己的工程目录下,并修改源代码里面的package名称。
4). 在工程 App 目录下的 build.gradle 中,添加引用 jar 包的代码。
代码语言:txt复制dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
在 AndroidManifest.xml 中配置 App 的权限
代码语言:txt复制<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" />
3. 上传失败报服务器内部错误?如1000,32001错误码
请检查是否已开启点播服务或者是否负费;
4. 短视频上传参数类错误
请检查视频文件地址和图片地址是否正确,该路径下是否能找到相应文件。
5. 短视频上传签名错误
客户端在发起上传前,需要向 App 服务器请求上传签名,如果 App 服务器允许客户端上传,则应按照签名规则为客户端生成一个上传签名。客户端执行上传操作时,必须携带该签名,让腾讯云点播验证客户端的上传是否被授权。
客户端上传签名的生成包括以下三步,详情参见文档:
1). 获取 API 密钥;
2). 拼接明文串;
3). 将明文串转为最终签名。
4). 服务搭建完毕之后,开发者可以通过腾讯云点播提供的工具来校验签名的正确性:
5). 签名生成工具:根据参数和密钥,快速生成签名;
6). 签名校验工具:对签名进行解析,得到生成签名时所使用的各项参数。
6. 文件上传失败
文件上传状态码:
1). 确定上传的文件是否在本地沙盒,如果上传媒体库的文件,需要先 copy 到本地沙盒。
2). 返回错误码1002:签名有问题、时间戳过期、点播服务问题(未开通或停服)。
3). 返回错误码1003:请求参数问题、上传文件格式不支持。