centos android ndk(centos官网)
FFmpeg4.2.2 交叉编译
这两天一直在编译FFmpeg库,实话真是踩坑不少,也知道了遇见问题该如何排错,所以还是打算记录下,也算是一个总结.
配置环境:使用CentOS 8系统,并下载了android-ndk-r17c和ffmpeg-4.2.2版本.务必下载linux版的NDK,通过wget命令下载到Linux系统中.
配置参数:使用./configure--help查看帮助选项,根据这些选项配置FFmpeg脚本.编译过程就是对配置的修改.
学习资源:推荐相关学习资料,免费报名课程,链接在文章中.提供音视频免费学习地址,包括FFmpeg、WebRTC、RTMP、NDK、Android音视频流媒体高级开发等.
编译脚本示例:编写Shell脚本用于动态配置,如针对arm64-v8a架构.遇到的坑包括arm-linux-androideabi-gcc无法创建可执行文件,以及config.mak文件未生成等问题,解决方法在文章中详细说明.
生成目标文件:生成指定架构的库文件,如arm64-v8a.生成后在lib、include、share目录下存放相关文件.若未生成,检查配置问题并查看config.log获取错误信息.
库文件下载与压缩:可以使用其他工具下载或通过命令如lrzsz下载生成的库文件.将库文件和头文件复制到对应目录,修改CMakeLists.txt和build.gradle文件以适应Android环境.
移植与测试:移植FFmpeg库到Android中,修改CMakeLists.txt以指定输出的ABI,添加ndk闭包配置以避免混淆不同架构的库,并在cpp中添加测试代码以验证编译与移植成功.
总结:在编译FFmpeg的过程中,会遇到很多坑,每个版本的Shell脚本编写方式都有所不同.建议先复习Shell相关知识,参考教程和踩坑经验以顺利编译.
php swoole 只能运行在php-cli 环境吗
一直想写点Swoole的东西,毕竟它重新定义了php,却一直不知道怎么下手写Swoole涉及的知识点非常多,互为表里,每次想写都发现根本理不出一个头绪Swoole是一个php的扩展,它的核心目的就是解决php在实现server服务中可能遇到的一系列问题,这些问题用源生的php往往并不能很高效(执行效率)的解决,一般也不会使用php来解决,所以会有说swolle重新定义的php的说法。
其实swoole也提供了一个框架,swoole framework是基于swoole extension设计的一个框架,要用好这个框架,还是要先了解swoole extension。
扩展的英文名称是Extension,php扩展是用C语言作为开发语言,基于Zend引擎提供的API,编译成的一个动态库。
如果曾经做过类似动态库调用开发的童鞋可能会更好理解一些,例如Android中的NDK开发在php的配置文件中配置好extension的属性后,就可以引用这个动态库了。
也就是说,swoole本身是用C语言编写的,它可以让php获得一些额外的function。
然后是运行方式,swoole的许多功能都只能运行在cli模式下,而cli模式往往是很多刚接触swoole的phper遇到的第一个问题。
有时候其实只是需要转变一下思路
我们现在整理一下最常见的php代码执行方式:
安装apache、php
配置apache对那个目录进行php解析
用浏览器访问那个目录的php文件
更多的细节这里就不提了,毕竟我相信每个phper对这个都是很熟悉的。
但这里就开始出现了第一个问题,我们知道,php是一个脚本语言,脚本语言的核心特点在于不用编译,随时执行,而执行脚本的工具就是解析器,而php的解析器就是zend引擎。
严格来说,zend并不是唯一的选择,不过,zend是最官方的。另外,Zend Studio和Zend Engine不是同一个东西,本文中的Zend全部指Zend Engine。
换个角度讲,只要有解析器,写好的php脚本就是可以执行的,而zend引擎与apache之间并没有绝对的关系实际上,apahce是调用了zend对php脚本进行执行,然后将执行结果输出给了浏览器所以所谓cli模式(CommandLine,命令行模式),其实就是在命令行下直接调用zend引擎对php脚本进行解析并执行,并获得程序输出结果的php脚本执行方式。
其实php也可以作为shell脚本来使用哦,就像bash shell一样既然问题讲清楚了,在一个系统中具体怎么操作呢?
本文以CentOS 7.5作为系统环境,swoole是针对linux系统开发的,windows下并不适用。学习swoole的一个前题是懂得基本的linux系统使用。
当安装好php的时候,找到php的安装目录,如果是默认安装的话,可以试试whereis命令#某种简单的方法
whereis php
>/usr/local/bin/php;
locate whereis find这些命令都可以试试,目的是找到php然后我们来写一个最经典的php脚本:
<?php
//vi hello_cli.php
echo'Hello PHP Cli';
编写纯php脚本时,php标签不要封口
然后我们在shell里执行它:
/usr/local/bin/php hello_cli.php
> Hello PHP Cli
这段代码中的第一个php,是一个可执行文件,它接受一个php脚本文件作为输入参数,并解析执行这个php脚本文件(通过zend)。
没有错,第一个cli模式下的php程序就被你执行成功了!
默认情况下,php都会被安装在了$PATH的目录下,那就可以直接省略路径前缀了,下文中调用php的时候,全都省略了路径前缀。
因为swoole是pecl的项目,所以使用pecl安装是最简单的方法,强烈推荐第一次接触的童鞋先使用pecl安装,在熟悉了swoole之后,再考虑使用编译安装的方式以获取更多进阶功能。
pecl这个工具基本都会被安装在与php相同的目录下(往往也都是$PATH目录)pecl install swoole
执行以下命令查看是否安装成功:
php-m| grep swoole
> swoole
如果正确的输出了swoole,那么恭喜你,这次安装很成功另一个常见的比较麻烦的问题是,有些童鞋的电脑里安装了多个php,而安装的时候没有正确的安装到预期的php的扩展目录中,就会导致无法正常工作,解决方案就是弄清楚各个php安装目录及配置关系,选择正确的目录进行安装。
其实本文还没正式开始介绍swoole,都是在学习swoole之前的准备工作,swoole的上手门槛比一般的php应用要高的多,如果没有网络开发和操作系统方面的一些知识,学习它并不是一件容易的事情,学习曲线很陡峭。
这句话我在群里说了无数次
很多新手会诟病swoole的手册写的太模糊,其实是前置知识不足,而手册也给出了需要的前置知识列表,以下引用至官网的手册-学习swoole需要哪些知识?
多进程/多线程
了解Linux操作系统进程和线程的概念
了解Linux进程/线程切换调度的基本知识
了解进程间通信的基本知识,如管道、UnixSocket、消息队列、共享内存socket
了解SOCKET的基本操作如accept/connect、send/recv、close、listen、bind了解SOCKET的接收缓存区、发送缓存区、阻塞/非阻塞、超时等概念IO复用
了解select/poll/epoll
了解基于select/epoll实现的事件循环,Reactor模型了解可读事件、可写事件
TCP/IP网络协议
了解TCP/IP协议
了解TCP、UDP传输协议
调试工具
使用gdb调试Linux程序
使用strace跟踪进程的系统调用
使用tcpdump跟踪网络通信过程
其他Linux系统工具,如ps、lsof、top、vmstat、netstat、sar、ss等学习并理解一个新事务并不是一个容易的事情,特别对于swoole这种具备一定颠覆性的工具,要有耐心和实践。
淡定的把手册看完,遇到不理解的名词学会使用搜索引擎学习,swoole的手册其实是个大宝库,网络开发常见的问题其实里边都涉及到了。
Node服务端使用ffmpeg
背景
为了在Node服务端使用ffmpeg,可以借助于node-fluent-ffmpeg包。该包可以将ffmpeg命令抽象成npm包的形式,使得在Node环境中调用ffmpeg变得简单方便。但需要注意的是,直接使用node-ffmpeg-installer安装的ffmpeg版本可能较老,因此推荐使用ffmpeg-static,它提供了较新的ffmpeg版本,并且支持多个操作系统。
ffmpeg的下载与配置
ffmpeg是一个强大的多媒体框架,提供了丰富的编解码功能。在不同操作系统下,通过下载与配置可安装ffmpeg。
在CentOS Linux下,可采用下载解压的方法进行安装。进入解压目录后,通过修改安装路径(如/usr/local/ffmpeg)来配置ffmpeg的安装位置。接着,设置环境变量以使系统能识别ffmpeg路径。最后,执行配置参数编译命令,完成ffmpeg的安装。
错误解决与优化
在ffmpeg的使用过程中,可能会遇到各种问题。例如,yasm/nasm未找到或版本过旧的问题,可通过安装yasm来解决。libavdevice.so.58与libasound.so.2问题则是与依赖库相关,需要检查并安装相应的库文件。对于zsh中找不到匹配的rtmp问题,需要进一步检查环境配置。
构建与优化RPM包
在CentOS环境下使用ffmpeg进行RTMP推流时,可能会遇到一系列问题。例如,更新头部信息与RTMP推流相关的错误,这些问题往往与ffmpeg内部时间基计算相关。解决这些问题需要仔细检查 ffmpeg API的使用,特别是av_interleaved_write_frame推流函数的使用及AVPacket包的管理。
音视频流媒体开发学习资源
对于希望深入学习音视频流媒体开发的开发者,推荐参加免费的音视频学习课程,通过这些课程可以获取FFmpeg、WebRTC、RTMP、NDK、Android音视频流媒体高级开发等领域的知识。同时,免费提供音视频学习资料包、大厂面试题、技术视频和学习路线图等资源,帮助开发者建立系统化的学习路径。
ffmpeg推流优化技巧
在使用ffmpeg进行RTMP推流时,需要注意一些优化技巧以提高效率和稳定性。例如,解决音频重采用播放重叠问题、处理音频推流时音频不正常的问题,以及通过API进行RTMP推流时确保音视频首包正确性。此外,长时间推流时可能出现RTMP_Write阻塞,可以尝试增加超时回调函数来解决。
总结
通过合理选择ffmpeg版本、正确安装与配置、以及有效解决常见问题,可以在Node服务端高效地使用ffmpeg进行音视频处理。同时,不断学习和优化相关技术,可以有效提升音视频流媒体应用的质量与性能。