一,Vitamio 是什麼?html
Vitamio 是一款 Android 與 iOS 平臺上的全能多媒體開發框架,全面支持硬件解碼與 GPU 渲染。Vitamio 憑藉其簡潔易用的 API 接口贏得了全球衆多開發者的青睞。到目前,全球已經有超過 一萬 種應用在使用 Vitamio,覆蓋用戶超過 5億 。java
Vitamio 可以流暢播放720P甚至1080P高清MKV,FLV,MP4,MOV,TS,RMVB等常見格式的視頻,還能夠在 Android 與 iOS 上跨平臺支持 MMS, RTSP, RTMP, HLS(m3u8) 等常見的多種視頻流媒體協議,包括點播與直播。android
Vitamio 支持各類常見的流媒體協議,能夠點播或者直播音頻和視頻,例如以下常見協議均能無縫支持:ios
Vitamio 使用了 FFmpeg 作爲媒體解析器和最主要的解碼器,同時開發了針對不一樣移動平臺的硬解碼方案,可以完美支持 H.264/AVC、H.26三、 MPEG4 等常見的視頻編碼,覆蓋上百種多媒體格式。下表只是一些最多見的視頻格式支持,除特殊標明,所有支持硬件加速:nginx
Vitamio 對字幕的支持很優秀,包括各類常見外掛字幕與不少視頻格式的內嵌字幕,同多個字幕等特性的支持也很是完善。好比:git
除了上面列出的常見功能以外,Vitamio 還作了至關多人性化的工做:github
還有更多新特性沒有被列出,請參考開發文檔。web
二,Vitamio 新手入門編程
Vitamio項目發展迅猛,官方羣突破800位開發者,基於Vitamio的項目突破1000個,使用Vitamio提供優質播放體驗的用戶超過1億。也歡迎你們分享你的Vitamio使用經驗,本文將進一步介紹Vitamio的簡單使用方法。vim
目前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的介紹參照這裏。
一、導入。下載回來後你們可能發現沒有.project工程文件,能夠經過File -> Import -> Android -> Existing Android Code Into Workspace來導入工程,而後改一下工程名稱便可。
二、將VitamioBundle工程做爲Android Library引入Demo工程使用便可。
注意:
若是是Windows用戶,請將VitamioBundle與Demo工程放在同一個文件夾下,不然添加Android Library可能失敗,其餘問題通常clean一下從新編譯一下就行了。其餘問題請參考錯誤大全。
官方網站/論壇:vitamio.org
Vitamio QQ 3羣:283274315
一、官方建議以Android Library方式使用Vitamio插件,以便後續方便升級。
二、 Vitamio最新版本爲4.2.1,極力推薦使用新版本。
三、 基於Vitamio僅支持ARMv6+以上的CPU,95%以上的視頻格式支持,說明:
a). 沒法播放的問題。使用VPlayer來測試連接,若是VPlayer沒有問題那Vitamio確定也沒有問題。
b). 各類找不到so文件的狀況只有兩種狀況:不支持設備、沒有執行解壓解碼包。
四、Vitamio最終全部權爲炫一下(北京)科技有限公司。
三,Vitamio測試網絡視頻地址
Vitamio支持多種流媒體格式,如下是一些視頻地址片斷案例,提供給你們測試使用:
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://www.modrails.com/videos/passenger_nginx.mov
http://wsmp32.bbc.co.uk/
http://m.livestream.com (site)
rtsp://xgrammyawardsx.is.livestream-api.com/livestreamiphone/grammyawards
mms://video.fjtv.net/setv
mms://ting.mop.com/mopradio
mms://112.230.192.196/zb12
四,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!
凡是此類錯誤,通常只有如下幾種狀況:
一、Vitamio只支持ARMv6+以上的CPU,若是報以上錯誤,說明不支持你的機器。(注意:模擬器要使用4.0以上)
二、沒有調用檢測解碼包的代碼(即沒有解壓解碼包,Vitamio會根據當前CPU的類型自動解壓相應平臺的庫),使用方法參照DEMO:
// ~~~ 檢測Vitamio是否解壓解碼包
if (!LibsChecker.checkVitamioLibs(this)) return;
三、沒有以Library的方式使用Vitamio,漏拷貝了VitamioBundle裏面的類庫或代碼,例如libvinit.so、libarm.so等。
四、若是您有本身的so,請參考Vitamio的libs文件夾(armeabi、armeabi-v7a、x86)將so拷貝、新建相應的文件夾。
五、若是您是從舊版本Vitamio升級過來,尤爲是早期以集成方式使用的,而如今又以Library方式使用,請刪除相關的類和文件(res/raw/libarm.so、libs下面的libvinit.so、io.vov.vitamio下面相應的類文件),最後改一下當前項目的versionCode(Vitamio根據當前項目的版本自動從新解壓升級)。最後能夠嘗試卸載以前的app從新安裝。強烈建議下載最新版本,先跑通官網例子,沒有問題再本身集成,最後搞不定還能夠直接在官網例子上修改。
六、極少數幾款設備,好比華爲S8600、三星GT-S5830(CPU是ARMv6+,可是沒法使用)
avformat_open_input: I/O error
一、確保視頻沒有問題。先拿VLC、系統自帶的播放器或者PC上的播放器,測試一下連接,確保視頻是能夠播放的。
二、確保調用方法沒有問題。參考官方的例子,先用官網例子測試一個能夠播放的連接,而後再不改動其餘的代碼狀況下僅更改播放地址進行測試。
三、確保測試環境一致。好比拿能上網的PC測試完後拿沒法上網的手機測試,那確定不行。
四、前面都確保沒有問題後最後使用VPlayer來進行測試,若是VPlayer可以播放,那Vitamio必定能播放,不然只有一種狀況:不支持!
這個不是錯誤,是正常的處理。如今播放視頻是這樣作的:先把 URL 當作一個 ContentProvider 來打開,若是打不開,就直接當作 URL 來打開
若是手機上安裝了VPlayer而且使用了舊版本(3.0之前)的Vitamio,可能會報這個錯,能夠簡單理解爲衝突,因此後續VitamioService這個類在3.0之後就沒有了,還有相關的MediaScannerService也沒有了。
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崩潰的問題,通常是MediaPlayer的生命週期沒有使用正確。好比尚未prepare就去調用isPlaying等其餘方法都會致使這個問題,使用系統的MediaPlayer也會拋出IllegalStateException的異常。建議去Android官網看文檔:http://developer.android.com/reference/android/media/MediaPlayer.html。尤爲是MediaPlayer的狀態圖。
五,Vitamio產品大全
酷6視頻 Ku6Video 是酷6網竭力打造的手機視頻客戶端。酷6網做爲國內最大的短視頻網站,其客戶端覆蓋了資訊、娛樂、搞笑、拍客、時尚等多個頻道的海量視頻資源,集播放、下載、上傳、分享等全新功能,讓手機受衆盡享視頻饕鬄盛宴
CNTV中國網絡電視臺爲中國網絡電視臺官方推出的安卓客戶端。 匯聚CCTV和CNTV精彩資源,提供最全面最豐富的中國電視直播、點播服務,全天24小時滾動更新。 精品資訊細分:國家大事、社會熱點新聞,盡收眼底 實時直播頻道:王牌電視節目,隨時隨地看直播 精彩專題推薦:新聞、時政、經濟、人文和熱播影視劇在內的新聞熱點聚焦 趕忙下載玩轉2013年指尖上的春晚,CNTV中國網絡電視……
是一款裝機必備的免費高清電影軟件。海量收錄新片,愛情,動做,動漫,驚悚,喜劇等元素的高清電影,爲所欲爲的在線觀看和下載。專爲Android手機訂製的視頻娛樂客戶端產品,爲用戶提供能了流暢便捷的客戶端視頻播放體驗。
321影音是android手機上功能最多、性能最好的多媒體播放軟件,集視頻播放、音頻播放、電視直播、廣播電臺於一身,支持幾乎全部流行的視頻、音頻格式,它將讓您的android手機變成您的掌上享樂中心!
廈門音樂廣播伴隨着新世紀的到來,廈門人民廣播電臺加速發展,目前已造成了智能化控制管理的高速寬帶多媒體信息網絡,技術裝備水平在全國城市電臺中位居前列,電波覆蓋範圍包括廈門、泉州、龍海、南安、晉江、石獅以及金門等地區,覆蓋人口達六百多萬,收聽人數、收聽率節節上升。
聽世界,是一款專業的有聲做品播放器,免費提供各種精彩的有聲小說、廣播劇、相聲評書、聲音故事、有聲教材、幽默笑話等內容,解放您的雙眼,讓您愛上聽的感受!
酷雲TV是北京十分科技有限公司出品的一款電視互動產品,它可使電視節目變得更加有趣。
酷狗音樂手機版是最受歡迎的音樂播放器,有強大的音樂搜索和高速下載功能、 全球最全音樂曲庫,最專業的音頻解碼核心技術,完美實現各類音頻格式的高保真播放。
每天動聽手機版是一款功能強大、徹底免費的手機音樂播放軟件,[3]支持歌詞和歌曲圖片下載,皮膚隨心更換,更有炫麗震撼的可視化效果,同時預置豐富的均衡器效果,支持音效加強,簡潔人性化的操做,給追求音樂品質的呢帶來了手機聽歌的全新體驗。數據代表,每天動聽已經成爲拇指一族必備的音樂播放工具!
七,Vitamio FAQ
Vitamio的中文名稱爲「維他蜜」。
Vitamio 來源於英文單詞Vitamin(維他命),但願Vitamio對於安卓多媒體開發者的重要性,就像Vitmain之於人體同樣不可缺乏。
Vitamio基於VPlayer開發,因此VPlayer能播放的Vitamio也能。
支持 ARMv6 和 ARMv7 兩種 ARM CPU,同時對 VFP, VFPv3, NEON 等指令集都作相應優化。
支持 Android 2.1+ 系統,支持超過 95% 的 Android 市場。同時 Android 2.1 以前的系統也基本支持,不過沒作詳細測試。
這個不是錯誤,是正常的處理。如今播放視頻是這樣作的:先把 URL 當作一個 ContentProvider 來打開,若是打不開,就直接當作 URL 來打開。
由於你下載和使用的是較早的Vitamio版本!
可能存在如下幾種狀況:
建議先使用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);
}
|
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編程經驗。
https://www.vitamio.org/VCamera_SDK_Android_1.1.0.zip
SDK提供拍攝錄製、分段回刪、實時濾鏡、靜態/動態水印、聲音合成、本地圖片、視頻導入等功能。
1
|
VCamera.initialize(
this
);
|
建議在Application 的onCreate 中調用,參考Demo 中的VCameraDemoApplication
若是您新開發一個的項目,我建議您直接在Demo上進行修改,修改AndroidManifest.xml中的package便可。
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
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();
|
UtilityAdaptert提供FFmpegRun方法用於執行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
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
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
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
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);
|
上面是通常的拍攝流程,目前Demo只有手動拍攝(後續版本會補上本地導入),開發者可自行用ffmpeg命令行實現其餘的功能和流程。
SDK支持三種錄製模式:
默認模式(也是秒拍當前使用的模式)輸出yuv裸視頻數據和pcm裸音頻數據,以下流程圖:
本模式下支持實時濾鏡,能直接輸出480x480的yuv數據,而且已經旋轉好視頻畫面,無須額外裁剪。
與6.2.1相似,可是輸出的是640x480的yuv數據,後期處理須要本身增長裁剪和旋轉的命令,例如-vf "transpose=1[tran];[tran]crop=480:480:0:0"。
待完善.
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
|
//
裁剪0秒到10秒視頻
ffmpeg -i
in
.mp4 -ss 0 -t 10 -vcodec copy -acodec copy out.mp4
|
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
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