android載入視頻
A. Android緋葷粺涓鐨勯煶瑙嗛戞敮鎸佹湁鍝浜
Android緋葷粺涓瀹屽杽鐨勯煶瑙嗛戞敮鎸
鑷浠嶢ndroid緋葷粺闂涓栦互鏉ワ紝瀹冨凡緇忔垚涓轟簡縐誨姩璁懼囬嗗煙鏈涓烘垚鍔熺殑鎿嶄綔緋葷粺涔嬩竴銆傝ョ郴緇熷叿鏈夊己澶х殑澶氬獟浣撳勭悊鍔熻兘錛屽備赴瀵岀殑闊抽戝拰瑙嗛戞敮鎸侊紝鍙璁╁紑鍙戣呰交鏉懼壋寤哄嚭鍔熻兘涓板瘜鐨勯煶瑙嗛戝簲鐢ㄧ▼搴忋傛湰鏂囧皢鎺㈣ˋndroid緋葷粺涓浣跨敤鐨勫父瑙侀煶瑙嗛戞嗘灦鍜孉PI鎺ュ彛銆
1.OpenMAX緙栬В鐮佸櫒錛
OpenMAX緙栬В鐮佸櫒鏄涓縐嶅彲鐢ㄤ簬Android璁懼囦腑鐨勭‖浠跺姞閫熸妧鏈銆傝ユ妧鏈鍙浠ュ府鍔╁湪璁懼囦笂鎾鏀鵑珮娓呮垨嫻佸獟浣撹嗛戞椂鍑忓皯濯掍綋鏂囦歡鐨勫崰鐢ㄧ┖闂淬備綔涓轟竴縐嶅紑鏀炬爣鍑嗭紝OpenMAX鏀鎸佷粠搴旂敤紼嬪簭鍒扮‖浠剁殑鍏ㄩ潰瑙e喅鏂規堛傚湪Android緋葷粺涓錛孫penMAX鏄鐢辯‖浠跺巶鍟嗘彁渚涙敮鎸侊紝騫朵笖瀹冨厑璁鎬笉鍚岀殑紜浠跺拰杞浠剁粍鍚堝簱鐩鎬簰鍗忎綔銆
2.Medistore錛
Mediastore鏄疉ndroid緋葷粺鐨勪竴涓澶氬獟浣撲腑闂村眰銆傚畠浣跨敤鎴峰彲浠ュ揩閫熸柟渚垮湴鑾峰彇銆佸瓨鍌ㄥ拰澶勭悊縐誨姩璁懼囩殑澶氬獟浣撴暟鎹銆傚畠鏀鎸佽稿氭牸寮忓侻P3銆丳NG絳夛紝鑰屼笖瀹冨彲浠ラ氳繃URI鐨勬柟寮忚塊棶鍒扮郴緇熺殑澶氬獟浣撴暟鎹銆傚逛簬寮鍙戜漢鍛樻潵璇達紝Mediastore榪樻彁渚涗簡璁稿氭帴鍙e拰綾伙紝鍙甯鍔╀粬浠綆$悊澶氬獟浣撴暟鎹銆
3.MediaPlayer錛
MediaPlayer鏄疉ndroid緋葷粺涓鏈甯哥敤鐨勫氬獟浣撴挱鏀懼櫒銆傚畠鑳藉熶互嫻佺殑鏂瑰紡澶勭悊澶氱嶉煶棰戝拰瑙嗛戞牸寮忥紝濡侻P3銆乄AV絳夐煶棰戞牸寮忥紝浠ュ強MP4銆丠.264絳夎嗛戞牸寮忋侻ediaPlayer榪樺彲浠ヤ笌SurfaceView鍗忓悓宸ヤ綔錛屼互渚挎洿鍔犵伒媧誨湴鎺у埗瑙嗛戠殑鎾鏀俱傚湪寮鍙戣繃紼嬩腑錛屽紑鍙戜漢鍛樺彲浠ヤ嬌鐢∕ediaPlayer綾葷殑璁稿氭柟娉曞拰灞炴ф潵鎺у埗闊抽戝拰瑙嗛戠殑鎾鏀俱佹殏鍋滃拰鍋滄㈢瓑鍔熻兘銆
4.AudioTrack錛
AudioTrack鏄涓涓鍦ˋndroid緋葷粺涓婂勭悊闊抽戞暟鎹鐨勭被銆傚畠鏀鎸佷互鏁版嵁緙撳瓨鏂瑰紡鎾鏀鵑煶棰戣В鐮佹暟鎹錛屽苟鍏佽稿紑鍙戜漢鍛橀氳繃璁稿氭柟娉曞拰灞炴ф潵鎺у埗闊抽戞挱鏀俱侫udioTrack鏈甯哥敤浜庨煶棰戞祦浼犺緭鍜岄煶棰戞枃浠舵挱鏀撅紝渚嬪侻P3鎴朩AV鏂囦歡銆
鎬諱箣錛孉ndroid緋葷粺鐨勯煶瑙嗛戝姛鑳藉湪縐誨姩璁懼囦腑宸茬粡寰楀埌浜嗗箍娉涚殑搴旂敤銆傞氳繃瀵逛笉鍚岀殑API鎺ュ彛鍜屾嗘灦鐨勪簡瑙o紝寮鍙戜漢鍛樺彲浠ヨ交鏉懼壋寤洪珮璐ㄩ噺鐨勯煶瑙嗛戝簲鐢ㄧ▼搴忋
B. Android webview中如何播放網路視頻
使用webview載入網頁視頻的方法:
設置webView
webView = (WebView) view.findViewById(R.id.webView);
// 設置WebView屬性,能夠執行Javascript腳本
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setPluginsEnabled(true);
webView.getSettings().setPluginState(PluginState.ON);
webView.setVisibility(View.VISIBLE);
webView.getSettings().setUseWideViewPort(true);
webView.loadUrl("視頻地址");
2.需要在AndroidManifest.xml文件中聲明需要使用HardwareAccelerate, 可以細化到Activity級別,如果不需要的View可以聲明不要用加速,但是需要在代碼中做,具體如下:
1.如果要聲明整個應用都要加速:<application ...android:hardwareAccelerated="true">
2.如果要在Activity中聲明,則:<activity ...android:hardwareAccelerated="true">, 還可以更細化到Window, getWindow.setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
3.如果application或者activity都申明了要硬體加速,但是為了某些原因(比如省電?),一些View不需要硬體加速的話
3. 上面的操作做了,就可以使用video標簽播放視屏了,如果要支持全屏,還需給webview一個WebChromeClient對象,這個WebChromeClient對象需要實現onShowCustomView和onHideCustomView方法
C. Android如何播放mov格式的視頻文件
Android播放「mov」格式的視頻文件時,可以藉助第三方軟體將「mov」格式轉換成「mp4」。
此處以微信為例,具體步驟如下:
1、打開安卓手機的微信軟體,點開任意聊天框將「mov」格式的視頻發送過去。
(3)android載入視頻擴展閱讀:
MP4與MOV的區別:
「mp4」格式的視頻相比起「mov」格式的視頻體積要小得多,前者格式壓縮率相比後者要大得多,雖然相對來說更省存儲空間,但畫質將會受到影響,很不利於後期編輯和製作,尤其是後期特效和調色。
這一點很像數碼相機的RAW格式和jpeg格式,前者為無損壓縮格式後者則是有損壓縮格式,前者的後期調整餘地更大。這也是很多資深的攝影者更願意用前者拍攝的原因。
D. android手機如何播放mp4
android手機播放MP4視頻文件步驟如下:
工具/材料:以小米6手機為例。
1、首先打開小米6手機,點擊「小米視頻」圖標,如下圖所示;
E. Android實現視頻播放的幾種方式
Android提供了常見的視頻編碼,解碼機制,使用Android自帶的MediaPlayer,MediaController等類可以很方便的實現視頻播放的功能。支持的視頻格式有MP4和3GP等。這些多媒體數據可以來自於Android應用的資源文件,也可以來自於外部存儲器上的文件,甚至可以是來自於網路上的文件流。
1、MediaController+VideoView實現方式
這種方式是最簡單的實現方式。VideoView繼承了SurfaceView同時實現了MediaPlayerControl介面,MediaController則是安卓封裝的輔助控制器,帶有暫停,播放,停止,進度條等控制項。通過VideoView+MediaController可以很輕松的實現視頻播放、停止、快進、快退等功能。
布局文件如下:
使用此實現方式的步驟:
1.載入指定的視頻文件
2.建立VideoView和MediaController之間的關聯,這樣就不需要自己去控制視頻的播放、暫停等。讓MediaController控制即可。
3.VideoView獲取焦點。
2、MediaPlayer+SurfaceView+自定義控制器
雖然VideoView的實現方式很簡單,但是由於是自帶的封裝好的類,所以無論是播放器的大小、位置以及控制都不受我們控制。
這種實現方式步驟如下:
1.創建MediaPlayer對象,並讓它載入指定的視頻文件。可以是應用的資源文件、本地文件路徑、或者URL。
2.在界面布局文件中定義SurfaceView組件,並為SurfaceView的SurfaceHolder添加Callback監聽器。
3.調用MediaPlayer對象的setDisplay(SurfaceHolder sh)將所播放的視頻圖像輸出到指定的SurfaceView組件。
4.調用MediaPlayer對象的prepareAsync()或prepare()方法裝載流媒體文件
5.調用MediaPlayer對象的start()、stop()和pause()方法來控制視頻的播放。
在實現第二步之前需要先給surfaceHolder設置一個callback,callback的3個回調函數如下:
3、MediaPlayer+SurfaceView+MediaController
第二種實現方式使用的是自定義控制項,MediaPlayer+SurfaceView也可以使用系統自帶的MediaController控制器。
使用這個方式實現,布局文件只需一個SurfaceView即可,其他的控制項都交給MediaController控制器,布局文件如下:
實際過程中推薦大家使用B站的播放器ijkplayer非常好用!
F. android下視頻文件從解碼到播放需要哪幾步,請簡述
Android通過軟解碼播放視頻
1, 一般情況下Android的平台都是硬解碼視頻的,尤其是在Arm平台這種成熟的硬體平台上面(硬解碼代碼由晶元廠商提供)。但是Android移植到
2, MIPS平台時間還不長,還不成熟,還需要自己實現硬體解碼的工作。為了早日讓Android在MIPS平台運行起來,我選擇了先用軟解碼播放視頻。
3,Android代碼是從Android on MIPS社區獲得的代碼。發現軟解碼視頻播放過程中會發生崩潰。經過分析好像是內存分配的問題。
4, 經過研究OpenCore庫(Android框架是通過OpenCore來播放視頻的,網上有很多關於OpenCore的介紹,這里就不多說了),並參考Android平台——Surfaceflinger機制。發現問題出在源文件:
frameworks/base/libs/surfaceflinger/LayerBuffer.cpp的LayerBuffer::BufferSource::postBuffer方法中:
............
buffer = new LayerBuffer::Buffer(buffers, offset);
............類LayerBuffer::Buffer的構造函數代碼如下:
LayerBuffer::Buffer::Buffer(const ISurface::BufferHeap& buffers, ssize_t offset)
: mBufferHeap(buffers)
{
NativeBuffer& src(mNativeBuffer);
g.handle = 0;
gralloc_mole_t const * mole = LayerBuffer::getGrallocMole();
if (mole && mole->perform) {
int err = mole->perform(mole,
GRALLOC_MODULE_PERFORM_CREATE_HANDLE_FROM_BUFFER,
buffers.heap->heapID(), buffers.heap->getSize(),
offset, buffers.heap->base(),
& g.handle);
if (err == NO_ERROR) {
op.l = 0;
op.t = 0;
op.r = buffers.w;
op.b = buffers.h;
g.w = buffers.hor_stride ?: buffers.w;
g.h = r_stride ?: buffers.h;
rmat = rmat;
se = (void*)(intptr_t(buffers.heap->base()) + offset);
}
}
}LayerBuffer::getGrallocMole方法的調用到的Gralloc為:
hardware/libhardware/moles/gralloc/gralloc.cpp因為的沒有實現在自己的硬體只能用通用的Gralloc,經過分析發現通用的Gralloc沒有實現
5, mole->perform函數指針,mole->perform為NULL,所以不會對Buffer進行必要的初始化(我覺得應該是一個疏忽,只是不知道是谷歌的疏忽,還是MIPS移植人員的疏忽,最起碼應該能夠讓通用硬體能跑起來)。參考其他的硬體實現一個perform函數指針到通用Gralloc中。
在源文件:
hardware/libhardware/moles/gralloc/mapper.cpp增加如下的函數定義:
int gralloc_perform(struct gralloc_mole_t const* mole,
int operation, ... )
{
int res = -EINVAL;
va_list args;
va_start(args, operation);
switch (operation) {
case GRALLOC_MODULE_PERFORM_CREATE_HANDLE_FROM_BUFFER: {
int fd = va_arg(args, int);
size_t size = va_arg(args, size_t);
size_t offset = va_arg(args, size_t);
void* base = va_arg(args, void*);
native_handle_t** handle = va_arg(args, native_handle_t**);
private_handle_t* hnd = (private_handle_t*)native_handle_create(
private_handle_t::sNumFds, private_handle_t::sNumInts);
hnd->magic = private_handle_t::sMagic;
hnd->fd = fd;
hnd->flags = private_handle_t::PRIV_FLAGS_USES_PMEM;
hnd->size = size;
hnd->offset = offset;
hnd->base = intptr_t(base) + offset;
hnd->lockState = private_handle_t::LOCK_STATE_MAPPED;
*handle = (native_handle_t *)hnd;
res = 0;
break;
}
}
va_end(args);
return res;
}然後在gralloc.cpp中增加,gralloc_perform的聲明:
extern int gralloc_perform(struct gralloc_mole_t const* mole,
int operation, ... );並修改HAL_MODULE_INFO_SYM的定義,增加perform欄位的定義:
struct private_mole_t HAL_MODULE_INFO_SYM = {
base: {
.......
perform: gralloc_perform,
},
......
}; 重新編譯gralloc模塊,再次用Gallary應用程序通過軟解碼播放視頻,就可以流暢的播放了,軟解碼的效率挺高的,沒有卡的感覺!