安卓流媒体播放器实战代码

Ursula ·
更新时间:2024-11-15
· 987 次阅读

项目创建

权限 读写 网络 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



流媒体播放器 实战

需要 登录 后方可回复, 如果你还没有账号请 注册新账号