Vitamio

时间:2024-03-10 17:01:42

一,Vitamio 是什么?

Vitamio 是一款 Android 与 iOS 平台上的全能多媒体开发框架,全面支持硬件解码与 GPU 渲染。Vitamio 凭借其简洁易用的 API 接口赢得了全球众多开发者的青睐。到目前,全球已经有超过 一万 种应用在使用 Vitamio,覆盖用户超过 5亿 。

Vitamio 能够流畅播放720P甚至1080P高清MKV,FLV,MP4,MOV,TS,RMVB等常见格式的视频,还可以在 Android 与 iOS 上跨平台支持 MMS, RTSP, RTMP, HLS(m3u8) 等常见的多种视频流媒体协议,包括点播与直播。

流媒体支持 

Vitamio 支持各种常见的流媒体协议,可以点播或者直播音频和视频,例如如下常见协议均能无缝支持:

  • MMS
  • RTSP (RTP, SDP), RTMP
  • HTTP progressive streaming
  • HLS - HTTP live streaming (M3U8)

音频和视频格式 

Vitamio 使用了 FFmpeg 做为媒体解析器和最主要的解码器,同时开发了针对不同移动平台的硬解码方案,能够完美支持 H.264/AVC、H.263、 MPEG4 等常见的视频编码,覆盖上百种多媒体格式。下表只是一些最常见的视频格式支持,除特殊标明,全部支持硬件加速:

  • DivX/Xvid
  • WMV (一般只有软解码)
  • FLV
  • TS/TP
  • RMVB (只有软解码)
  • MKV
  • MOV
  • M4V
  • AVI
  • MP4
  • 3GP

字幕支持 

Vitamio 对字幕的支持很优秀,包括各种常见外挂字幕与很多视频格式的内嵌字幕,同多个字幕等特性的支持也非常完善。比如:

  • SubRip(.srt)
  • Sub Station Alpha(.ssa) / Advanced Sub Station Alpha(.ass)
  • SAMI(.smi/.sami)
  • MicroDVD(.sub/.txt)
  • SubViewer2.0(.sub)
  • MPL2(.mpl/.txt)
  • Matroska (.mkv) 内置字幕

更多特性 

除了上面列出的常见功能之外,Vitamio 还做了相当多人性化的工作:

  • 多音轨与字幕支持
  • 细致的 CPU 与 GPU 优化
  • 支持手机到平板各种设备
  • 流媒体播放缓冲支持
  • 播放画面比例大小随手调节
  • 自动文字编码检测,拒绝乱码

还有更多新特性没有被列出,请参考开发文档。

二,Vitamio 新手入门

Vitamio项目发展迅猛,官方群突破800位开发者,基于Vitamio的项目突破1000个,使用Vitamio提供优质播放体验的用户超过1亿。也欢迎大家分享你的Vitamio使用经验,本文将进一步介绍Vitamio的简单使用方法。

下载 

目前Vitamio的项目托管在Github上面:https://github.com/yixia/VitamioBundle
提示:Github支持Git、SVN和直接下载(右侧Download Zip)。

简介 

Vitamio的中文名称为“维他蜜”
Vitamio 是一款 Android 平台上的全能多媒体开发框架。Vitamio 凭借其简洁易用的 API 接口赢得了全球众多开发者的青睐。到目前,全球已经有超过 1000 种应用在使用 Vitamio,覆盖用户超过 2亿。

Vitamio 能够流畅播放720P甚至1080P高清MKV,FLV,MP4,MOV,TS,RMVB等常见格式的视频,还可以在 Android 上支持 MMS, RTSP, RTMP, HLS(m3u8) 等常见的多种视频流媒体协议,包括点播与直播。
支持 ARMv6 和 ARMv7 两种 ARM CPU,同时对 VFP, VFPv3, NEON 等指令集都做相应优化。

支持 Android 2.1+ 系统,支持超过 95% 的 Android 市场。同时 Android 2.1 之前的系统也基本支持,不过没做详细测试。

更多Vitamio的介绍参照这里。

导入使用 

1、导入。下载回来后大家可能发现没有.project工程文件,可以通过File -> Import -> Android -> Existing Android Code Into Workspace来导入工程,然后改一下工程名称即可。

2、将VitamioBundle工程作为Android Library引入Demo工程使用即可。

注意:
     如果是Windows用户,请将VitamioBundle与Demo工程放在同一个文件夹下,否则添加Android Library可能失败,其他问题一般clean一下重新编译一下就好了。其他问题请参考错误大全。

关注Vitamio 

官方微博:http://weibo.com/vitamio

官方网站/论坛:vitamio.org

Vitamio QQ 3群:283274315

其他 

1、官方建议以Android Library方式使用Vitamio插件,以便后续方便升级。

2、 Vitamio最新版本为4.2.1,极力推荐使用新版本。

3、 基于Vitamio仅支持ARMv6+以上的CPU,95%以上的视频格式支持,说明:

a). 无法播放的问题。使用VPlayer来测试链接,如果VPlayer没有问题那Vitamio肯定也没有问题。

b). 各种找不到so文件的情况只有两种情况:不支持设备、没有执行解压解码包。

4、Vitamio最终所有权为炫一下(北京)科技有限公司。

三,Vitamio测试网络视频地址

Vitamio支持多种流媒体格式,以下是一些视频地址片段案例,提供给大家测试使用:

HLS - Apple HTTP live streaming - m3u8 

http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8
http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8
http://live.3gv.ifeng.com/zixun.m3u8 (直播)
 

HTTP 

http://www.modrails.com/videos/passenger_nginx.mov
http://wsmp32.bbc.co.uk/

RTSP 

http://m.livestream.com (site)
rtsp://xgrammyawardsx.is.livestream-api.com/livestreamiphone/grammyawards

MMS 

mms://video.fjtv.net/setv
mms://ting.mop.com/mopradio
mms://112.230.192.196/zb12

四,Vitamio 错误大全

Vitamio无法使用的错误 

Error loading libs
java.lang.UnsatisfiedLinkError: Library …  libstlport_shared.so not found

java.lang.UnsatisfiedLinkError: Couldn\'t load vinit: findLibrary returned null 

java.lang.UnsatisfiedLinkError: unloadOMX_native

Native libs libffmpeg.so not exists!

凡是此类错误,一般只有以下几种情况:
1、Vitamio只支持ARMv6+以上的CPU,如果报以上错误,说明不支持你的机器。(注意:模拟器要使用4.0以上)
2、没有调用检测解码包的代码(即没有解压解码包,Vitamio会根据当前CPU的类型自动解压相应平台的库),使用方法参照DEMO:

// ~~~ 检测Vitamio是否解压解码包
if (!LibsChecker.checkVitamioLibs(this))
    return;

3、没有以Library的方式使用Vitamio,漏拷贝了VitamioBundle里面的类库或代码,例如libvinit.so、libarm.so等。
4、如果您有自己的so,请参考Vitamio的libs文件夹(armeabi、armeabi-v7a、x86)将so拷贝、新建相应的文件夹。
5、如果您是从旧版本Vitamio升级过来,尤其是早期以集成方式使用的,而现在又以Library方式使用,请删除相关的类和文件(res/raw/libarm.so、libs下面的libvinit.so、io.vov.vitamio下面相应的类文件),最后改一下当前项目的versionCode(Vitamio根据当前项目的版本自动重新解压升级)。最后可以尝试卸载之前的app重新安装。强烈建议下载最新版本,先跑通官网例子,没有问题再自己集成,最后搞不定还可以直接在官网例子上修改。
6、极少数几款设备,比如华为S8600、三星GT-S5830(CPU是ARMv6+,但是无法使用)

视频无法播放的错误 

avformat_open_input: I/O error

1、确保视频没有问题。先拿VLC、系统自带的播放器或者PC上的播放器,测试一下链接,确保视频是可以播放的。
2、确保调用方法没有问题。参考官方的例子,先用官网例子测试一个可以播放的链接,然后再不改动其他的代码情况下仅更改播放地址进行测试。
3、确保测试环境一致。比如拿能上网的PC测试完后拿无法上网的手机测试,那肯定不行。
4、前面都确保没有问题后最后使用VPlayer来进行测试,如果VPlayer能够播放,那Vitamio一定能播放,否则只有一种情况:不支持!

java.io.FileNotFoundException: No content provider 

这个不是错误,是正常的处理。现在播放视频是这样做的:先把 URL 当做一个 ContentProvider 来打开,如果打不开,就直接当做 URL 来打开

java.lang.SecurityException:Not allowed to bind to service Intent … VitamioService 

如果手机上安装了VPlayer并且使用了旧版本(3.0以前)的Vitamio,可能会报这个错,可以简单理解为冲突,所以后续VitamioService这个类在3.0以后就没有了,还有相关的MediaScannerService也没有了。

java.lang.NoClassDefFoundError: io.vov.vitamio.R$raw 

Vitamio 3.0默认以Android Library的方式使用,对raw的引用使用的io.vov.vitamio.R,如果不是以这种方式使用比如简单的拷贝合并就报这个错。建议以Android Library方式使用,便于后续升级。如果仍然坚持要拷贝合并,可以通过在本工程新建包名io.vov.vitamio,新建R类来实现:

package io.vov.vitamio;

public class R {
    public static final class raw {
        public static final int libarm = com.nmbb.oplayer.R.raw.libarm;
        public static final int pub = com.nmbb.oplayer.R.raw.pub;
    }
}


Fatal signal 11 (SIGSEGV) at 0xb77ea280 (code=1), thread 1243 (ov.vitamio.demo)

类似Fatal signal崩溃的问题,一般是MediaPlayer的生命周期没有使用正确。比如还没有prepare就去调用isPlaying等其他方法都会导致这个问题,使用系统的MediaPlayer也会抛出IllegalStateException的异常。建议去Android官网看文档:http://developer.android.com/reference/android/media/MediaPlayer.html。尤其是MediaPlayer的状态图。

五,Vitamio产品大全

 酷6视频

酷6视频 Ku6Video 是酷6网竭力打造的手机视频客户端。酷6网作为国内最大的短视频网站,其客户端覆盖了资讯、娱乐、搞笑、拍客、时尚等多个频道的海量视频资源,集播放、下载、上传、分享等全新功能,让手机受众尽享视频饕鬄盛宴


 CNTV

CNTV中国网络电视台为中国网络电视台官方推出的安卓客户端。 汇聚CCTV和CNTV精彩资源,提供最全面最丰富的中国电视直播、点播服务,全天24小时滚动更新。 精品资讯细分:国家大事、社会热点新闻,一览无余 实时直播频道:王牌电视节目,随时随地看直播 精彩专题推荐:新闻、时政、经济、人文和热播影视剧在内的新闻热点聚焦 赶紧下载玩转2013年指尖上的春晚,CNTV中国网络电视……


 视讯中国

是一款装机必备的免费高清电影软件。海量收录新片,爱情,动作,动漫,惊悚,喜剧等元素的高清电影,随心所欲的在线观看和下载。专为Android手机订制的视频娱乐客户端产品,为用户提供能了流畅便捷的客户端视频播放体验。


 321影音

321影音是android手机上功能最多、性能最好的多媒体播放软件,集视频播放、音频播放、电视直播、广播电台于一身,支持几乎所有流行的视频、音频格式,它将让您的android手机变成您的掌上享乐中心!


 厦门音乐广播

厦门音乐广播伴随着新世纪的到来,厦门人民广播电台加速发展,目前已形成了智能化控制管理的高速宽带多媒体信息网络,技术装备水平在全国城市电台中位居前列,电波覆盖范围包括厦门、泉州、龙海、南安、晋江、石狮以及金门等地区,覆盖人口达六百多万,收听人数、收听率节节上升。


 听世界

听世界,是一款专业的有声作品播放器,免费提供各类精彩的有声小说、广播剧、相声评书、声音故事、有声教材、幽默笑话等内容,解放您的双眼,让您爱上听的感觉!


 酷云TV

酷云TV是北京十分科技有限公司出品的一款电视互动产品,它可以使电视节目变得更加有趣。


  FPlayer

Questo è un lettore video usato principalmente da TVItaliane.
Cerca AllMyTv peravere la tv nel tuo smartphone!
TV Italiane.
FPlayer non contiene pubblicità in modalità push e non ne conterrà mai.

 TVGOO Live Tv

You can watch free online tv channels all over the world with tvgoo application. Updating countries and channels automaticaly.
Tags: online tv, live tv, tv list, free, watch, stream, mobile tv
Available Countries: turkey, france, germany, russia, greece, italia, italy, spain, ukraine, brazil, azerbaijan, albania, armenia, egypt, estonia, bulgaria, finland, uk, usa, belgium, india, netherlands, egypt, hungary, japan, china, macedonia, kosovo, norway, romania, usa

 酷狗音乐

酷狗音乐手机版是最受欢迎的音乐播放器,有强大的音乐搜索和高速下载功能、 全球最全音乐曲库,最专业的音频解码核心技术,完美实现各种音频格式的高保真播放。


 天天动听

天天动听手机版是一款功能强大、完全免费的手机音乐播放软件,[3]支持歌词和歌曲图片下载,皮肤随心更换,更有炫丽震撼的可视化效果,同时预置丰富的均衡器效果,支持音效增强,简洁人性化的操作,给追求音乐品质的呢带来了手机听歌的全新体验。数据表明,天天动听已经成为拇指一族必备的音乐播放工具!

六,Vitamio不支持特性列表
这里列举目前Vitamio不支持或支持不够好的功能:
  • 1. 不支持ARMv6以下的CPU(支持ARMv6+,大部分无法播放的问题均是此问题,注意模拟器请使用4.0以上版本)
  • 2. 不支持加密(例如DRM)视频、嵌套的m3u8(如果m3u8中有无法播放的干扰链接也会停止而不会跳过)( Vitamio4.2.0已经解决)
  • 3. 不支持获取Audio SessionId对象
  • 4. 不支持视频缩略图截图(但支持对正在播放的视频截图,函数名:getCurrentFrame)
  • 5. 不支持setSurface方法(Vitamio 4.2.1已经解决)
  • 6. 设置字幕(subPath)必须是本地的字幕文件
  • 7. 有些机型硬解码不够成熟,建议让用户手动切换软解/硬解(VPlayer,MX player等主流播放器也是这样处理的)。
  • 8. 不支持华为S8600等少数几款机型,具体表现为无法解压解码包(一直停留在解压界面)。
  • 9. 不支持Logcat信息输出屏蔽(so里面输出的,但应用层可以屏蔽掉)
  • 10. 不支持自定义网络协议(你们需要修改我们公开的 FFmpeg 代码,在其中添加相应的 libavformat 模块就可以了,与加密和内存中数据处理是一样的或者通过代理来转换协议
  • 11. 目前不支持两个视频同时播放
  • 12. 如果mp3包含了1帧视频(比如mp3专辑图片),此mp3将当成视频处理,播完这一帧就会马上结束。(Vitamio会先检测是否包含视频,如果包含视频(大于0帧)即当视频处理,否则当音频处理)。(Vitamio 4.2.1已解决)
  • 13.由于Youku的m3u8不标准,导致Vitamio对Youku视频支持不好,具体表现为拖拽进度条无效、突然中断。在Vitamio 4.0中已经解决)
  • 14. rmvb不支持硬解,2.1以下的也不支持硬解(硬件限制)
  • 15. hls 不支持可变码率(在Vitamio 4.0中已经解决)
  • 16. 不支持swf,但支持flv(建议安装Adobe,然后用WebView播放)

七,Vitamio FAQ

Vitamio名字的由来 

Vitamio的中文名称为“维他蜜”。
Vitamio 来源于英文单词Vitamin(维他命),希望Vitamio对于安卓多媒体开发者的重要性,就像Vitmain之于人体一样不可缺少。

Vitamio与VPlayer什么关系? 

Vitamio基于VPlayer开发,所以VPlayer能播放的Vitamio也能。

Vitamio支持哪些指令集的CPU? 

支持 ARMv6 和 ARMv7 两种 ARM CPU,同时对 VFP, VFPv3, NEON 等指令集都做相应优化。

Vitamio支持的Android版本 

支持 Android 2.1+ 系统,支持超过 95% 的 Android 市场。同时 Android 2.1 之前的系统也基本支持,不过没做详细测试。

E/Vitamio(1557): java.io.FileNotFoundException: No content provider 

这个不是错误,是正常的处理。现在播放视频是这样做的:先把 URL 当做一个 ContentProvider 来打开,如果打不开,就直接当做 URL 来打开。

为什么会弹出提示框要求安装Vitamio Plugin? 

因为你下载和使用的是较早的Vitamio版本!

视频/视频流(rtp、rtsp等)播放不了的问题! 

可能存在以下几种情况:

  • 视频本身就存在问题,你可以用其他播放器播放一下,是否能正常播放。
  • 本地网速不给力/设备本身配置过低。
  • 视频源卡,本身带宽不够,直接访问也很慢。
  • 嵌套了m3u8地址
  • 视频被加密了

建议先使用VPlayer和其他播放器来测试视频,确保排除外在因素。

如何调用VPlayer来播放视频? 

1
2
3
4
5
6
7
8
private void startPlayer(String url, String title) {
    Intent i = new Intent();
    i.setComponent(new ComponentName("me.abitno.vplayer.t", "me.abitno.vplayer.VideoActivity"));
    i.setAction("me.abitno.vplayer.action.VIEW");
    i.setData(Uri.parse(url));
    i.putExtra("displayName", title);
    startActivity(i);
}

 

在混淆时如何忽略Vitamio相关类库的混淆? 

1
2
-keep class io.vov.utils.** { *; }
-keep class io.vov.vitamio.** { *; }

 

播放时拖动进度条,拖动进度不准确? 

这是正常现象,不是播放器的问题。默认seek要到最近的关键帧,不能保证任何时间戳上都有关键帧,除非你是intra-only 的编码方式。

如何开启硬解码? 

实例化MediaPlayer时启用第二个参数。
 

1
public MediaPlayer(android.content.Context ctx, boolean preferHWDecoder)

 

为什么每次软件升级都会重新解压解码包? 

为确保与当前升级软件中Vitamio的版本保持一致。Vitamio Java层的代码都已经公开,你可以自己改逻辑。

八,VCamera SDK Android用户手册

VCamera SDK Android版(短视频拍摄SDK)是炫一下(北京)科技有限公司官方推出的Android平台使用的软件开发工具包,为Android开发者提供简单、快捷的接口,帮助开发者实现Android平台上的短视频应用开发。

SDK提供视频录制、实时滤镜、后期强大的FFMPEG命令行支持,可实现水印、音量控制等诸多功能。

本文档面向所有使用该SDK的开发人员、测试人员,要求有一定的Android编程经验。

 

SDK下载地址

https://www.vitamio.org/VCamera_SDK_Android_1.1.0.zip

SDK功能说明

SDK提供拍摄录制、分段回删、实时滤镜、静态/动态水印、声音合成、本地图片、视频导入等功能。

 

SDK使用说明

1.1 运行环境

  • Android 4.0及以上的所有系统(注意Demo中使用了TextureView,要支持更低版本的Android请自行修改替换成SurfaceView)
  • 仅支持ARM v7的CPU

 

1.2 初始化

1
VCamera.initialize(this);

建议在Application 的onCreate 中调用,参考Demo 中的VCameraDemoApplication

 

开发前准备

如果您新开发一个的项目,我建议您直接在Demo上进行修改,修改AndroidManifest.xml中的package即可。

1.1 添加SDK到App工程

  • 创建一个Android工程
  • 将vcameralibrary.jar添加到App工程的libs目录下
  • 将libvcamera.so添加到App工程的libs目录下的armeabi-v7a目录
  • 从Demo中拷贝需要的类、图片等资源到App工程下

 

1.2 权限声明

1.3 初始化SDK

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//设置拍摄视频缓存路径
if (DeviceUtils.isZte()) {
    if(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ DCIM).exists()) {
        VCamera.setVideoCachePath(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + "/Camera/VCameraDemo/");
    } else {
        VCamera.setVideoCachePath(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath().replace("/sdcard/", "/sdcard-ext/") +"/Camera/VCameraDemo/");
    }
} else {
    VCamera.setVideoCachePath(Environment.getExternalStoragePublicDir ectory(Environment.DIRECTORY_DCIM) + "/Camera/VCameraDemo/");
}
//开启log输出,ffmpeg输出到logcat
VCamera.setDebugMode(true);
//初始化拍摄SDK,必须
VCamera.initialize(this);

1.4 初始化MediaRecorder

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mMediaRecorder = new MediaRecorder();
mMediaRecorder.setOnErrorListener(this);
if (NetworkUtils.isWifiAvailable(this)) {
    mMediaRecorder.setVideoEncodingBitRate(MediaRecorder.VIDEO_BITRAT E_MEDIUM);
    //WIFI下800码率
    }else{
    mMediaRecorder.setVideoEncodingBitRate(MediaRecorder.VIDEO_BITRATE_NORMAL);
    //3G、2G下600码率
}
String recordFile = VCamera.getVideoCachePath() + System.currentTimeMillis();
// 生成文件名;
mMediaRecorder.setOutputDirectory(recordFile);
// 设置输出路径
mMediaRecorder.setSurfaceView(mSurfaceView);
mMediaRecorder.setCameraFilter(MediaRecorder.CAMERA_FILTER_NO);
//重置滤镜
mMediaRecorder.prepare();

1.5 后期处理

UtilityAdaptert提供FFmpegRun方法用于执行ffmpeg命令

 

 

API说明

1.1 拍摄

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/** 视频码率400kbps */
public static final int VIDEO_BITRATE_LOW = 400;
/** 视频码率600kbps */
public static final int VIDEO_BITRATE_NORMAL = 600;
/** 视频码率800kbps(默认) */
public static final int VIDEO_BITRATE_MEDIUM = 800;
/** 视频码率1024kbps */
public static final int VIDEO_BITRATE_HIGH = 1024;
/* 设置码率,参数范围在400    ~   1024之间,建议WIFI下800K,其他情况600K */
public void setVideoEncodingBitRate(int bitRate)
/*  切换前后摄像头,默认后置摄像头  */
public void switchCamera()
/* 切换闪光灯,默认关闭 */
public boolean toggleFlashMode()
/**
* 设置视频临时存储文件夹
*
*@param key 视频输出的名称,同目录下唯一,一般取系统当前时间
*@param path 文件夹路径
*@return 录制信息对象
*/
public MediaObject setOutputDirectory(String key, String path)
/* 是否支持前置摄像头 */
public static boolean isSupportFrontCamera()
/* 拍摄完成,开始转码合成mp4临时文件 */
public boolean startEncoding()
/* 开始准备 */
public void prepare()
/* 开始录制,返回视频分块信息,与stop()成对使用 */
public MediaPart start()
/* 停止录制,与start()成对调用,可多次调用实现分段拍摄 */
public void stop()
/*  录制完成,释放资源    */
public void release()

1.2 MediaRecorderFilter支持实时滤镜的录制类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/** 没有滤镜 */
public static final String CAMERA_FILTER_NO = "";
/** 黑白滤镜 */
public static final String CAMERA_FILTER_BLACKWHITE = "blackWhite";
/** 锐化滤镜 */
public static final String CAMERA_FILTER_SHRRPEN = "pro";
/** 老照片 */
public static final String CAMERA_FILTER_OLD_PHOTOS = "oldFilm";
/** 霓虹灯 */
public static final String CAMERA_FILTER_NEON_LIGHT = "edge";
/** 反色滤镜 */
public static final String CAMERA_FILTER_ANTICOLOR = "antiColor";
/** 穿越滤镜 */
public static final String CAMERA_FILTER_THROUGH = "radial";
/** 马赛克滤镜 */
public static final String CAMERA_FILTER_MOSAICS = "earlyBird";
/** 怀旧滤镜 */
public static final String CAMERA_FILTER_REMINISCENCE = "lomo";

1.3 FFMpegUtils FFmpeg工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/** 音量 100% -vol 100 */
public static final float AUDIO_VOLUME_HIGH = 1F;
/** 音量 66% */
public static final float AUDIO_VOLUME_MEDIUM = 0.66F;
/** 音量 33% */
public static final float AUDIO_VOLUME_LOW = 0.33F;
/** 音量 关闭 */
public static final int AUDIO_VOLUME_CLOSE = 0;
/**
* 视频截图
*
* @param videoPath  视频路径
* @param outputPath 截图输出路径
* @param wh  截图画面尺寸,例如84x84
* @param ss  截图起始时间
* @return
*/
public static boolean captureThumbnails(String videoPath, String outputPath, String wh, String ss)
/**
* 综合转码
*
* @param mMediaObject 视频数据存储对象,涵主题、小部件和视频片段
* @param targetPath 目标路径
* @param videoWidth 视频宽度
* @param complexWatermark 是否合并主题(预览页主题和主题音乐)
* @return
*/
public static boolean videoTranscoding(MediaObject mMediaObject, String targetPath, int videoWidth, boolean complexWatermark)
/**
* 图片转视频(用于图片导入)
*/
public static boolean convertImage2Video(MediaPart part)

1.4 UtilityAdapter 底层工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* 执行ffmpeg命令
*
* @param strtag 任务的唯一标识,如果标识为""或NULL,以阻塞方式运行,否则以
异步方式运行
* @param strcmd 命令行
* @return 返回执行结果
*/
public static native int FFmpegRun(String tag, String cmd);
/** 获取当前转码完成时间 */
public static native int FFmpegVideoGetTransTime(int flag);
/** 获取当前转码完成时间 */
public static native int VideoGetMetadataRotate(String filename);

 

开发指南

1.1 拍摄流程图


上面是一般的拍摄流程,目前Demo只有手动拍摄(后续版本会补上本地导入),开发者可自行用ffmpeg命令行实现其他的功能和流程。

 

1.2 拍摄录制模式

SDK支持三种录制模式:

 

1.2.1 支持实时滤镜的录制模式(MediaRecorderFilter)

默认模式(也是秒拍当前使用的模式)输出yuv裸视频数据和pcm裸音频数据,如下流程图:

本模式下支持实时滤镜,能直接输出480x480的yuv数据,并且已经旋转好视频画面,无须额外裁剪。

 

1.2.2 普通录制模式(MediaRecorder)

与6.2.1类似,但是输出的是640x480的yuv数据,后期处理需要自己增加裁剪和旋转的命令,例如-vf "transpose=1[tran];[tran]crop=480:480:0:0"。

 

1.2.3 系统录制模式(MediaRecorderSystem).

待完善.

 

ffmpeg命令行

1.1 视频叠加水印(建议添加与视频大小一致并且透明的水印,如480x480)

1
2
3
4
5
6
// 单水印
ffmpeg -i in.mp4 watermark1.png -filter_complex "overlay=x=0:y=0" -f mp4 out.mp4
// 动态水印,2张图片间隔200毫秒
ffmpeg -i in.mp4 watermark1.png –i watermark2.png -filter_complex "overlay=x= \'if(eq(floor(mod(t*5,2)),0), 0, -500)\':y=0, overlay=x= \'if(eq(floor(mod(t*5,2)),1), 0, -500)\':y=0" -f mp4 out.mp4
//视频叠加gif
ffmpeg -y -i in.mp4 -i in.gif -filter_complex "overlay=0:0" -t 10 -acodec copy out.mp4

1.2 视频裁剪

1
2
// 裁剪0秒到10秒视频
ffmpeg -i in.mp4 -ss 0 -t 10 -vcodec copy -acodec copy out.mp4

1.3 格式转换

1
2
3
4
//yuv转mp4
ffmpeg -y -f rawvideo -pix_fmt yuv420p -s 480x480 -r 15 -i in.yuv -vcodec libx264 -profile:v baseline -preset ultrafast out.mp4
//静态图片转mp4
ffmpeg -y -loop 1 -f image2 -i Goddess.png -vcodec mpeg4 -r 15 -t 10 Goddess.mp4

1.4 其他

1
2
3
4
5
6
7
8
9
//加速视频
ffmpeg -i input.avi -vf "setpts=0.5*PTS" output.avi
//放慢视频
ffmpeg -i input.avi -vf "setpts=2.0*PTS" output.avi
//删除视频文件的旋转信息
-metadata:s:v rotate=\"\"
 //提取视频的yuv和pcm数据
 ffmpeg -i in.mp4 -ss 0 -t 10 -vn -acodec pcm_s16le -f s16le -ar 44100
-ac 1 a.pcm -ss 0 -t 10 -an -vcodec rawvideo -f rawvideo -s 640x480 -pix_fmt nv21 a.yuv

※更多关于ffmpeg的用法请参考, www.ffmpeg.org

 

FAQ

    • SDK是否收费?

    • 个人免费,企业收费(商务sales@yixia.com,电话座机010-6482 8682)
    • 最终解释权

    • 最终解释权归炫一下(北京)科技有限公司所有。
    • so的包很大,能优化减少吗
    • 我们也意识到了这个问题,后续版本会进行裁剪。
    • 拍摄界面能和秒拍做成一样的吗?

    • 能。欢迎为用户提供一致的体验!但仅限于拍摄的相关界面。
    • 什么时候推出IOS版本的拍摄SDK?

    • 如果你已经在上线的产品中使用了Android版的拍摄上传SDK,可以联系我们申请IOS版的拍摄SDK试用