项目创建
权限 读写 网络 ABI armeabi-v7a JNI 库路径 CMake 代码和头文件、导入导出库我选择的是Android 4.0冰激凌三明治版本,C++11
从昨天起,Android studio的项目突然出来点问题,即把appcompat-v7:29.+ 的"29."去掉就OK了,可是下次新建项目有需要这样修改,为了抓紧干活,先暂时这样做
像之前的项目,就没什么问题,29版本以上就会出错
代码:
FFDemux.cpp
#include "FFDemux.h"
#include "XLog.h"
extern "C"{
#include //封装器
}
//.cpp实现
//打开文件,或者流媒体 rtmp http rtsp ,通过FFDemux::调用该类下的函数
bool FFDemux::Open(const char *url)//去掉“=0”纯虚函数,(实现是在继承类当中的)
{
XLOGI("Open file %s begin", url);
int re = avformat_open_input(&ic, url, 0, 0);
if (re != 0)
{
char buf[1024];
av_strerror(re, buf, sizeof(buf));
XLOGE("FFDemux open %s failed!可能:"
"1.网络模块未初始化,"
"2.路径下没有对应文件,"
"3.没有网络和读取权限Manifest及代码中动态权限",url);
return false;//先不加锁(需要释放)
}
XLOGI("FFDemux open %s success",url);
}
//读取一帧数据,数据由调用者清理
XData FFDemux::Read()
{
XData xd;
return xd;
}
//初始化这个函数只会被调用一次
FFDemux::FFDemux()
{
//为了防止它被静态调用,使用静态变量
static bool isFirst = true;//第一次进来(不是线程安全的)
//如果同时创建2个FFDemux对象,可能会出现多次创建问题
if (isFirst) {//如果是第一次
isFirst = false;
//注册所有封装器
av_register_all();
//注册所有的解码器
avcodec_register_all();
//初始化所有网络
avformat_network_init();
XLOGI("register ffmpeg!");
}
}
FFDemux.h
#ifndef XPLAY_FFDEMUX_H
#define XPLAY_FFDEMUX_H
//#include IDE自动引用了,这里不需要头文件,是自定义声明
#include "XData.h"
#include "IDemux.h"
struct AVFormatContext;
class FFDemux :public IDemux{
public:
//打开文件,或者流媒体 rtmp http rtsp
virtual bool Open(const char *url);//去掉“=0”纯虚函数,(实现是在继承类当中的)
//读取一帧数据,数据由调用者清理
virtual XData Read();
FFDemux();//构造函数,只要创建这个接口肯定会被调用
private: //成员
//只在无参下生效,如果有参将不会被赋值(有参需要放到构造函数里面去初始化)
AVFormatContext *ic = 0; //指针是一种类型不用管它的实现
};
#endif //XPLAY_FFDEMUX_H
IDemux.h
#ifndef XPLAY_IDEMUX_H
#define XPLAY_IDEMUX_H
#include "XData.h"
//解封装接口
class IDemux {
public:
//打开文件,或者流媒体 rtmp http rtsp
virtual bool Open(const char *url) = 0;//定义纯虚函数,(实现是在继承类当中的)
//读取一帧数据,数据由调用者清理
virtual XData Read() = 0;
};
#endif //XPLAY_IDEMUX_H
XLog.h
#ifndef XPLAY_XLOG_H
#define XPLAY_XLOG_H
class XLog {
};
//通过宏区分不同系统
#ifdef ANDROID
#include
//DEBUG级别
#define XLOGD(...) __android_log_print(ANDROID_LOG_DEBUG,"XPlay",__VA_ARGS__)
#define XLOGI(...) __android_log_print(ANDROID_LOG_INFO,"XPlay",__VA_ARGS__)
//ERROR级别以上的错误都会爆红
#define XLOGE(...) __android_log_print(ANDROID_LOG_ERROR,"XPlay",__VA_ARGS__)
#else
//DEBUG级别
#define XLOGD(...) print("XPlay",__VA_ARGS__)
#define XLOGI(...) print("XPlay",__VA_ARGS__)
//ERROR级别以上的错误都会爆红
#define XLOGE(...) print("XPlay",__VA_ARGS__)
#endif
#endif //XPLAY_XLOG_H
入口文件
测试运行结果:
在接口之前必须先初始化,首先不能放到IDemux里面,可以对外提供统一初始化接口来实现,还有就是在构造函数里面初始化
出现动态权限问题,导入第三块库 https://github.com/getActivity/XXPermissions
无法引用插件,参考链接https://blog.csdn.net/qq_34829270/article/details/80481209
作者:Alex-panda