当前位置: 首页 > news >正文

如何做网站frontpage门户网站系统建设项目投标书

如何做网站frontpage,门户网站系统建设项目投标书,移动端网页设计规范,什么是crm管理系统安卓 FFmpeg系列 第一章 Ubuntu生成ffmpeg安卓全平台so 第二章 Windows生成ffmpeg安卓全平台so 第三章 生成支持x264的ffmpeg安卓全平台so 第四章 部署ffmpeg安卓全平台so并使用#xff08;本章#xff09; 文章目录 安卓 FFmpeg系列前言一、添加so1、拷贝ffmpeg到项目2、bu…安卓 FFmpeg系列 第一章 Ubuntu生成ffmpeg安卓全平台so 第二章 Windows生成ffmpeg安卓全平台so 第三章 生成支持x264的ffmpeg安卓全平台so 第四章 部署ffmpeg安卓全平台so并使用本章 文章目录 安卓 FFmpeg系列前言一、添加so1、拷贝ffmpeg到项目2、build.gradle指定so目录 二、调用命令行1、新建CMakeLists链接ffmpeg的so2、封装命令行方法1、导入main符号2、将字符串解析为argc、argv3、注册log回调输出安卓日志4、阻止exit退出完整代码 3、dart ffi调用4、java jni调用 三、完整代码四、使用示例1、flutter调用命令行rtsp拉流 总结附录1、dart将字符串解析为argc、argv 前言 前面的章节实现了ffmpeg全平台so的生成接下来的步骤就是部署以及使用了部署so还是比较简单的用gradle和cmake都可以部署部署好了就可以直接使用了如果需要c进行封装一层则需要链接对cmake熟悉的话链接也是比较简单的。 一、添加so 1、拷贝ffmpeg到项目 ffmpeg的生成方法可以参考前面三章或者使用第二章 生成好的包。将ffmpeg生成好的包拷贝到如下目录。 并将so放到对应abi的目录中。 2、build.gradle指定so目录 指定的目录为abi名称的上一级。 sourceSets {main {jniLibs.srcDirs [src/main/cpp/jniLibs/ffmpeg4.3.6/24] }}如果是jni或者flutter的ffi直接调用ffmpeg的符号则到这一步就结束了。 通过jni或ffi直接调用命令行可以使用第三章 生成的包里面有个libffmpeg.so包含了ffmpeg的main符号可以通过ffi直接调用。但需要解决2个问题1、字符串解析为argc、argv。dart.可参考附录2、中断ffmpeg的exit操作。 否则继续往下 二、调用命令行 此步骤依赖第三章 生成的包libffmpeg.so是ffmpeg可执行程序笔者将其生成了so。 1、新建CMakeLists链接ffmpeg的so 在项目中新建一个CMakeLists.txt用于生成c代码。 在CMakeLists.txt中填入以下内容会链接ffmpeg的所有so以及包含头文件。 # Sets the minimum version of CMake required to build the native library. cmake_minimum_required(VERSION 3.4.1) #拼接ffmpeg目录 set(PREFIX ${CMAKE_SOURCE_DIR}/jniLibs/ffmpeg4.3.6/24/${ANDROID_ABI}) #包含ffmpeg头文件目录 include_directories(${PREFIX}/include) #添加链接目录 link_directories(${PREFIX}) # 搜索ffmpeg目录下的所有.so文件 file(GLOB SO_FILES ${PREFIX}/*.so ) # 获取目录下所有库名 foreach(SO_FILE IN LISTS SO_FILES)# 获取不带路径的文件名get_filename_component(LIB_NAME ${SO_FILE} NAME)list(APPEND FFMPEG_LIBRARIES ${LIB_NAME}) endforeach()find_library( log-liblog )add_library( ffmpeg_v4_native-libSHAREDnative-lib.cpp )target_link_libraries(ffmpeg_v4_native-lib#ffmpeg链接到native-lib${FFMPEG_LIBRARIES}${log-lib}android )在build.gradle中关联CmakeLists.txt externalNativeBuild {cmake {path src/main/cpp/CMakeLists.txt} }2、封装命令行方法 此步骤依赖第三章 生成的包libffmpeg.so是ffmpeg可执行程序笔者将其生成了so。 新建一个cpp文件用于实现ffmpeg命令行的调用。 1、导入main符号 // 导入ffmpeg的main符号,直接jni或者ffi调用也行但是需要解决一个问题ffmpeg内部会调用exit退出进程在安卓会导致Activity退出。 //目前本文件的解决方案是在exit过程中抛出c异常并捕获中断后续退出操作。 extern C int main(int argc, char **argv);2、将字符串解析为argc、argv 参考C 将字符串解析为argc、argv 3、注册log回调输出安卓日志 输出安卓日志方便调试。 // 自定义的日志回调函数输入安卓日志 av_log_set_callback([](void *avcl, int level, const char *fmt, va_list vl){if (level 0)level 0xff;if (level av_log_get_level())return;AVBPrint part;av_bprint_init(part, 0, 65536);av_vbprintf(part, fmt, vl);//打印安卓日志标签为ffmpeg__android_log_print(ANDROID_LOG_INFO, ffmpeg, %s, part.str);av_bprint_finalize(part, NULL); });4、阻止exit退出 ffmpeg中有大量异常流程会调用exit会导致整个进程退出所以需要阻止这种情况我们可以注册atexit并抛出异常中断exit操作。 atexit([](){ throw 0; });try catch中捕获异常避免程序终止。 try {// 调用ffmpeg的mainreturn main(argv.size(), argv.data()); } catch (...) { //main里面调用了exit会走到这里。 }完整代码 在native-lib.cpp中加入如下代码 #include jni.h #include dlfcn.h #include android/log.h #include mutex #include iostream #include sstream #include vector #include string extern C { #include libavutil/log.h #include libavutil/bprint.h } // 导入ffmpeg的main符号,直接jni或者ffi调用也行但是需要解决一个问题ffmpeg内部会调用exit退出进程在安卓会导致Activity退出。 //目前本文件的解决方案是在exit过程中抛出c异常并捕获中断后续退出操作。 extern C int main(int argc, char **argv); static std::vectorstd::string split(const std::string str, char delim); static std::vectorstd::string parseArgv(const std::string str); static bool _isFFmpegInit false; static std::mutex _mtx; // 调用ffmpeg命令行参数是命令行,例如ffmpeg --version extern C int ffmpeg_exec(char *shell) {if (!_isFFmpegInit){std::unique_lockstd::mutex lck(_mtx);if (!_isFFmpegInit){// 自定义的日志回调函数av_log_set_callback([](void *avcl, int level, const char *fmt, va_list vl){if (level 0)level 0xff;if (level av_log_get_level())return;AVBPrint part;av_bprint_init(part, 0, 65536);av_vbprintf(part, fmt, vl);__android_log_print(ANDROID_LOG_INFO, ffmpeg, %s, part.str);av_bprint_finalize(part, NULL); });// 注册退出回调在回调触发异常阻止ffmpeg调用exit进程退出。atexit([](){ throw 0; });_isFFmpegInit true;}}try{// 解析命令行auto strArgv parseArgv(shell);std::vectorchar * argv;for (int i 0; i strArgv.size(); i)argv.push_back((char *)strArgv[i].c_str());// 调用ffmpeg的mainreturn main(argv.size(), argv.data());}catch (...){}return -1; }static std::vectorstd::string split(const std::string str, char delim) {std::vectorstd::string tokens;std::istringstream iss(str);std::string token;while (std::getline(iss, token, delim))if (!token.empty())tokens.push_back(token);return tokens; } static std::vectorstd::string parseArgv(const std::string str) {std::vectorstd::string args;int n 0;for (auto i : split(str, )){if (n % 2 0)for (auto j : split(i, ))args.push_back(j);elseargs.push_back(i);}return args; }3、dart ffi调用 导入方法上一步生成的库名称是libffmpeg_v4_native-lib.so里面提供的符号是ffmpeg_exec。 import package:ffi/ffi.dart; import dart:ffi; final int Function(PointerUtf8 shell) _ffmpeg_exec DynamicLibrary.open(libffmpeg_v4_native-lib.so).lookupNativeFunctionInt32 Function(PointerUtf8)(ffmpeg_exec).asFunction(isLeaf: true);封装成dart方法 //执行ffmpeg命令行。 int ffmpegExec(String s) {final cmd s.toNativeUtf8();final ret _ffmpeg_exec(cmd);malloc.free(cmd);return ret; }4、java jni调用 查找android使用jna调用so的方法。按上述步骤生成的so名称为libffmpeg_v4_native-lib.so符号对应java为int ffmpeg_exec(String s) 三、完整代码 flutter示例项目已加入第二章生成好的包里。 四、使用示例 1、flutter调用命令行rtsp拉流 作为测试命令-f以及输出为空 Futurevoid main() async {ffmpegExec(ffmpeg -rtsp_transport tcp -i rtsp://rtspstream:a4388c5a3f8c06031368479b29087a09zephyr.rtsp.stream/movie -vcodec copy -f null _ );runApp(const MyApp()); }效果预览 总结 以上就是今天讲述的内容ffmpeg的so部署还是比较容易的但是命令行的调用会麻烦一些尤其是要解决ffmpeg退出问题在c中比较好解决java理论上也比较好实现如果在dart中则会比较麻烦因为dart的方法通常不能跨线程调用多线程的情况会出问题。 附录 1、dart将字符串解析为argc、argv //将字符串解析为argv ListString _stringToArgv(String input) {// 使用正则表达式分割字符串// 这里使用了简单的空白字符分割但是不会处理引号内的空格var parts input.split(RegExp(r\s));// 处理引号内的文本var argv String[];for (var part in parts) {if (part.startsWith() part.endsWith()) {// 去除引号argv.add(part.substring(1, part.length - 1));} else if (part.isNotEmpty) {argv.add(part);}}return argv; }将字符串数组转为native type的argc、argv。 下列代码资源释放略 final args _stringToArgv(s); final argcargs.length; final argv calloc.allocatePointerChar(sizeOfPointer() * (args.length));for (int i 0; i args.length; i) {argv[i] args[i].toNativeUtf8().cast();}
http://www.hkea.cn/news/14310566/

相关文章:

  • 自己怎样做网站平台云南医疗seo整站优化
  • 电子商务网站建设人才调研sem是什么分析方法
  • 好的网站怎么建设网页游戏排行榜知乎
  • asp网站管理系统西安网站搭建公司
  • 中国站长站官网建设部网站怎么查安全员
  • 《网站建设教程孔夫子旧书网网站谁做的
  • 网站怎么制作视频android开发 网站开发
  • 有名的网站网站建设赶集网
  • 做长图网站wordpress 占用内存
  • 公关公司多少钱一个月昆明seo培训
  • 衡水提供网站制作公司哪家好企业账号登录入口
  • 网站建设合同书封皮广东省住房和城乡建设厅官网网址
  • 教育机构网站建设做的网站每年需要续费
  • 做企业门户网站要准备哪些内容网站做几级等保
  • 查询网站最新域名wordpress 地址栏
  • 学校网站建设机构2021十大网络舆情案例
  • 甘肃省建设银行校园招聘网站五金企业网站模板
  • 网站用什么好注册一个免费的网站
  • 建设银行官网首页网站公告公司域名备案
  • 国外做展台搭建的设计网站怎么查看网站是哪个公司做的
  • 温州建站软件企业网络推广多喜爱
  • 医院网站建设预算表seo关键词词库
  • 香蜜湖网站建设php html转 wordpress
  • 出国越南做网站8000保底自己做的网站 能收索么
  • 网站建设 响应式 北京做网站要求什么软件
  • 建立网站信息发布登记制度手机网站开发存储数据
  • 万户网络做网站怎么样自己开发网站要多少钱
  • 让网站会员做产品标签确认网站策划职业规划
  • 建网站多少钱 万户网站制作过程合理步骤是什么
  • 二手书的网站建设怎么修改地图的公司地址