概述
手里项目需要通过网络实时传输图像信息,但是由于图像分辨率太高,所以在传输的时候,每一帧图像的传输都需要很长时间,再到客户端解析。拖泥带水的感觉真的非常不好。而使用的ARM芯片本身是能够支持H.264格式硬编码的,所以尝试一下,看看能不能解决点问题。
源代码是这个兄弟的:点击打开链接,但是因为Linux内核版本不同,导致使用的Android系统的版本也不一样,所以下载下来的东西并不能直接使用,需要把SsbSipMfcApi.h SsbSipMfcEncApi.c mfc_interface.h和mfc_error.h,重新替换成所使用的Linux内核版本对应的,Android系统版本的相应的文件。文件目录再Android源码根目录/device/samsung/multimedia/codecs/video/exynos4/mfc/enc下。然后需要稍微修改一下SsbSipMfcEncApi.c文件。如下
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <math.h>
#include "mfc_interface.h"
#include "SsbSipMfcApi.h"
#if 0
#include <utils/Log.h>
/* #define LOG_NDEBUG 0 */
#undef LOG_TAG
#define LOG_TAG "MFC_ENC_APP"
#endif
#define _MFCLIB_MAGIC_NUMBER 0x92241001
void LOGE(char *m, ...)
{
printf(m);
}
void LOGV(char *m, ...)
{
printf(m);
}
void LOGI(char *m, ...)
{
printf(m);
}
void *SsbSipMfcEncOpen(void)
{
int hMFCOpen;
_MFCLIB *pCTX = NULL;
unsigned int mapped_addr;
int mapped_size;
struct mfc_common_args CommonArg;
//LOGI("[%s] MFC Library Ver %d.%02d",__func__, MFC_LIB_VER_MAJOR, MFC_LIB_VER_MINOR);
原因很简单,LOGV这些东西在现有的环境下是没有的。你可以直接把所有的都删掉,也就是不要调试信息。或者像上面一样自己造一个。虽然能够实现编码,但是我并没有真正的了解h264这种编码方式,后续需要继续学习。编码前51Mb的东西,编码后只有761Kb。真的太强大了。
还有需要会点Linux内核的配置,在我使用的3.0.15版的Linux内核上,MFC的操作方式支持两种,一种是古老的MFC作为单独的设备节点来使用,另外一种时集成到V4L2架构中的。当前实现的是使用古老方式MFC作为单独的设备节点来使用。V4L2现在对我来说有点复杂,里面的参数太多了。
使用MPlayer播放yuv格式和264格式文件的方法
mplayer -demuxer rawvideo -rawvideo w=176:h=144 test.yuv
mplayer -fps 30 test.264
参考:
基于V4L2 MFC 视频编解码
嵌入式专题: S5PV210 - MFC硬件解码
还有很多..........
最后
以上就是拉长大山为你收集整理的4412支持MFC硬编码的全部内容,希望文章能够帮你解决4412支持MFC硬编码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复