安卓手机访问电脑视频的话,是不需要解码的,直接跳转过去的,而且不需要密码解锁就可以视频
1、解码流程:
根据FFmpeg中视频解码器的名称找到对应手机硬解码器,如果存在则可以硬解码,
走硬解码流程;不存在就只能走软解码流程。
2、硬解码:
使用MediaCodec直接解码AVpacket,此时需要对AVPacket进行格式过滤,然后
MediaCodec解码后的数据用OpenGL ES渲染出来。
3、软解码:
直接用OpenGL ES 渲染YUV数据。
MediaCodecList.getCodecCount()支持的最低的SDK版本是16,buile.gradle中改 minSdkVersion 16
宏定义硬解码、软解码
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_module_t const * module = LayerBuffer::getGrallocModule();
if (module module-perform) {
int err = module-perform(module,
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::getGrallocModule方法的调用到的Gralloc为:
hardware/libhardware/modules/gralloc/gralloc.cpp因为的没有实现在自己的硬件只能用通用的Gralloc,经过分析发现通用的Gralloc没有实现
5, module-perform函数指针,module-perform为NULL,所以不会对Buffer进行必要的初始化(我觉得应该是一个疏忽,只是不知道是谷歌的疏忽,还是MIPS移植人员的疏忽,最起码应该能够让通用硬件能跑起来)。参考其他的硬件实现一个perform函数指针到通用Gralloc中。
在源文件:
hardware/libhardware/modules/gralloc/mapper.cpp增加如下的函数定义:
int gralloc_perform(struct gralloc_module_t const* module,
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_module_t const* module,
int operation, ... );并修改HAL_MODULE_INFO_SYM的定义,增加perform字段的定义:
struct private_module_t HAL_MODULE_INFO_SYM = {
base: {
.......
perform: gralloc_perform,
},
......
}; 重新编译gralloc模块,再次用Gallary应用程序通过软解码播放视频,就可以流畅的播放了,软解码的效率挺高的,没有卡的感觉!
软件下载完成后会显示在您手机主页面上。手机视频解码器app是一款强大的文件格式转换工具,它的主要作用的帮助用户进行快速的视频、音频格式转换。对于那些在手机上无法播放的文件如AVI、BMP、RAW等格式,有了它就可以轻松解决;且转换格式多、转换速度快,是十分优秀的手机端格式转换器!
对需要用FF解码的视频类型去掉内部解码勾选
2.在外部解码器中对所选视频选择FF解码器即可