大佬们,NS能放PPT和mp4qsv格式怎么转换mp4的视频吗

&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
iOS-视频 FFmpeg的使用
摘要:现状:现在视频直播非常的火,所以在视频直播开发中,使用的对视频进行遍解码的框架显得尤为重要了,其实,这种框架蛮多的,这次主要介绍一下FFmpeg视频播放器的集成和使用,FFmpeg是视频编解码的利器。介绍:视频播放过程首先简单介绍以下视频文件的相关知识。我们平时看到的视频文件有许多格式,比如avi,mkv,rmvb,mov,mp4等等,这些被称为容器(Container),不同的容器格式规定了其中音视频数据的组织方式(也包括其他数据,比如字幕等)。容器中一般会封装有视频和音频
现状:现在视频直播非常的火,所以在视频直播开发中,使用的对视频进行遍解码的框架显得尤为重要了,其实,这种框架蛮多的,这次主要介绍一下FFmpeg视频播放器的集成和使用,FFmpeg是视频编解码的利器。
介绍:视频播放过程
首先简单介绍以下视频文件的相关知识。我们平时看到的视频文件有许多格式,比如 avi, mkv, rmvb, mov, mp4等等,这些被称为容器(Container), 不同的容器格式规定了其中音视频数据的组织方式(也包括其他数据,比如字幕等)。容器中一般会封装有视频和音频轨,也称为视频流(stream)和音频 流,播放视频文件的第一步就是根据视频文件的格式,解析(demux)出其中封装的视频流、音频流以及字幕(如果有的话),解析的数据读到包 (packet)中,每个包里保存的是视频帧(frame)或音频帧,然后分别对视频帧和音频帧调用相应的解码器(decoder)进行解码,比如使用 H.264编码的视频和MP3编码的音频,会相应的调用H.264解码器和MP3解码器,解码之后得到的就是原始的图像(YUV or RGB)和声音(PCM)数据,然后根据同步好的时间将图像显示到屏幕上,将声音输出到声卡,最终就是我们看到的视频。
FFmpeg的API就是根据这个过程设计的,因此使用FFmpeg来处理视频文件的方法非常直观简单。下面就一步一步介绍从视频文件中解码出图片的过程。
属性:声明变量
AVFormatContext:保存需要读入的文件的格式信息,比如流的个数以及流数据等
AVCodecCotext:保存了相应流的详细编码信息,比如视频的宽、高,编码类型等。
pCodec:真正的编解码器,其中有编解码需要调用的函数
AVFrame:用于保存数据帧的数据结构,这里的两个帧分别是保存颜色转换前后的两帧图像
AVPacket:解析文件时会将音/视频帧读入到packet中
一 本播放器原理:
通过ffmpeg对视频进行解码,解码出每一帧图片,然后根据一定时间播放每一帧图
二 如何集成 ffmpeg
下载脚本&ffmpeg脚本
根据上面链接的 README 进行编译
1. 下载脚本:https://github.com/kewlbear/FFmpeg-iOS-build-script
2. 解压,找到文件 build-ffmpeg.sh
3. 进入终端,执行服本文件:./build-ffmpeg.sh, 由于本人没有事先安装Yasm,执行脚本文件会出错,提示Homebrew not found,Trying 头install.....如图:
根据提示,按下enter键进行安装并编译静态库FFmpeg,如下图:
这是编译后的静态库,截图如下:
集成到项目,新建工程,将编译好的静态库以及头文件导入工程(demo)
导入依赖库
设置头文件路径,路径一定要对,不然胡找不到头文件
我设置路径如下图:
先 command + B 编译一下,确保能编译成功
三 开始编写代码
新建一个OC文件
SJMoiveObject.h//
SJLiveVideo////
Created by king on 16/6/16.//
Copyright & 2016年 king. All rights reserved.// #import &Common.h&#import &UIKit/UIKit.h&#import &NSString+Extions.h&#include &libavcodec/avcodec.h&#include &libavformat/avformat.h&#include &libswscale//swscale.h& @interface SJMoiveObject : NSObject /* 解码后的UIImage */@property (nonatomic, strong, readonly) UIImage *currentI /* 视频的frame高度 */@property (nonatomic, assign, readonly) int sourceWidth, sourceH /* 输出图像大小。默认设置为源大小。 */@property (nonatomic,assign) int outputWidth, outputH /* 视频的长度,秒为单位 */@property (nonatomic, assign, readonly) double /* 视频的当前秒数 */@property (nonatomic, assign, readonly) double currentT /* 视频的帧率 */@property (nonatomic, assign, readonly) double /* 视频路径。 */- (instancetype)initWithVideo:(NSString *)movieP/* 切换资源 */- (void)replaceTheResources:(NSString *)movieP/* 重拨 */- (void)redialP/* 从视频流中读取下一帧。返回假,如果没有帧读取(视频)。 */- (BOOL)stepF /* 寻求最近的关键帧在指定的时间 */- (void)seekTime:(double) @end开始实现API////
SJMoiveObject.m//
SJLiveVideo////
Created by king on 16/6/16.//
Copyright & 2016年 king. All rights reserved.// #import &SJMoiveObject.h& @interface SJMoiveObject ()@property (nonatomic, copy) NSString *cruutenP@end @implementation SJMoiveObject{
AVFormatContext
*SJFormatC
AVCodecContext
isReleaseR} #pragma mark ------------------------------------#pragma mark
初始化- (instancetype)initWithVideo:(NSString *)moviePath {
if (!(self=[super init])) return
if ([self initializeResources:[moviePath UTF8String]]) {
self.cruutenPath = [moviePath copy];
}}- (BOOL)initializeResources:(const char *)filePath {
isReleaseResources = NO;
AVCodec *pC
// 注册所有解码器
avcodec_register_all();
av_register_all();
avformat_network_init();
// 打开视频文件
if (avformat_open_input(&;SJFormatCtx, filePath, NULL, NULL) != 0) {
SJLog(@&打开文件失败&);
goto initE
// 检查数据流
if (avformat_find_stream_info(SJFormatCtx, NULL) & 0) {
SJLog(@&检查数据流失败&);
goto initE
// 根据数据流,找到第一个视频流
if ((videoStream =
av_find_best_stream(SJFormatCtx, AVMEDIA_TYPE_VIDEO, -1, -1, &;pCodec, 0)) & 0) {
SJLog(@&没有找到第一个视频流&);
goto initE
// 获取视频流的编解码上下文的指针
= SJFormatCtx-&streams[videoStream];
SJCodecCtx
= stream-&#if DEBUG
// 打印视频流的详细信息
av_dump_format(SJFormatCtx, videoStream, filePath, 0);#endif
if(stream-&avg_frame_rate.den &;&; stream-&avg_frame_rate.num) {
fps = av_q2d(stream-&avg_frame_rate);
} else { fps = 30; }
// 查找解码器
pCodec = avcodec_find_decoder(SJCodecCtx-&codec_id);
if (pCodec == NULL) {
SJLog(@&没有找到解码器&);
goto initE
// 打开解码器
if(avcodec_open2(SJCodecCtx, pCodec, NULL) & 0) {
SJLog(@&打开解码器失败&);
goto initE
// 分配视频帧
SJFrame = av_frame_alloc();
_outputWidth = SJCodecCtx-&
_outputHeight = SJCodecCtx-&
return YES;initError:
return NO;}- (void)seekTime:(double)seconds {
AVRational timeBase = SJFormatCtx-&streams[videoStream]-&time_
int64_t targetFrame = (int64_t)((double)timeBase.den / timeBase.num * seconds);
avformat_seek_file(SJFormatCtx,
videoStream,
targetFrame,
targetFrame,
AVSEEK_FLAG_FRAME);
avcodec_flush_buffers(SJCodecCtx);}- (BOOL)stepFrame {
int frameFinished = 0;
while (!frameFinished &;&; av_read_frame(SJFormatCtx, &;packet) &= 0) {
if (packet.stream_index == videoStream) {
avcodec_decode_video2(SJCodecCtx,
&;frameFinished,
&;packet);
if (frameFinished == 0 &;&; isReleaseResources == NO) {
[self releaseResources];
return frameFinished != 0;} - (void)replaceTheResources:(NSString *)moviePath {
if (!isReleaseResources) {
[self releaseResources];
self.cruutenPath = [moviePath copy];
[self initializeResources:[moviePath UTF8String]];}- (void)redialPaly {
[self initializeResources:[self.cruutenPath UTF8String]];}#pragma mark ------------------------------------#pragma mark
重写属性访问方法-(void)setOutputWidth:(int)newValue {
if (_outputWidth == newValue) return;
_outputWidth = newV}-(void)setOutputHeight:(int)newValue {
if (_outputHeight == newValue) return;
_outputHeight = newV}-(UIImage *)currentImage {
if (!SJFrame-&data[0]) return
return [self imageFromAVPicture];}-(double)duration {
return (double)SJFormatCtx-&duration / AV_TIME_BASE;}- (double)currentTime {
AVRational timeBase = SJFormatCtx-&streams[videoStream]-&time_
return packet.pts * (double)timeBase.num / timeBase.}- (int)sourceWidth {
return SJCodecCtx-&}- (int)sourceHeight {
return SJCodecCtx-&}- (double)fps {
return}#pragma mark --------------------------#pragma mark - 内部方法- (UIImage *)imageFromAVPicture{
avpicture_free(&;picture);
avpicture_alloc(&;picture, AV_PIX_FMT_RGB24, _outputWidth, _outputHeight);
struct SwsContext * imgConvertCtx = sws_getContext(SJFrame-&width,
SJFrame-&height,
AV_PIX_FMT_YUV420P,
_outputWidth,
_outputHeight,
AV_PIX_FMT_RGB24,
SWS_FAST_BILINEAR,
if(imgConvertCtx == nil) return
sws_scale(imgConvertCtx,
SJFrame-&data,
SJFrame-&linesize,
SJFrame-&height,
picture.data,
picture.linesize);
sws_freeContext(imgConvertCtx);
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderD
CFDataRef data = CFDataCreate(kCFAllocatorDefault,
picture.data[0],
picture.linesize[0] * _outputHeight);
CGDataProviderRef provider = CGDataProviderCreateWithCFData(data);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGImageRef cgImage = CGImageCreate(_outputWidth,
_outputHeight,
picture.linesize[0],
colorSpace,
bitmapInfo,
kCGRenderingIntentDefault);
UIImage *image = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
CGColorSpaceRelease(colorSpace);
CGDataProviderRelease(provider);
CFRelease(data);
return} #pragma mark --------------------------#pragma mark - 释放资源- (void)releaseResources {
SJLog(@&释放资源&);
isReleaseResources = YES;
// 释放RGB
avpicture_free(&;picture);
// 释放frame
av_packet_unref(&;packet);
// 释放YUV frame
av_free(SJFrame);
// 关闭解码器
if (SJCodecCtx) avcodec_close(SJCodecCtx);
// 关闭文件
if (SJFormatCtx) avformat_close_input(&;SJFormatCtx);
avformat_network_deinit();}@end
为了方便,在SB 拖一个 UIImageView 控件 和按钮 &并连好线
ViewController.m//
SJLiveVideo////
Created by king on 16/6/14.//
Copyright & 2016年 king. All rights reserved.// #import &ViewController.h&#import &SJMoiveObject.h&#import &AVFoundation/AVFoundation.h&#import &SJAudioObject.h&#import &SJAudioQueuPlay.h&#define LERP(A,B,C) ((A)*(1.0-C)+(B)*C) @interface ViewController ()@property (weak, nonatomic) IBOutlet UIImageView *ImageV@property (weak, nonatomic) IBOutlet UILabel *@property (weak, nonatomic) IBOutlet UIButton *playB@property (weak, nonatomic) IBOutlet UIButton *TimerB@property (weak, nonatomic) IBOutlet UILabel *TimerL@property (nonatomic, strong) SJMoiveObject *@property (nonatomic, strong) SJAudioObject *@property (nonatomic, strong) SJAudioQueuPlay *audioP@property (nonatomic, assign) float lastFrameT@end @implementation ViewController @synthesize ImageView, fps, playBtn, - (void)viewDidLoad {
[super viewDidLoad];
self.video = [[SJMoiveObject alloc] initWithVideo:[NSString bundlePath:@&Dalshabet.mp4&]];//
self.video = [[SJMoiveObject alloc] initWithVideo:@&/Users/king/Desktop/Stellar.mp4&];//
self.video = [[SJMoiveObject alloc] initWithVideo:@&/Users/king/Downloads/Worth it - Fifth Harmony ft.Kid Ink - May J Lee Choreography.mp4&];//
self.video = [[SJMoiveObject alloc] initWithVideo:@&/Users/king/Downloads/4K.mp4&];//
self.video = [[SJMoiveObject alloc] initWithVideo:@&http://wvideo.spriteapp.cn/video/f8ec01d9bfe_wpd.mp4&];//
video.outputWidth = 800;//
video.outputHeight = 600;
self.audio = [[SJAudioObject alloc] initWithVideo:@&/Users/king/Desktop/Stellar.mp4&];
NSLog(@&视频总时长&&&video duration: %f&,video.duration);
NSLog(@&源尺寸&&&video size: %d x %d&, video.sourceWidth, video.sourceHeight);
NSLog(@&输出尺寸&&&video size: %d x %d&, video.outputWidth, video.outputHeight);////
[self.audio seekTime:0.0];//
SJLog(@&%f&, [self.audio duration])//
AVPacket *packet = [self.audio readPacket];//
SJLog(@&%ld&, [self.audio decode])
int tns, thh, tmm,
tns = video.
thh = tns / 3600;
tmm = (tns % 3600) / 60;
tss = tns % 60;
NSLog(@&fps --& %.2f&, video.fps);////
[ImageView setTransform:CGAffineTransformMakeRotation(M_PI)];//
NSLog(@&%02d:%02d:%02d&,thh,tmm,tss);} - (IBAction)PlayClick:(UIButton *)sender {
[playBtn setEnabled:NO];
_lastFrameTime = -1;
// seek to 0.0 seconds
[video seekTime:0.0];
[NSTimer scheduledTimerWithTimeInterval: 1 / video.fps
target:self
selector:@selector(displayNextFrame:)
userInfo:nil
repeats:YES];} - (IBAction)TimerCilick:(id)sender {
NSLog(@&current time: %f s&,video.currentTime);//
[video seekTime:150.0];//
[video replaceTheResources:@&/Users/king/Desktop/Stellar.mp4&];
if (playBtn.enabled) {
[video redialPaly];
[self PlayClick:playBtn];
} -(void)displayNextFrame:(NSTimer *)timer {
NSTimeInterval startTime = [NSDate timeIntervalSinceReferenceDate];//
self.TimerLabel.text = [NSString stringWithFormat:@&%f s&,video.currentTime];
self.TimerLabel.text
= [self dealTime:video.currentTime];
if (![video stepFrame]) {
[timer invalidate];
[playBtn setEnabled:YES];
ImageView.image = video.currentI
float frameTime = 1.0 / ([NSDate timeIntervalSinceReferenceDate] - startTime);
if (_lastFrameTime & 0) {
_lastFrameTime = frameT
_lastFrameTime = LERP(frameTime, _lastFrameTime, 0.8);
[fps setText:[NSString stringWithFormat:@&fps %.0f&,_lastFrameTime]];} - (NSString *)dealTime:(double)time {
int tns, thh, tmm,
thh = tns / 3600;
tmm = (tns % 3600) / 60;
tss = tns % 60;
// [ImageView setTransform:CGAffineTransformMakeRotation(M_PI)];
return [NSString stringWithFormat:@&%02d:%02d:%02d&,thh,tmm,tss];}@end
运程序 ,点击播放
&我的测试结果如下:原文地址:http://bbs.520it.com/forum.php?mod=viewthread&;tid=707&;page=1&;extra=#pid3821我集成后的demo:github源码下载:https://github.com/xiayuanquan/FFmpegDemo转:http://www.cnblogs.com/XYQ-208910/p/5651166.html
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
邮箱低至5折
推荐购买再奖现金,最高25%
&200元/3月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
iOS-视频 FFmpeg的使用相关信息,包括
的信息,所有iOS-视频 FFmpeg的使用相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International页面插入MP4和swf格式视频
&embed style="RIGHT: 10 POSITION: TOP: 10z-index:98" align=center src=test.swf width="1024" height="580 " wmode="opaque" type=application/x-shockwave-flash quality="high" windowlessVideo="true" ;& &/embed&1.插入swf视频,必须设置wmode="opaque",防止ie11浏览器中html中的其他内容显示不出来(即使在设置z-index的情况下也不行),2.windowlessVideo="true" ,如为true,则设置成无窗口模式,视频可直接显示在你指定的区域,上面可以叠加文字或其他效果;
如为false,则显示完整的media player窗口目前不设置在ie11上也能显示,但是还是加上了
&video id="aaa" src="05.mp4"
autoplay="autoplay"
loop="loop" style="RIGHT: 10 POSITION: TOP: 10z-index:99"&
您的浏览器不支持 video 标签。
&/video&1.autoplay="autoplay" 自动播放,然后设置load()方法才能有效2.load()从头开始播放3.play()继续播放
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!Android 短视频 SDK
最近更新时间: 09:12:21
PLDroidShortVideo 是七牛推出的一款适用于 Android 平台的短视频 SDK,提供了包括美颜、滤镜、水印、断点录制、分段回删、视频编辑、混音特效、本地/云端存储在内的多种功能,支持高度定制以及二次开发。
1.1 下载地址
2. 功能列表
短视频 SDK 的功能,主要分为 3 大块:拍摄、编辑、上传。
2.1 拍摄功能
摄像头采集
麦克风采集
需要额外收费
需要额外收费
闪光灯开关
第三方美颜接口
第三方滤镜接口
自定义拍摄时长
自定义分辨率
自定义视频帧率
自定义视频码率
支持 1:1 正方形录制
断点拍摄(多段录制)
H.264 硬编
输出 mp4 文件
支持 armeabi,armv7, arm64, x86
摄像头变焦
AR 特效拍摄
需要额外收费
纯音频拍摄
H.264 软编
2.2 视频编辑功能
2.2.1 视频剪辑
关键帧预览
非关键帧预览
剪辑指定区间
快速剪辑模式
2.2.2 视频特效
基于面部识别,需要额外付费
基于面部识别,需要额外付费
需要额外付费
2.2.3 音频特效
截取音频片段
调节原声/背景声音量
2.2.4 视频合成
片头片尾 MV
多个视频拼接
制作 GIF 封面
图片合成 MP4
制作过场字幕
2.2.5 视频转码
2.3 上传功能
3. 阅读对象
本文档为技术文档,需要阅读者:
具有基本的 Android 开发能力
准备接入七牛云存储
4. 总体设计
4.1 基本规则
为了方便理解和使用,对于 SDK 的接口设计,我们遵循了如下的原则:
每一个接口类,均以 PL 开头
所有的参数配置类,均以 PLXXXSetting 命名
所有的回调接口类,均以 PLXXXListener 命名
4.2 核心接口
核心的接口类说明如下:
PLShortVideoRecorder
负责视频的拍摄
音视频采集、美颜、编码、封包等
PLScreenRecorder
负责屏幕的录制
屏幕视频的采集、音频采集/导入
PLShortVideoEditor
负责视频内容的编辑
添加滤镜、水印、文字特效等
PLShortVideoTrimmer
负责视频的剪辑
关键帧获取、视频剪辑等
PLShortVideoTranscoder
负责视频的转码
视频转码,获取视频信息等
PLShortVideoUploader
负责视频的上传
视频文件的上传
PLShortVideoComposer
负责图像/视频的合成
生成 GIF,视频拼接等
PLShortAudioRecorder
负责纯音频的拍摄
纯音频采集、编码、封包等
PLTransitionMaker
负责过场字幕的制作
文字动画、图片动画生成 mp4
4.3 视频拍摄接口类
拍摄功能相关的类说明如下:
PLShortVideoRecorder
视频拍摄的核心接口
PLCameraSetting
配置摄像头参数
预览分辨率,前后摄像头等
PLMicrophoneSetting
配置麦克风参数
通道,采样率等
PLVideoEncodeSetting
配置视频编码参数
编码尺寸,码率,帧率等
PLAudioEncodeSetting
配置音频编码参数
码率,通道,采样率等
PLFaceBeautySetting
配置美颜参数
美白度,磨皮度,红润度等
PLRecordSetting
配置拍摄参数
缓存目录,拍摄时长等
PLWatermarkSetting
配置水印参数
水印的位置、透明度等
PLBuiltinFilter
内置滤镜对象
滤镜名称,缩略图等
PLCameraPreviewListener
摄像头预览数据回调
回调摄像头预览的数据
PLCameraParamSelectListener
摄像头参数选择回调
选择摄像头的参数
PLVideoFilterListener
外部滤镜接口
提供外部对视频数据做滤镜
PLAudioFrameListener
麦克风数据回调
回调麦克风采集的数据
PLRecordStateListener
拍摄状态回调
回调拍摄状态
PLFocusListener
摄像头对焦状态回调
回调手动/自动对焦事件
PLCaptureFrameListener
回调预览当前一帧
PLVideoSaveListener
分段合成回调
回调分段合成的状态
4.4 屏幕录制接口类
屏幕录制功能相关的类说明如下:
PLScreenRecorder
屏幕录制的核心接口
PLScreenRecorderSetting
配置屏幕录制参数
文件名称、位置,屏幕尺寸等
PLScreenRecordStateListener
屏幕录制状态回调
回调屏幕录制状态
PLMicrophoneSetting
配置麦克风参数
通道,采样率等
PLVideoEncodeSetting
配置视频编码参数
编码尺寸,码率,帧率等
PLAudioEncodeSetting
配置音频编码参数
码率,通道,采样率等
4.5 视频编辑接口类
4.5.1 视频内容编辑接口类
视频编辑功能相关的类说明如下:
PLShortVideoEditor
视频编辑的核心接口
PLVideoEditSetting
配置视频编辑参数
源文件、目标文件地址等
PLWatermarkSetting
配置水印参数
水印的位置、透明度等
PLDisplayMode
配置视频的显示模式
全屏,适应屏幕等
PLVideoFilterListener
外部滤镜接口
提供外部对视频数据做滤镜
PLVideoSaveListener
编辑保存状态回调
回调保存编辑的状态
PLVideoPlayerListener
预览视频的播放状态回调
是否播放完成等
4.5.2 视频文件处理接口类
PLShortVideoTrimmer
视频剪辑的核心接口
PLShortVideoTranscoder
视频转码的核心接口
PLShortVideoComposer
视频合成的核心接口
PLVideoSaveListener
视频保存状态回调
回调保存视频的状态
4.6 视频上传接口类
视频上传功能相关的类说明如下:
PLShortVideoUploader
视频上传的核心接口
PLUploadSetting
配置上传参数
超时时间,块大小等
PLUploadProgressListener
上传进度回调
回调上传进度
PLUploadResultListener
上传结果回调
回调上传结果
5. 开发准备
5.1 开发环境
Android Studio 开发工具,官方
Android 官方开发 SDK,官方
5.2 设备以及系统要求
系统要求:Android 4.3 (API 18) 及其以上
5.3 下载和导入 SDK
SDK 主要包含 demo 代码、sdk jar 包,以及 sdk 依赖的动态库文件,说明如下:
pldroid-shortvideo-x.y.z.jar
libpldroid_shortvideo_core.so
短视频核心库
libpldroid_beauty.so
不使用内置美颜可以去掉
libpldroid_amix.so
不使用混音功能可以去掉
libpldroid_encoder.so
软编拍摄模块
不使用软编拍摄功能可以去掉
内置滤镜缩略图
可以根据需求删减
5.4 修改 build.gradle
双击打开您的工程目录下的 build.gradle,确保已经添加了如下依赖,如下所示:
dependencies {
compile files('libs/pldroid-shortvideo-x.y.z.jar')
5.5 添加相关权限
在 app/src/main 目录中的 AndroidManifest.xml 中增加如下 uses-permission 声明:
&uses-permission android:name=&android.permission.CAMERA& /&
&uses-permission android:name=&android.permission.RECORD_AUDIO& /&
&uses-permission android:name=&android.permission.READ_EXTERNAL_STORAGE& /&
&uses-permission android:name=&android.permission.WRITE_EXTERNAL_STORAGE& /&
&uses-permission android:name=&android.permission.INTERNET& /&
&uses-permission android:name=&android.permission.FLASHLIGHT& /&
6. 快速开始
6.1 视频拍摄
6.1.1 创建录制对象
PLShortVideoRecorder mShortVideoRecorder = new PLShortVideoRecorder();
mShortVideoRecorder.setRecordStateListener(this);
6.1.2 配置采集参数
PLShortVideo 提供了丰富的自定义录制选项,可以通过创建以下对象进行配置:
// 摄像头采集选项
PLCameraSetting cameraSetting = new PLCameraSetting();
cameraSetting.setCameraId(PLCameraSetting.CAMERA_FACING_ID.CAMERA_FACING_FRONT);
cameraSetting.setCameraPreviewSizeRatio(PLCameraSetting.CAMERA_PREVIEW_SIZE_RATIO.RATIO_4_3);
cameraSetting.setCameraPreviewSizeLevel(PLCameraSetting.CAMERA_PREVIEW_SIZE_LEVEL.PREVIEW_SIZE_LEVEL_480P);
// 麦克风采集选项
PLMicrophoneSetting microphoneSetting = new PLMicrophoneSetting();
// 视频编码选项
PLVideoEncodeSetting videoEncodeSetting = new PLVideoEncodeSetting();
videoEncodeSetting.setEncodingSizeLevel(PLVideoEncodeSetting.VIDEO_ENCODING_SIZE_LEVEL.VIDEO_ENCODING_SIZE_LEVEL_480P_1); // 480x480
videoEncodeSetting.setEncodingBitrate(); // 1000kbps
videoEncodeSetting.setEncodingFps(25);
videoEncodeSetting.setHWCodecEnabled(true); // true:硬编 false:软编
// 音频编码选项
PLAudioEncodeSetting audioEncodeSetting = new PLAudioEncodeSetting();
audioEncodeSetting.setHWCodecEnabled(true); // true:硬编 false:软编
// 美颜选项
PLFaceBeautySetting faceBeautySetting = new PLFaceBeautySetting(1.0f, 0.5f, 0.5f);
// 录制选项
PLRecordSetting recordSetting = new PLRecordSetting();
recordSetting.setMaxRecordDuration(10*1000); // 10s
recordSetting.setVideoCacheDir(&/sdcard&);
recordSetting.setVideoFilepath(&/sdcard/record.mp4&);
6.1.3 创建预览窗口
拍摄视频需要的预览窗口为 GLSurfaceView 或者其派生的类对象,可以配置在 XML 文件中,也可以动态创建。
6.1.4 配置录制参数
通过 prepare 把拍摄所选择的参数配置到 SDK 中:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mShortVideoRecorder.prepare(glSurfaceView, cameraSetting, microphoneSetting,
videoEncodeSetting, audioEncodeSetting, faceBeautySetting, recordSetting);
6.1.5 生命周期
请在 Activity 的各个生命周期的回调中,分别调用 PLShortVideoRecorder 对应的方法:
protected void onResume() {
super.onResume();
mShortVideoRecorder.resume();
protected void onPause() {
super.onPause();
mShortVideoRecorder.pause();
protected void onDestroy() {
super.onDestroy();
mShortVideoRecorder.destroy();
6.1.6 断点拍摄和保存
基本的配置完成以后,就可以开始断点拍摄了。
// 开始一段视频
PLShortVideoRecorder.beginSection();
// 结束一段视频
PLShortVideoRecorder.endSection();
// 回删上一段视频
PLShortVideoRecorder.deleteLastSection();
// 回删所有录制的视频
PLShortVideoRecorder.deleteAllSections();
// 合成和保存所有的视频片段
PLShortVideoRecorder.concatSections();
6.1.7 添加背景音乐
可以通过如下接口添加背景音乐:
// 设置 sdCard 上的音乐文件
PLShortVideoRecorder.setMusicFile(String filePath);
// 设置 Assets 下的音乐文件
PLShortVideoRecorder.setMusicAsset(AssetFileDescriptor afd);
// 设置音乐文件的播放起始位置
PLShortVideoRecorder.setMusicPosition(int position);
// 获取音乐文件当前的播放位置
PLShortVideoRecorder.getMusicPosition();
6.1.8 添加水印
PLShortVideoRecorder 支持在录制过程中添加水印,水印的位置是相对于预览分辨率的,可以通过 PLWatermarkSetting 设置水印参数:
PLWatermarkSetting mWatermarkSetting = new PLWatermarkSetting();
mWatermarkSetting.setResourceId(R.drawable.qiniu_logo);
mWatermarkSetting.setPosition(0.01f, 0.75f);
mWatermarkSetting.setAlpha(128);
PLShortVideoRecorder.setWatermark(mWatermarkSetting);
6.1.9 保存草稿
可以将某次拍摄的所有片段与设置项保存为草稿并持久化保存,之后可以恢复:
// 保存草稿
PLShortVideoRecorder.saveToDraftBox(glSurfaceView, &My Draft Title&);
// 恢复草稿
PLDraft draft = PLDraftBox.getInstance(this).getDraftByTag(&My Draft Title&);
PLShortVideoRecorder.recoverFromDraft(draft);
6.2 屏幕录制
6.2.1 创建录制对象
PLScreenRecorder mScreenRecorder = new PLScreenRecorder(this);
mScreenRecorder.setRecordStateListener(this);
6.2.2 配置采集参数
PLShortVideo 提供了丰富的自定义录制选项,可以通过创建以下对象进行配置:
// 屏幕采集选项
public static final String SCREEN_RECORD_FILE_PATH = VIDEO_STORAGE_DIR + &/screen_record.mp4&;
DisplayMetrics metrics = getResources().getDisplayMetrics();
int width = metrics.widthP
int height = metrics.heightP
int dpi = metrics.densityD
mScreenRecorder = new PLScreenRecorder();
PLScreenRecorderSetting screenSetting = new PLScreenRecorderSetting();
screenSetting.setRecordFile(SCREEN_RECORD_FILE_PATH)
.setInputAudioEnabled(false)
.setSize(width, height)
.setDpi(dpi);
// 音频(麦克风/外部导入)参数信息
PLMicrophoneSetting microphoneSetting = new PLMicrophoneSetting();
6.2.3 配置录制参数
通过 prepare 把屏幕录制所选择的参数配置到 SDK 中:
mScreenRecorder.prepare(screenSetting, microphoneSetting);
6.2.4 申请屏幕录制权限
屏幕录制需要得到用户授权,通过下面接口申请用户权限:
mScreenRecorder.requestScreenRecord();
调用该接口后,系统会自动弹出申请权限对话框,用户的操作结果会通过 onActivityResult 系统回调接口返回:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == PLScreenRecorder.REQUEST_CODE) {
if (data == null) {
String tip = &录屏申请启动失败!&;
mScreenRecorder.stop();
mScreenRecorder =
if (startScreenRecord(requestCode, resultCode, data)) {
String tip = &正在进行录屏...&;
moveTaskToBack(true);
6.2.5 开始录制
用户授权后,通过下面接口开始屏幕录制:
private boolean startScreenRecord(int requestCode, int resultCode, Intent data) {
boolean isReady = mScreenRecorder.onActivityResult(requestCode, resultCode, data);
if (isReady) {
mScreenRecorder.start();
return isR
6.2.6 结束录制
通过下面接口结束屏幕录制:
mScreenRecorder.stop();
6.3 视频内容编辑
6.3.1 配置编辑参数
通过 PLVideoEditSetting 可以配置视频编辑的必要参数:
PLVideoEditSetting setting = new PLVideoEditSetting();
// 视频源文件路径
setting.setSourceFilepath(videopath);
// 编辑后保存的目标文件路径
setting.setDestFilepath(outputpath);
// 编辑保存后,是否保留源文件
setting.setKeepOriginFile(true);
6.3.2 创建编辑对象
// glSurfaceView 用于渲染视频编辑后的效果
mShortVideoEditor = new PLShortVideoEditor(glSurfaceView, setting);
6.3.3 添加滤镜
添加内置滤镜
获取内置的视频滤镜列表
mShortVideoEditor.getBuiltinFilterList();
选择一个滤镜
mShortVideoEditor.setBuildinFilter(String filterName);
添加外置滤镜
mShortVideoEditor.setExternalFilter(String filterFilePath);
6.3.4 添加水印
PLShortVideoEditor 支持在视频上添加水印,通过 PLWatermarkSetting 设置水印参数:
PLWatermarkSetting mWatermarkSetting = new PLWatermarkSetting();
mWatermarkSetting.setResourceId(R.drawable.qiniu_logo);
mWatermarkSetting.setPosition(0.01f, 0.75f);
mWatermarkSetting.setAlpha(128);
mShortVideoEditor.setWatermark(mWatermarkSetting);
6.3.5 预览效果
// 开始播放
mShortVideoEditor.startPlayback();
// 恢复播放
mShortVideoEditor.resumePlayback();
// 暂停播放
mShortVideoEditor.pausePlayback();
// 结束播放
mShortVideoEditor.stopPlayback();
// 跳到 msec 处播放
mShortVideoEditor.seekTo(int msec);
// 获取当前播放时间
mShortVideoEditor.getCurrentPosition();
6.3.6 混音
// 设置混音文件(本地音频文件)
mShortVideoEditor.setAudioMixFile(String filePath);
// 设置混音文件(assets 下的音频文件)
mShortVideoEditor.setAudioMixAsset(AssetFileDescriptor afd);
// 设置原音(前景)和混音文件(背景)的音量 [0-1.0f]
mShortVideoEditor.setAudioMixVolume(float fgVolume, float bgVolume);
// 设置混音的起始和结束位置
mShortVideoEditor.setAudioMixFileRange(long beginTime, long endTime);
// 设置混音是否循环
mShortVideoEditor.setAudioMixLooping(false);
6.3.7 保存视频
编辑后的视频效果,调用如下接口最终可以保存到本地:
// 监听保存状态和结果
mShortVideoEditor.setVideoSaveListener(this);
// 执行保存操作
mShortVideoEditor.save();
6.3.8 添加文字特效
// 创建文字特效控件
PLTextView textView = new PLTextView(this);
// 设置文字内容,字体大小,字体颜色,透明度等一系列属性
textView.setText(&点击输入文字&);
textView.setTextSize(40);
textView.setTextColor(Color.RED);
textView.setAlpha(0.8f);
// 添加文字特效
mShortVideoEditor.addTextView(textView);
// 删除文字特效
mShortVideoEditor.removeTextView(textView);
6.3.9 添加MV特效
// 添加MV特效
// 注:mvFilePath 为MV视频文件路径,maskFilePath 为蒙版文件路径
mShortVideoEditor.setMVEffect(mvFilePath, maskFilePath);
MV 特效素材制作要求:
基本要求:
分辨率可用 480x480, 480x854,544x960等,决定合成视频的分辨率
帧率建议使用 30帧/秒
特效视频格式 .mp4。考虑跨平台以及视频体积,不建议使用 .mov
特效视频的时长(单位:秒)决定合成视频的时长(单位:秒)
对于部分区域为透明的 MV 特效视频,素材制作要求:
配备1个黑白和1个彩色视频
黑白视频中视频帧只有纯黑、纯白2种颜色。每一帧中纯黑像素点对应彩色视频的透明区域,纯白像素点对应彩色视频的非透明区域,视频格式为.mp4
彩色视频,即视频特效期望的效果,透明区域用纯黑色表示,其它非透明区域可以使用包括纯黑色在内的任意颜色,视频格式为 .mp4
黑白视频与彩色视频的帧率、分辨率必须相同
黑白视频只带视频数据,无音频数据
彩色视频在带有视频数据外,音频数据可有可无
不建议使用 .mov 视频格式。缺点在于不利于跨平台编解码和播放处理,视频体积大
6.3.10 添加静态贴图
PLImageView imageView = new PLImageView(this);
Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
imageView.setImageBitmap(bitmap);
// 添加贴图
mShortVideoEditor.addImageView(imageView);
// 删除贴图
mShortVideoEditor.removeImageView(imageView);
6.3.11 添加涂鸦
PLPaintView paintView = new PLPaintView(this, width, height);
//设置画笔颜色
paintView.setPaintColor(color);
//设置画笔尺寸
paintView.setPaintSize(size);
//撤销上一步操作
paintView.undo();
//清除所绘制的涂鸦
paintView.clear();
//设置画笔是否可绘制
paintView.setPaintEnable(false);
//添加涂鸦
mShortVideoEditor.addPaintView(paintView);
//删除涂鸦
mShortVideoEditor.removePaintView(paintView);
6.4 视频剪辑
6.4.1 创建剪辑对象
mShortVideoTrimmer = new PLShortVideoTrimmer(getApplicationContext(), videoPath, outputpath);
6.4.2 视频帧
获取视频帧并展示给用户,帮助其选取剪辑范围。
// true 限定为关键帧,false 为所有视频帧
boolean keyFrame =
// 获取视频帧总数
mShortVideoTrimmer.getVideoFrameCount(keyFrame);
// 通过索引获取视频帧
mShortVideoTrimmer.getVideoFrameByIndex(index, keyFrame);
// 通过时间戳获取视频帧
1. mShortVideoTrimmer.getVideoFrameByTime(timestampInMs, keyFrame);
6.4.3 指定范围剪辑
// beginMs 和 endMs 可参考 从 getKeyFrame() 返回的 PLVideoFrame 中的时间戳
mShortVideoTrimmer.trim(beginMs, endMs, saveListener);
6.4.4 设置快速剪辑模式
// beginMs 和 endMs 可参考 从 getKeyFrame() 返回的 PLVideoFrame 中的时间戳
mShortVideoTrimmer.trim(beginMs, endMs, TRIM_MODE.FAST, saveListener);
6.5 视频转码
6.5.1 创建转码对象
mShortVideoTranscoder = new PLShortVideoTranscoder(getApplicationContext(), videoPath, outputpath);
6.5.2 获取源视频信息
获取源视频转码相关信息,并展示给用户,让用户更好地了解源视频的状况。
// 获取源视频宽度
mShortVideoTranscoder.getSrcWidth();
// 获取源视频高度
mShortVideoTranscoder.getSrcHeight();
// 获取源视频码率
mShortVideoTranscoder.getSrcBitrate();
6.5.3 转码
mShortVideoTranscoder.transcode(dstWidth, dstHeight, dstBitrate, saveListener);
6.5.4 时光倒流
可使转码后的视频倒置
mShortVideoTranscoder.transcode(dstWidth, dstHeight, dstBitrate, true, saveListener);
6.5.5 视频旋转
可使转码后的视频在源视频的基础上旋转某些角度, 角度可为 0, (-)90, (-)180, (-)270
mShortVideoTranscoder.transcode(dstWidth, dstHeight, dstBitrate, rotateBy, isReverse, saveListener);
6.6 视频合成
6.6.1 创建合成对象
mShortVideoComposer = new PLShortVideoComposer(context);
6.6.2 生成 GIF 文件
ArrayList&Bitmap& bitmaps = new ArraryList&Bitmap&();
bitmaps.add(bitmap1);
bitmaps.add(bitmap2);
bitmaps.add(bitmap3);
int frameDelayMs = 500; //GIF 中每帧的持续时间
boolean isLoop = //GIF 是否循环播放
mShortVideoComposer.composeToGIF(bitmaps, frameDelayMs, isLoop, saveListener);
6.6.3 多视频拼接
// 添加视频文件
List&String& videoList = new ArrayList&&();
videoList.add(videopath1);
videoList.add(videopath2);
// 编码配置,用于设置拼接后的视频文件的编码参数
// 注:多个视频拼接后,带角度的视频,最终会旋转为正向(0 度)
PLVideoEncodeSetting setting = new PLVideoEncodeSetting(this);
setting.setEncodingSizeLevel(VIDEO_ENCODING_SIZE_LEVEL.VIDEO_ENCODING_SIZE_LEVEL_480P_1);
setting.setEncodingBitrate(1000 * 1000);
mShortVideoComposer.composeVideos(videoList, &/sdcard/composed.mp4&, setting, saveListener);
6.6.4 图片合成mp4
// 配置每张图片在视频中的显示时间和转场效果时间
PLComposeItem item1 = new PLComposeItem(imagePath);
item1.setDurationMs(durationTime);
item1.setTransitionTimeMs(transTime);
// 添加每张图片等合成信息
List&PLComposeItem& itemList = new ArrayList&&();
itemList.add(item1);
itemList.add(item2);
// 编码配置,用于设置合成后的视频文件的编码参数
PLVideoEncodeSetting setting = new PLVideoEncodeSetting(this);
setting.setEncodingSizeLevel(VIDEO_ENCODING_SIZE_LEVEL.VIDEO_ENCODING_SIZE_LEVEL_480P_1);
setting.setEncodingBitrate(1000 * 1000);
// 开始合成
mShortVideoComposer.composeImages(itemList, &/sdcard/music.mp3&, true, &/sdcard/image_composed.mp4&, setting, saveListener);
6.7 视频上传
配置上传参数
PLUploadSetting 提供了上传可配置的参数,一般情况下可以直接使用默认设置,不用额外配置。
PLUploadSetting uploadSetting = new PLUploadSetting();
uploadSetting.setChunkSize(chunkSize)
// 分片上传时,每片的大小,默认 2M
.setPutThreshhold(putthreshhold)
// 启用分片上传阀值,默认 4M
.setConnectTimeout(connectTimeout) // 链接超时,默认10秒
.setResponseTimeout(responseTimeout) // 服务器响应超时,默认60秒
.setZone(plUploadZone)
// 设置区域,指定不同区域的上传域名、备用域名、备用IP
.setHttpsEnabled(true)
// 是否启用 https 上传,默认不启用
.setParams(params);
// 配置上传自定义变量
6.7.2 创建上传对象
首先创建 PLShortVideoUploader 对象,传入上下文 context 即可,同时配置相关监听器,如:
mShortVideoUploader = new PLShortVideoUploader(getApplicationContext(), uploadSetting);
mShortVideoUploader.setUploadProgressListener(this);
mShortVideoUploader.setUploadResultListener(this);
6.7.3 上传视频
默认返回文件的哈希值作为 key
* @filepath 即将上传的文件的路径
* @token 上传的凭证,客户端在上传前,需要先从服务端获取上传凭证
PLShortVideoUploader.startUpload(String filepath, String token);
* @filepath 即将上传的文件的路径
* @key 指定上传后的 key 值
* @token 上传的凭证,客户端在上传前,需要先从服务端获取上传凭证
PLShortVideoUploader.startUpload(String filePath, String key, String token)
* 取消上传
PLShortVideoUploader.cancelUpload();
注:上传凭证的详细定义,可以参考
6.8 纯音频录制
6.8.1 创建录制对象
PLShortAudioRecorder mShortAudioRecorder = new PLShortAudioRecorder();
mShortAudioRecorder.setRecordStateListener(this);
6.8.2 配置采集参数
// 麦克风采集选项
PLMicrophoneSetting microphoneSetting = new PLMicrophoneSetting();
// 音频编码选项
PLAudioEncodeSetting audioEncodeSetting = new PLAudioEncodeSetting();
// 录制选项
PLRecordSetting recordSetting = new PLRecordSetting();
recordSetting.setMaxRecordDuration(10*1000); // 10s
recordSetting.setVideoCacheDir(&/sdcard&);
recordSetting.setVideoFilepath(&/sdcard/audio_record.m4a&);
6.8.3 配置录制参数
通过 prepare 把录制所选择的参数配置到 SDK 中:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mShortAudioRecorder.prepare(this, microphoneSetting,
audioEncodeSetting, recordSetting);
6.8.4 生命周期
请在 Activity 的各个生命周期的回调中,分别调用 PLShortAudioRecorder 对应的方法:
protected void onResume() {
super.onResume();
mShortAudioRecorder.resume();
protected void onPause() {
super.onPause();
mShortAudioRecorder.pause();
protected void onDestroy() {
super.onDestroy();
mShortAudioRecorder.destroy();
6.8.5 断点拍摄和保存
基本的配置完成以后,就可以开始断点拍摄了。
// 开始一段音频
PLShortAudioRecorder.beginSection();
// 结束一段音频
PLShortAudioRecorder.endSection();
// 回删上一段音频
PLShortAudioRecorder.deleteLastSection();
// 回删所有录制的音频
PLShortAudioRecorder.deleteAllSections();
// 合成和保存所有的音频片段
PLShortAudioRecorder.concatSections();
6.9 制作过场字幕
6.9.1 创建过场字幕制作对象
// 编码配置,用于设置生成的视频文件的编码参数
PLVideoEncodeSetting setting = new PLVideoEncodeSetting(this);
setting.setEncodingSizeLevel(VIDEO_ENCODING_SIZE_LEVEL.VIDEO_ENCODING_SIZE_LEVEL_720P_3);
setting.setEncodingBitrate(1000 * 1000);
// 构造函数所需参数为 ViewGroup 和 PLVideoEncodeSetting 对象
mTransitionMaker = new PLTransitionMaker(mViewGroup, setting);
6.9.2 添加文字
// 创建文字控件
PLTextView title = new PLTextView(mContext);
// 设置文字内容,颜色,大小等一系列属性
title.setText(&标题&);
title.setPadding(0, 0, 0, 0);
title.setTextColor(Color.parseColor(&#FFCC99&));
title.setTextSize(14);
// 添加创建的文字
mTransitionMaker.addText(title);
6.9.3 添加图片
// 创建图片控件
PLImageView imageView = new PLImageView(mContext);
// 设置图片内容
imageView.setImageDrawable(mContext.getResources().getDrawable(R.drawable.pink_line));
// 添加创建的图片
mTransitionMaker.addText(imageView);
6.9.4 在控件上添加透明度动画
// 创建透明度动画,延迟时间为 0, 持续时间为 3000 毫秒,透明度变化从 0 到 1
PLFadeTransition fadeTransition = new PLFadeTransition(0, );
// 把创建的透明度动画添加到相应的控件上
mTransitionMaker.addTransition(title, fadeTransition);
6.9.5 在控件上添加位移动画
// 创建位移动画,延迟时间为 0,持续时间为 3000 毫秒,位移变化从 (0,0) 到 (100,100)
PLPositionTransition positionTransition = new PLPositionTransition(0, , 100, 100);
// 把创建的位移动画添加到相应的控件上
mTransitionMaker.addTransition(title, positionTransition);
6.9.6 播放过场动画
播放已添加的过场动画
mTransitionMaker.play()
6.9.7 保存成 mp4
mTransitionMaker.save(dstFilePath, saveListener);
6.9.8 销毁 PLTransitionMaker 对象
使用完之后,一定要调用该方法销毁资源
mTransitionMaker.destroy();
7 SDK 接口设计
7.1 核心类
短视频核心类有 9 个,分别是 PLShortVideoRecorder 、 PLScreenRecorder 、PLShortVideoEditor 、 PLShortVideoTrimmer 、 PLShortVideoTranscoder 、 PLShortVideoUploader 、 PLShortVideoComposer 、 PLShortAudioRecorder、 PLTransitionMaker,分别完成音视频的录制、编辑、剪辑、转码、合成与上传工作。
7.1.1 PLShortVideoRecorder
PLShortVideoRecorder 包含了录制短视频所需要的接口,方法列表如下:
* 构造 PLShortVideoRecorder 对象
public PLShortVideoRecorder();
* 使 PLShortVideoRecorder 暂停工作,通常在 Activity#onPause 中调用
public pause();
* 使 PLShortVideoRecorder 恢复工作,通常在 Activity#onResume 中调用
public resume();
* 销毁 PLShortVideoRecorder 对象,通常在 Activity#onDestroy 中调用
* 将删除已录制的片段
public destory();
* 销毁 PLShortVideoRecorder 对象,通常在 Activity#onDestroy 中调用
* @param clearSections 是否删除已录制的片段
public destory(boolean clearSections);
* Prepare the recorder
* @param glSurfaceView
预览的 GLSurfaceView
* @param cameraSetting
PLCameraSetting 对象
* @param microphoneSetting
PLMicrophoneSetting 对象
* @param videoEncodeSetting PLVideoEncodeSetting 对象
* @param audioEncodeSetting PLAudioEncodeSetting 对象
* @param faceBeautySetting
PLFaceBeautySetting 对象
* @param recordSetting
PLRecordSetting 对象
public void prepare(GLSurfaceView glSurfaceView,
PLCameraSetting cameraSetting,
PLMicrophoneSetting microphoneSetting,
PLVideoEncodeSetting videoEncodeSetting,
PLAudioEncodeSetting audioEncodeSetting,
PLFaceBeautySetting faceBeautySetting,
PLRecordSetting recordSetting);
* 手动对焦,在 prepare 里设置好的 GLSurfaceView 上指定对焦块大小以及相应的中央坐标
* @param 对焦块的宽度
* @param 对焦块的高度
* @param 对焦块的中央X坐标
* @param 对焦块的中央Y坐标
public void manualFocus(int focusBlockWidth, int focusBlockHeight, int focusBlockCenterX, int focusBlockCenterY);
* 注册相机对焦监听器
* @param 对焦监听器
public void setFocusListener(PLFocusListener focusListener);
* 开始录制片段,需要收到 `onReady` 回调之后执行
public boolean beginSection();
* 开始录制片段,需要收到 `onReady` 回调之后执行
* @param 指定片段文件名
public boolean beginSection(String sectionFileName);
* 停止录制当前片段
public boolean endSection();
* 删除上一个录制的片段
public boolean deleteLastSection();
* 删除所有录制的片段
public boolean deleteAllSections();
* 合并录制的片段,SDK 将会在缓存目录中临时创建对应文件
用于接收合并回调的 listener
public void concatSections(PLVideoSaveListener listener);
* 取消进行中的片段合并,会清理已生成的文件
public void cancelConcat();
* 切换到下一个摄像头
public void switchCamera();
* 切换到指定摄像头
public void switchCamera(PLCameraSetting.CAMERA_FACING_ID facingId);
* 设置闪光灯开关
public void setFlashEnabled(boolean enabled);
* 更新美颜设置
* @param 美颜设置对象
public final void updateFaceBeautySetting(PLFaceBeautySetting setting);
* 注册相机预览监听器
* @param 监听器对象
public final void setCameraPreviewListener(PLCameraPreviewListener listener);
* 注册相机参数选定监听器
* @param 监听器对象
public final void setCameraParamSelectListener(PLCameraParamSelectListener listener);
* 注册自定义美颜、滤镜效果的监听器
* @param 监听器对象
public final void setVideoFilterListener(PLVideoFilterListener listener);
* 注册自定义美颜、滤镜效果的监听器
* @param 监听器对象
* @param 指定监听器中返回的纹理类型为 OES
public final void setVideoFilterListener(PLVideoFilterListener listener, boolean callbackOES);
* 设置纹理在以下 2 个地方的旋转角度
* 2. 最终拼接的视频
* 注意:不会对从 PLVideoFilterListener 返回的纹理有影响
* @param 旋转角度
public void setTextureRotation(int rotation);
* 注册音频帧监听器
* @param 监听器对象
public final void setAudioFrameListener(PLAudioFrameListener listener);
* 注册录制状态监听器
* @param 监听器对象
public final void setRecordStateListener(PLRecordStateListener listener);
* 获取 SDK 自带的滤镜列表
* @return PLBuiltinFilter 数组
public PLBuiltinFilter[] getBuiltinFilterList();
* 应用 SDK 自带的滤镜
* @param 滤镜名,从 getBuiltinFilter 获取
public void setBuiltinFilter(String filterName);
* 应用 SD 卡中的滤镜
* @param 滤镜名,滤镜资源的绝对路径
public void setExternalFilter(String filterFilePath);
* 截取当前预览一帧
* @param 监听器对象
public void captureFrame(PLCaptureFrameListener captureFrameListener);
* 获取当前摄像头的最大曝光补偿值
* @return 最大曝光补偿值
public int getMaxExposureCompensation();
* 获取当前摄像头的最小曝光补偿值
* @return 最小曝光补偿值
public int getMinExposureCompensation();
* 设置曝光补偿值
public void setExposureCompensation(int exposureCompensation);
* 设置倍数拍摄,只支持 2 的倍数,或 1/2 的倍数
* 例如:2x, 4x, 1/2x, 1/4x
* 注意调用过一次 beginSection 后,该方法设置无效
* @param 倍数值
public void setRecordSpeed(double recordSpeed);
* 设置预览画面的缩放值
* 调用此方法前,请先调用 getZooms 方法获取有效值
* @param 缩放值
public void setZoom(float zoom);
* 获取有效的缩放值列表
* 已由小至大排序
* @return 如果该分辨率不支持缩放,则返回 null
public List&Float& getZooms();
* 设置存储下的音乐文件
* @param 文件路径
public void setMusicFile(String filePath);
* 设置 Assets 下的音乐文件
* @param AssetFileDescriptor
public void setMusicAsset(AssetFileDescriptor afd);
* 设置音乐文件播放的起始位置
* @param 起始位置
public void setMusicPosition(int position);
* 获取音乐文件当前的播放位置
* @return 当前播放位置
public int getMusicPosition();
* 将当前录制的片段与设置项存入草稿箱
* @param 草稿标签,不同草稿需要有不同的标签,否则保存时会覆盖相同标签的草稿
public boolean saveToDraftBox(String tag);
* 恢复草稿
* @param glSurfaceView 预览的 view
* @param draft 草稿对象
public boolean recoverFromDraft(GLSurfaceView glSurfaceView, PLDraft draft);
7.1.2 PLScreenRecorder
PLScreenRecorder 包含了屏幕录制所需要的接口,方法列表如下:
* 构造 PLScreenRecorder 对象
public PLScreenRecorder(Activity activity)
* 配置屏幕录制参数
* @param screenSetting
PLScreenRecorderSetting 对象
* @param microphoneSetting
PLMicrophoneSetting 对象
public boolean prepare(PLScreenRecorderSetting screenSetting,
PLMicrophoneSetting microphoneSetting);
* 1、申请屏幕录制权限
public void requestScreenRecord();
* 2、获取用户授权信息
public boolean onActivityResult(int requestCode, int resultCode, Intent data);
* 3、开始屏幕录制
public void start();
* 4、结束屏幕录制
public void stop();
* 注册录制状态监听器
* @param 监听器对象
public void setRecordStateListener(PLScreenRecordStateListener stateListener);
* 注册音频帧监听器
* @param 监听器对象
public void setAudioFrameListener(PLAudioFrameListener listener);
* 外部导入音频数据接口
* @param buffer
音频 PCM 数据
* @param tsInNanoTime
public void inputAudioFrame(byte[] buffer, long tsInNanoTime);
* 是否正在进行录制
public boolean isRecording();
7.1.3 PLShortVideoEditor
PLShortVideoEditor 包含了编辑短视频内容所需要的接口,方法列表如下:
* 构造 PLShortVideoEditor 对象
* @GLSurfaceView 用于预览视频的 View
* @setting 编辑配置
public PLShortVideoEditor(GLSurfaceView view, PLVideoEditSetting setting);
* 播放视频
public void startPlayback();
* 播放视频,并添加自定义滤镜效果
public void startPlayback(PLVideoFilterListener listener);
* 播放视频,并添加自定义滤镜效果,指定监听器中返回的纹理类型为 OES
public void startPlayback(PLVideoFilterListener listener, boolean callbackOES);
* 恢复播放
public void resumePlayback();
* 暂停播放
public void pausePlayback();
* 停止播放
public void stopPlayback();
* 跳到 msec 处播放
public void seekTo(int msec);
* 获取当前播放的时间
public int getCurrentPosition();
* 获取 SDK 自带的滤镜列表
* @return PLBuiltinFilter 数组
public PLBuiltinFilter[] getBuiltinFilterList();
* 应用 SDK 自带的滤镜
* @param 滤镜名,从 getBuiltinFilter 获取
public void setBuiltinFilter(String filterName);
* 应用 SD 卡中的滤镜
* @param 滤镜名,滤镜资源的绝对路径
public void setExternalFilter(String filterFilePath);
* 注册保存视频的监听器
* @param 监听器对象
public void setVideoSaveListener(PLVideoSaveListener listener);
* 注册预览视频播放状态的监听器
* @param 监听器对象
public void setVideoPlayerListener(PLVideoPlayerListener listener);
* 应用水印设置
* @param 水印设置变量
public void setWatermark(PLWatermarkSetting setting);
* 保存视频
public void save();
* 保存视频,并添加自定义滤镜效果
public void save(PLVideoFilterListener listener);
* 保存视频,并添加自定义滤镜效果,指定监听器中返回的纹理类型为 OES
public void save(PLVideoFilterListener listener, boolean callbackOES);
* 取消进行中的视频保存,会清理已生成的文件
public void cancelSave();
* 设置混音文件(本地音频文件)
* @param file 混音文件
public void setAudioMixFile(String file);
* 设置混音文件(assets 下的音频文件)
* @param afd 混音文件
public void setAudioMixAsset(AssetFileDescriptor afd);
* 设置混音起始和结束时间位置,单位为 Ms
* @param startTime 起始时间
* @param endTime 结束时间
public void setAudioMixFileRange(long startTime, long endTime);
* 设置原音(前景)和混音(背景)音量
* @param fgVolume 原音音量
* @param bgVolume 混音音量
public void setAudioMixVolume(float fgVolume, float bgVolume);
* 设置是否循环混音文件
* @param isLooping 是否循环
public void setAudioMixLooping(boolean isLooping);
* 原音消除
* @param isMute 是否消除原音
public void muteOriginAudio(boolean isMute);
* 增加文字特效
* @param textView 文字特效控件
public void addTextView(PLTextView textView);
* 删除文字特效
* @param textView 文字特效控件
public void removeTextView(PLTextView textView);
* 添加 MV 特效
* @param MV视频文件路径
* @param 蒙版文件路径
public void setMVEffect(String mvFilePath, String maskFilePath);
* 设置变速,只支持 2 的倍数,或 1/2 的倍数
* 例如:2x, 4x, 1/2x, 1/4x
* @param 倍数值
public void setSpeed(double speed);
* 添加涂鸦
* @param paintView 涂鸦控件
public void addPaintView(PLPaintView paintView){
mShortVideoEditorCore.addPaintView(paintView);
* 删除涂鸦
* @param paintView 涂鸦控件
public void removePaintView(PLPaintView paintView){
mShortVideoEditorCore.removePaintView(paintView);
* 添加贴图
* @param imageView 贴图控件
public void addImageView(PLImageView imageView){
mShortVideoEditorCore.addImageView(imageView);
* 删除贴图
* @param imageView 贴图控件
public void removeImageView(PLImageView imageView){
mShortVideoEditorCore.removeImageView(imageView);
7.1.4 PLShortVideoTrimmer
PLShortVideoTrimmer 包含了视频剪辑相关的接口
* 构造 PLShortVideoTrimmer 对象
* @param context 上下文对象
* @param srcFilePath 源视频文件路径
* @param dstFilePath 目标视频文件路径
public PLShortVideoTrimmer(Context context, String srcFilePath, String dstFilePath);
* 剪辑源视频中的 [beginMs-endMs] 部分
* @param beginMs 起始时间戳
* @param endMs 结束时间戳
* @param saveListener 剪辑结果监听器
* @note beginMs 和 endMs 可参考 从 getKeyFrame() 返回的 PLVideoFrame 中的时间戳
public void trim(long beginMs, long endMs, PLVideoSaveListener saveListener);
* 剪辑源视频中的 [beginMs-endMs] 部分
* @param beginMs 起始时间戳
* @param endMs 结束时间戳
* @param mode 剪辑模式,可设置为快速模式(TRIM_MODE.FAST)和精准模式 (TRIM_MODE.ACCURATE), 默认为精准模式
* @param saveListener 剪辑结果监听器
* @note beginMs 和 endMs 可参考 从 getKeyFrame() 返回的 PLVideoFrame 中的时间戳
public void trim(long beginMs, long endMs, TRIM_MODE mode, PLVideoSaveListener saveListener);
* 取消进行中的视频剪辑,会清理已生成的文件
public void cancelTrim();
* 获取源视频时长,单位为 Ms
* @return 源视频时长
* @deprecated 该方法已被 PLMediaFile 的 getDurationMs() 所取代
@Deprecated
public long getSrcDurationMs();
* 获取源视频的视频帧总数
* @param keyFrame 是否限定返回关键帧总数
* @return 源视频视频帧总数
* @deprecated 该方法已被 PLMediaFile 的 getVideoFrameCount(boolean keyFrame) 所取代
@Deprecated
public int getVideoFrameCount(boolean keyFrame);
* 获取源视频指定时间戳的视频帧
* @param timeMs 指定的时间戳
* @param keyFrame 是否限定返回关键帧
* @return 指定时间戳的视频帧
* @deprecated 该方法已被 PLMediaFile 的 getVideoFrameByTime(long timeMs, boolean keyFrame) 所取代
@Deprecated
public PLVideoFrame getVideoFrameByTime(long timeMs, boolean keyFrame);
* 获取源视频指定索引的视频帧
* @param index 指定的索引
* @param keyFrame 是否限定返回关键帧
* @return 指定索引的视频帧
* @deprecated 该方法已被 PLMediaFile 的 getVideoFrameByIndex(int index, boolean keyFrame) 所取代
@Deprecated
public PLVideoFrame getVideoFrameByIndex(int index, boolean keyFrame);
* 获取源视频指定时间戳的视频帧,并缩放裁剪到指定宽高。
* @param timeMs 指定的时间戳
* @param keyFrame 是否限定返回关键帧
* @param outputWidth 输出宽度
* @param outputHeight 输出宽度
* @return 指定时间戳的视频帧
* @deprecated 该方法已被 PLMediaFile 的 getVideoFrameByTime(long timeMs, boolean keyFrame, int outputWidth, int outputHeight) 所取代
@Deprecated
public PLVideoFrame getVideoFrameByTime(long timeMs, boolean keyFrame, int outputWidth, int outputHeight);
* 获取源视频指定索引的视频帧,并缩放裁剪到指定宽高。
* @param index 指定的索引
* @param keyFrame 是否限定返回关键帧
* @param outputWidth 输出宽度
* @param outputHeight 输出宽度
* @return 指定索引的视频帧
* @deprecated 该方法已被 PLMediaFile 的 getVideoFrameByIndex(int index, boolean keyFrame, int outputWidth, int outputHeight) 所取代
@Deprecated
public PLVideoFrame getVideoFrameByIndex(int index, boolean keyFrame, int outputWidth, int outputHeight);
* 在使用完毕后,请调用该方法销毁资源
public void destroy();
7.1.5 PLShortVideoTranscoder
PLShortVideoTranscoder 包含了视频转码相关的接口,转码后的视频文件都将不带旋转信息
* 构造 PLShortVideoTranscoder 对象
* @param context 上下文
* @param srcFilePath 源视频文件路径
* @param dstFilePath 目标视频文件路径
public PLShortVideoTranscoder(Context context, String srcFilePath, String dstFilePath);
* 转码到指定的宽度,高度,码率
* @param dstWidth 目标宽度
* @param dstHeight 目标高度
* @param dstBitrate 目标码率
* @param saveListener 转码结果监听器
* @return 是否开始成功
public boolean transcode(int dstWidth, int dstHeight, int dstBitrate, PLVideoSaveListener saveListener);
* 转码到指定的宽度,高度,码率
* @param dstWidth 目标宽度
* @param dstHeight 目标高度
* @param dstBitrate 目标码率
* @param reverse 是否进行时光倒流(视频倒置)
* @param saveListener 转码结果监听器
* @return 是否开始成功
public boolean transcode(int dstWidth, int dstHeight, int dstBitrate, boolean reverse, PLVideoSaveListener saveListener);
* 转码到指定的宽度,高度,码率
* @param dstWidth 目标宽度
* @param dstHeight 目标高度
* @param dstBitrate 目标码率
* @param rotateBy 在源视频的基础上旋转某些角度, 可设置为 0, (-)90, (-)180, (-)270
* @param reverse 是否进行时光倒流(视频倒置)
* @param saveListener 转码结果监听器
* @return 是否开始成功
public boolean transcode(int dstWidth, int dstHeight, int dstBitrate, int rotateBy, boolean reverse, PLVideoSaveListener saveListener);
* 取消进行中的视频转码,会清理已生成的文件
public void cancelTranscode();
* 获取源视频时长,单位为 Ms
* @return 源视频时长
* @deprecated 该方法已被 PLMediaFile 的 getDurationMs() 所取代
@Deprecated
public long getSrcDurationMs();
* 获取源视频宽度
* @return 源视频宽度
* @deprecated 该方法已被 PLMediaFile 的 getVideoWidth() 所取代
@Deprecated
public int getSrcWidth();
* 获取源视频高度
* @return 源视频高度
* @deprecated 该方法已被 PLMediaFile 的 getVideoHeight() 所取代
@Deprecated
public int getSrcHeight();
* 获取源视频码率
* @return 源视频码率
* @deprecated 该方法已被 PLMediaFile 的 getVideoBitrate() 所取代
@Deprecated
public int getSrcBitrate();
7.1.6 PLShortVideoUploader
PLShortVideoUploader 包含了视频上传的接口,方法列表如下:
* 构造 PLShortVideoUploader 对象
* @param context Android 上下文对象
* @param uploadSetting 上传配置
public PLShortVideoUploader(Context context, PLUploadSetting uploadSetting)
* 开始上传 默认返回文件的哈希值作为 key
* @filePath 上传的文件路径
* @token 上传的鉴权信息
public void startUpload(String filePath, String token)
* @filepath 即将上传的文件的路径
* @key 指定上传后的 key 值
* @token 上传的凭证,客户端在上传前,需要先从服务端获取上传凭证
public void startUpload(String filePath, String key, String token)
* 取消上传
public void cancelUpload()
* 注册上传结果的监听器
* @param 监听器对象
public void setUploadResultListener(PLUploadResultListener listener)
* 注册上传进度的监听器
* @param 监听器对象
public void setUploadProgressListener(PLUploadProgressListener listener)
7.1.7 PLShortVideoComposer
PLShortVideoComposer 包含了视频组合的接口,方法列表如下:
* 将一系列图像转换为 gif
* @param frames 图像的 bitmap 数据列表
* @param delayTimeMs gif 里每张图显示的时间
* @param isLoop gif 是否循环播放
* @param outputPath 保存路径
* @param listener 监听器对象
public void composeToGIF(List&Bitmap& frames, int delayTimeMs, boolean isLoop, String outputPath, PLVideoSaveListener listener);
* 取消进行中的 gif 合成任务
public void cancelComposeToGIF();
* 顺序拼接多个 mp4 视频文件
* @param srcVideos
源视频文件列表
* @param dstVideoPath 输出的视频文件路径
* @param setting
输出的视频文件编码参数
* @param listener
监听器对象
* @return 是否开始成功
public boolean composeVideos(List&String& srcVideos, String dstVideoPath, PLVideoEncodeSetting setting, PLVideoSaveListener listener);
* 取消进行中的视频拼接
public void cancelComposeVideos();
* 合成多张图片为 mp4 视频文件
* @param items
图片的配置列表
* @param dstVideoPath 输出的视频文件路径
* @param setting
输出的视频文件编码参数
* @param listener
监听器对象
* @return 是否开始成功
public boolean composeImages(List&PLComposeItem& items, String dstVideoPath, PLVideoEncodeSetting setting, PLVideoSaveListener listener);
* 把多张图片和一个音频文件合成为一个 mp4 视频文件
* @param items
图片的配置列表
* @param srcAudioPath 输入的音频文件路径
* @param isAudioLoop
是否循环背景音乐
* @param dstVideoPath 输出的视频文件路径
* @param setting
输出的视频文件编码参数
* @param listener
监听器对象
* @return 是否开始成功
public boolean composeImages(List&PLComposeItem& items, String srcAudioPath, boolean isAudioLoop, String dstVideoPath, PLVideoEncodeSetting setting, PLVideoSaveListener listener);
* 把多张图片和一个音频文件合成为一个 mp4 视频文件,并指定图片展示模式
* @param items
图片的配置列表
* @param srcAudioPath 输入的音频文件路径
* @param isAudioLoop
是否循环背景音乐
* @param dstVideoPath 输出的视频文件路径
* @param displayMode
图片的展示模式,可为 FIT 或 FULL
* @param setting
输出的视频文件编码参数
* @param listener
监听器对象
* @return 是否开始成功
public boolean composeImages(List&PLComposeItem& items, String srcAudioPath, boolean isAudioLoop, String dstVideoPath, PLDisplayMode displayMode, PLVideoEncodeSetting setting, PLVideoSaveListener listener);
* 取消进行中的图片合成
public void cancelComposeImages();
7.1.8 PLShortAudioRecorder
PLShortAudioRecorder 包含了录制纯音频所需要的接口,方法列表如下:
* 构造 PLShortAudioRecorder 对象
public PLShortAudioRecorder();
* 使 PLShortAudioRecorder 暂停工作,通常在 Activity#onPause 中调用
public pause();
* 使 PLShortAudioRecorder 恢复工作,通常在 Activity#onResume 中调用
public resume();
* 销毁 PLShortAudioRecorder 对象,通常在 Activity#onDestroy 中调用
* 将删除已录制的片段
public destory();
* 销毁 PLShortAudioRecorder 对象,通常在 Activity#onDestroy 中调用
* @param clearSections 是否删除已录制的片段
public destory(boolean clearSections);
* Prepare the recorder
* @param context
Context 对象
* @param microphoneSetting
PLMicrophoneSetting 对象
* @param audioEncodeSetting PLAudioEncodeSetting 对象
* @param recordSetting
PLRecordSetting 对象
public void prepare(Context context,
PLMicrophoneSetting microphoneSetting,
PLAudioEncodeSetting audioEncodeSetting,
PLRecordSetting recordSetting);
* 开始录制音频片段,需要收到 `onReady` 回调之后执行
public boolean beginSection();
* 开始录制音频片段,需要收到 `onReady` 回调之后执行
* @param 指定片段文件名
public boolean beginSection(String sectionFileName);
* 停止录制当前音频片段
public boolean endSection();
* 删除上一个录制的音频片段
public boolean deleteLastSection();
* 删除所有录制的音频片段
public boolean deleteAllSections();
* 合并录制的音频片段,SDK 将会在缓存目录中临时创建对应文件
用于接收合并回调的 listener
public void concatSections(PLVideoSaveListener listener);
* 取消进行中的音频片段合并,会清理已生成的文件
public void cancelConcat();
* 注册音频帧监听器
* @param 监听器对象
public final void setAudioFrameListener(PLAudioFrameListener listener);
* 注册录制状态监听器
* @param 监听器对象
public final void setRecordStateListener(PLRecordStateListener listener);
* 将当前录制的片段与设置项存入草稿箱
* @param 草稿标签,不同草稿需要有不同的标签,否则保存时会覆盖相同标签的草稿
public boolean saveToDraftBox(String tag) {
return mShortAudioRecorderCore.saveToDraftBox(tag);
* 从草稿恢复
* @param context context 对象
* @param draft 草稿对象
public boolean recoverFromDraft(Context context, PLDraft draft);
7.1.9 PLTransitionMaker
PLTransitionMaker 包含了制作过场字幕所需要的接口,方法列表如下:
* 构造 PLTransitionMaker 对象
* @param viewGroup ViewGroup 对象
* @param setting
PLVideoEncodeSetting 对象
public PLTransitionMaker(ViewGroup viewGroup, PLVideoEncodeSetting setting);
* 设置过场字幕的背景颜色
* @param color 背景颜色
public setBackgroundColor(int color);
* 设置过场字幕的持续时间
* @param durationMs 持续时间
public void setDuration(int durationMs);
* 添加文字控件
* @param textView 文字控件
public void addText(PLTextView textView);
* 添加图片控件
* @param imageView 图片控件
public addImage(PLImageView imageView);
* 在文字控件上添加一个过场动画
* @param textView
* @param transition 所添加的过场动画
public void addTransition(PLTextView textView, PLTransition transition);
* 在图片控件上添加一个过场动画
* @param imageView
* @param transition 所添加的过场动画
public void addTransition(PLImageView imageView, PLTransition transition);
* 播放过场动画
public void play();
* 停止播放动画
public void stop();
* 保存过场字幕为 mp4
* @param dstFilePath
目标视频文件路径
* @param saveListener 保存结果监听器
public void save(String dstFilePath, PLVideoSaveListener saveListener);
* 取消保存
public void cancelSave()
* 删除所有已添加的控件和过场动画
public void removeAllResource();
* 在使用完毕后,请调用该方法销毁资源
public void destroy();
7.2 参数配置
7.2.1 PLCameraSetting
PLCameraSetting 类用于配置摄像头采集的相关参数,包含以下方法:
* 设置采集摄像头
* @param 默认设置为手机的后置摄像头
public PLCameraSetting setCameraId(PLCameraSetting.CAMERA_FACING_ID cameraId);
* 设置采集画面的分辨率
* @param 可以选择从 120P 到 1200P 之间的多种分辨率。默认设置为 480P
public PLCameraSetting setCameraPreviewSizeLevel(PLCameraSetting.CAMERA_PREVIEW_SIZE_LEVEL level);
* 设置采集画面的长宽比
* @param 可以选择 4:3 或 16:9。默认设置为 16:9
public PLCameraSetting setCameraPreviewSizeRatio(PLCameraSetting.CAMERA_PREVIEW_SIZE_RATIO ratio);
7.2.2 PLScreenRecorderSetting
PLScreenRecorderSetting 类用于配置屏幕采集的相关参数,包含以下方法:
* 设置屏幕录制尺寸
public PLScreenRecorderSetting setSize(int width, int height);
* 设置 DPI
public PLScreenRecorderSetting setDpi(int dpi);
* 设置屏幕录制文件保存位置
* @param recordFile
public PLScreenRecorderSetting setRecordFile(String recordFile);
* 设置是否由外部导入音频
* @param inputAudioEnabled
public PLScreenRecorderSetting setInputAudioEnabled(boolean inputAudioEnabled);
* 设置编码码率
* @param 码率,单位为 bps,默认为 4000 * 1024
public PLScreenRecorderSetting setEncodingBitrate(int bitrate);
7.2.3 PLMicrophoneSetting
PLMicrophoneSetting 类用于配置麦克风采集的相关参数,包含以下方法:
* 设置音频采集源
* @param 默认为系统的 MediaRecorder.AudioSource.MIC,可时情况进行修改
public PLMicrophoneSetting setAudioSource(int source);
* 设置音频格式
* @param 默认为系统的 AudioFormat.ENCODING_PCM_16BIT,其他格式可能不兼容部分设备,请视情况使用
public PLMicrophoneSetting setAudioFormat(int format);
* 设置音频声道
* @param 默认为系统的 AudioFormat.CHANNEL_IN_MONO,其他格式如 AudioFormat.CHANNEL_IN_STEREO 可能不兼容部分设备,请视情况使用
public PLMicrophoneSetting setChannelConfig(int channelConfig);
* 设置音频采样率
* @param 采样率, 默认为 44100,其他设置可能不兼容部分设备,请视情况使用
public PLMicrophoneSetting setSampleRate(int rate);
* 开启音频 PTS 优化,有助于降低音画不同步概率,略微消耗计算资源
* @param 是否开启。默认开启
public PLMicrophoneSetting setAudioPtsOptimizeEnabled(boolean enable);
* 设置是否开启蓝牙 SCO,如果使用蓝牙耳机采集音频
* @param 是否开启。默认关闭
public PLMicrophoneSetting setBluetoothSCOEnabled(boolean enable);
7.2.4 PLVideoEncodeSetting
PLVideoEncodeSetting 类用于配制视频编码的相关参数,包含以下方法:
* 设置编码码率
* @param 码率,单位为 bps,默认为 1000 * 1000
public PLVideoEncodeSetting setEncodingBitrate(int bitrate);
* 设置码率模式
* @param 可选择 QUALITY_PRIORITY 或 BITRATE_PRIORITY
* @param 在一些情况下 SDK 会分别保证画质而临时提高码率,或保证码率稳定临时降低画质
* @param 默认设置为 `QUALITY_PRIORITY`
public PLVideoEncodeSetting setEncodingBitrateMode(PLVideoEncodeSetting.BitrateMode mode);
* 设置编码 fps
* @param fps 值,默认设置为 30
public PLVideoEncodeSetting setEncodingFps(int fps);
* 设置编码视频的分辨率
* @param 可以选择从 240P 到 1200P 之间的多种分辨率,默认设置为 480 * 480
public PLVideoEncodeSetting setEncodingSizeLevel(PLVideoEncodeSetting.VIDEO_ENCODING_SIZE_LEVEL level);
* 如果 SDK 内置的分辨率列表不能满足需求,可以通过此方法自定义编码视频的分辨率
* @param width 宽度
* @param height 高度
public PLVideoEncodeSetting setPreferedEncodingSize(int width, int height);
* 设置编码视频关键帧的间隔
* @param 单位为帧数,默认设置为 30 帧
public PLVideoEncodeSetting setIFrameInterval(int interval);
* 设置 H.264 编码方式
* @param 是否开启 H.264 硬编 - true:硬编 false:软编
public PLVideoEncodeSetting setHWCodecEnabled(boolean enabled)
7.2.5 PLAudioEncodeSetting
PLAudioEncodeSetting 类用于配制音频编码的相关参数,包含以下方法:
* 设置编码码率
* @param 码率,单位为 bps,默认为 44100
public PLAudioEncodeSetting setBitrate(int bitrate);
* 设置音频声道数量
* @param 声道数量,目前只支持 1 (默认) 和 2,分别对应 PLMicrophoneSetting 声道设置的 AudioFormat.CHANNEL_IN_MONO 与 AudioFormat.CHANNEL_IN_STEREO
public PLAudioEncodeSetting setChannels(int channels);
* 设置音频采样率
* @param 采样率, 默认为 44100,需要与采集时的设置保持一致
public PLAudioEncodeSetting setSampleRate(int sampleRate);
* 设置 AAC 编码方式
* @param 是否开启 AAC 硬编 - true:硬编 false:软编
public PLAudioEncodeSetting setHWCodecEnabled(boolean enabled)
7.2.6 PLFaceBeautySetting
PLFaceBeautySetting 类用于配制美颜相关参数,包含以下方法:
* 构造 PLFaceBeautySetting 对象
* @param beauty 美颜程度,0-1 递增
* @param whiten 美白程度,0-1 递增
* @param redden 红润程度,0-1 递增
public PLAudioEncodeSetting(float beauty, float whiten, float redden);
* 设置是否开启美颜
* @param 是否开启。默认开启
public void setEnable(boolean enable);
* 设置美颜程度
* @param 0-1 递增
public void setBeautyLevel(float level);
* 设置美白程度
* @param 0-1 递增
public void setWhiten(float level);
* 设置红润程度
* @param 0-1 递增
public void setRedden(float level);
7.2.7 PLRecordSetting
PLRecordSetting 类用于配制录制相关参数,包含以下方法:
* 设置最大录制长度
* @param 最大录制长度,单位 ms,默认 10*1000
public PLRecordSetting setMaxRecordDuration(int duration);
* 设置视频缓存目录
* @param 缓存目录
public PLRecordSetting setVideoCacheDir(File dir);
public PLRecordSetting setVideoCacheDir(String dir);
* 设置录制的视频文件全路径,默认从缓冲目录随机生成
* @param 视频文件全路径
public PLRecordSetting setVideoFilepath(String filepath);
* 设置录制时 Camera preview 在 GLSurfaceView 和编码中的显示模式
* @param 显示模式,可为 FIT 或 FULL
public PLRecordSetting setDisplayMode(PLDisplayMode displayMode);
7.2.8 PLVideoEditSetting
PLVideoEditSetting 对象用语配置视频编辑的相关参数,方法如下:
* 设置是否循环播放
* @param 是否循环播放
public PLVideoEditSetting setPlaybackLooping(boolean looping);
* 设置编辑保存后是否保留原始文件
* @param 是否保留原始文件
public PLVideoEditSetting setKeepOriginFile(boolean keepOriginFile);
* 设置需要编辑的视频文件地址
* @param 原视频文件地址
public PLVideoEditSetting setSourceFilepath(String filepath);
* 设置 `save` 保存视频地址
* @param 保存视频地址
public PLVideoEditSetting setDestFilepath(String filepath);
* 设置播放视频的显示模式
* @param 显示模式,可为 FIT 或 FULL
public PLVideoEditSetting setDisplayMode(PLDisplayMode displayMode);
7.2.9 PLWatermarkSetting
PLWatermarkSetting 对象用于配制视频水印的相关参数,方法如下:
* 设置水印素材 ID
* @param resource id
public void setResourceId(int resourceId);
* 设置水印位置
* @param x 水印左上角在视频 x 轴上的位置,0-1
* @param y 水印左上角在视频 y 轴上的位置,0-1
public void setPosition(float x, float y);
* 设置水印透明度
* @param alpha, 0-255
public void setAlpha(int alpha);
7.2.10 PLUploadSetting
PLUploadSetting 对象用于配置上传相关的参数,方法如下:
* 设置分片上传时,每片的大小,默认 2M
* @param chunkSize
public PLUploadSetting setChunkSize(int chunkSize)
* 设置启用分片上传阈值,默认 4M
* @param putThreshhold
public PLUploadSetting setPutThreshhold(int putThreshhold)
* 设置链接超时时间,默认10秒
* @param connectTimeout
public PLUploadSetting setConnectTimeout(int connectTimeout)
* 设置服务器相应超时时间,默认60秒
* @param responseTimeout
public PLUploadSetting setResponseTimeout(int responseTimeout)
* 设置区域,指定不同区域的上传域名、备用域名、备用IP
* @param zone
public PLUploadSetting setZone(PLUploadZone zone)
* 是否启用 https 上传,默认不启用
* @param enabled
public PLUploadSetting setHttpsEnabled(boolean enabled)
* 配置上传自定义变量
* @param params
public PLUploadSetting setParams(Map&String, String& params)
7.3 监听器
7.3.1 PLCameraPreviewListener
该接口用于回调相机预览相关的

我要回帖

更多关于 mp4格式放不了 的文章

 

随机推荐