问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

android下视频文件从解码到播放需要哪几步,请简述

发布网友 发布时间:2022-04-19 18:21

我来回答

3个回答

热心网友 时间:2023-08-30 07:37

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

热心网友 时间:2023-08-30 07:38

但是Android移植到MIPS平台时间还不长,还不成熟,还需要自己实现硬件解码的工作。为了早日让Android在MIPS平台运行起来,我选择了先用软解码播放视频。我的Android代码是从AndroidonMIPS社区获得的代码。发现软解码视频播放过程中会发生崩溃。经过分析好像是内存分配的问题。经过研究OpenCore库(Android框架是通过OpenCore来播放视频的,网上有很多关于OpenCore的介绍,这里就不多说了),并参考Android平台Surfaceflinger机制。发现问题出在源文件:frameworks/base/libs/surfaceflinger/LayerBuffer.cpp的LayerBuffer::BufferSource::postBuffer方法中:............buffer=newLayerBuffer::Buffer(buffers,offset);............类LayerBuffer::Buffer的构造函数代码如下:LayerBuffer::Buffer::Buffer(constISurface::BufferHeap&buffers,ssize_toffset):mBufferHeap(buffers){NativeBuffer&src(mNativeBuffer);src.img.handle=0;gralloc_mole_tconst*mole=LayerBuffer::getGrallocMole();if(mole&&mole-perform){interr=mole-perform(mole,GRALLOC_MODULE_PERFORM_CREATE_HANDLE_FROM_BUFFER,buffers.heap-heapID(),buffers.heap-getSize(),offset,buffers.heap-base(),&src.img.handle);if(err==NO_ERROR){src.crop.l=0;src.crop.t=0;src.crop.r=buffers.w;src.crop.b=buffers.h;src.img.w=buffers.hor_stride?:buffers.w;src.img.h=buffers.ver_stride?:buffers.h;src.img.format=buffers.format;src.img.base=(void*)(intptr_t(buffers.heap-base())+offset);}}}LayerBuffer::getGrallocMole方法的调用到的Gralloc为:hardware/libhardware/moles/gralloc/gralloc.cpp因为的没有实现在自己的硬件只能用通用的Gralloc,经过分析发现通用的Gralloc没有实现mole-perform函数指针,mole-perform为NULL,所以不会对Buffer进行必要的初始化(我觉得应该是一个疏忽,只是不知道是谷歌的疏忽,还是MIPS移植人员的疏忽,最起码应该能够让通用硬件能跑起来)。参考其他的硬件实现一个perform函数指针到通用Gralloc中。在源文件:hardware/libhardware/moles/gralloc/mapper.cpp增加如下的函数定义:intgralloc_perform(structgralloc_mole_tconst*mole,intoperation,...){intres=-EINVAL;va_listargs;va_start(args,operation);switch(operation){caseGRALLOC_MODULE_PERFORM_CREATE_HANDLE_FROM_BUFFER:{intfd=va_arg(args,int);size_tsize=va_arg(args,size_t);size_toffset=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);returnres;}然后在gralloc.cpp中增加,gralloc_perform的声明:externintgralloc_perform(structgralloc_mole_tconst*mole,intoperation,...);并修改HAL_MODULE_INFO_SYM的定义,增加perform字段的定义:structprivate_mole_tHAL_MODULE_INFO_SYM={base:{.......perform:gralloc_perform,},......};重新编译gralloc模块,再次用Gallary应用程序通过软解码播放视频,就可以流畅的播放了,软解码的效率挺高的,没有卡的感觉!

热心网友 时间:2023-08-30 07:38

  建议安装优秀的播放器来解决,解码能力强,而且操作简单、方便。比如QQ音影、百度视频等等。
  1、手机安装最新版本的QQ音影。
  2、打开软件后,自动提示搜索本机的视频,搜索到打开就OK。
  3、还可以看软件推荐的视频,基本上流行的电视如直播、点播等等。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
计算机网络是学啥的啊,就业前景如何啊? 美的电饭锅煮粥要多久 美的电饭锅煮粥需要多长时间 美的电饭锅精煮要多久 美的电饭锅精煮需要多长时间 美的电饭锅超快煮多久 美的电饭锅短时间内煮好一餐需要多长时间_百度... 美的电饭锅快煮要多久 快煮美的电饭锅要几分钟 美的电饭锅超快煮多久 马蜂为什么总在家里出现? 家里持续出现马蜂没有马蜂窝是怎么回事? 为什么我们对家人的态度不如对外人好? 为什么男人对外人好对老婆就差了呢? android如何通过隐式意图寻找手机中能打开图片、音... android程序播放音乐和改成放视频怎么弄,需要在代... android实现直播接入哪个音视频sdk好? 安卓开发怎么点击按钮就播放视频videoview Android项目数据库中用何种方式存储音频和视频更合... android 实现实时语音功能选择接入哪个音视频sdk好? 实时音视频android端和iOS端如何截取当前画面? Android开发音视频本地播放器,谁知道有好的 如何在Android中整合立体声音效处理库 安卓开发中如何实现视频音频的切换 android集成WebRTC,怎么实现音视频通话功能? Android 音视频该如何学习 android音视频开发怎么做? 苹果手机可以安装谷歌商店吗 苹果手机可以安装谷歌商店吗? 馄饨包好可以放在冷冻柜里吗? 包好的抄手放冰箱保鲜过夜要得不 不用冰箱保存抄手的方法 馄饨皮如何保存? 刚包好的抄手可以装在袋子里直接放冰箱吗 android中可以提取视频文件中的音频吗 如何编写一个用于Android的音效驱动和控制程序 Android listview图文混排,有文字,图片,音频,... android videoview 播放视频如何控制音量 安卓怎么删除视频音轨 这是脱皮吗(巴西红耳龟)谢谢大家 进击的巨人的所有歌,包括片尾曲和插曲主题曲等等... 血红蛋白电泳hba偏高2.3,正常吗 红色胎记能彻底清除吗 《异界之红警纵横》最新txt全集下载 《龙涛》txt全集下载 跪求红警2原版(不会玩到一半就出现错误) 血红蛋白浓度hcb118是缺铁性贫血还是哪种贫血 佳能相机售后电话多少 桓台有没有佳能售后啊 附近佳能打印机维修点 请问佳能客服电话号码是多少? 广州佳能打印机售后维修点查询 佳能客服电话 如何? 佳能相机售后服务电话