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应用程序通过软解码播放视频,就可以流畅的播放了,软解码的效率挺高的,没有卡的感觉!