编辑
2024-12-17
工作知识
0

在平时调试过程中,经常会遇到编译的-O参数选择问题,作为这个小知识点,通过查阅资料,学习,总结如下:

总共的选项包括:-O/-O1, -O2, -O3, -O0, -Os, -Ofast, -Og, -Oz

-O/-O1 相对于O0,减少了代码体积,提升性能 代价是花费更多的编译时间和内存 -O2 相对于O1,花费较多的编译时间和内存空间,尽可能的提升代码的性能。增加的参数在参考链接可查 -O3 在O2上更进一步优化,花费更多的编译时间和更多的内存,但不保证代码因为优化导致的异常运行 -O0 默认选择的优化,其编译耗时最短,但也尽量开启了一下优化 -Os 在O2基础上,取消了对于空间换性能的参数,来追求二进制的体积 -Ofast 在O3上,启动更多的优化,比O3优化更不可靠 -Og 优化调试体验,在O1上去除了一些干扰调试的参数 -Oz 更加极致的优化空间,通过更多的指令才换取更小的二进制

参考:

https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

编辑
2024-12-17
工作知识
0

ffmpeg的测试命令

# 设置log等级 ffmpeg -y -loglevel 48 # 软编码 ffmpeg -y -f v4l2 -channel 0 -video_size 640x480 -i /dev/video10 \ -r 60 -b:v 1500k -c:v libx264 test.mp4 •可用的bit流 :ffmpeg -bsfs •可用的编解码器:ffmpeg -codecs •可用的解码器:ffmpeg -decoders •可用的编码器:ffmpeg -encoders •可用的过滤器:ffmpeg -filters •可用的视频格式:ffmpeg -formats •可用的声道布局:ffmpeg -layouts •可用的license:ffmpeg -L •可用的像素格式:ffmpeg -pix_fmts •可用的协议:ffmpeg -protocols ffmpeg -decoders | grep "^ V" ffmpeg -encoders | grep "^ V" # 播放rtsp地址 rtsp://172.25.81.135:554/user=admin&password=&channel=1&stream=0.dsp? 是rtsp播放地址 ffplay -vcodec h264_rkmpp -rtsp_transport tcp "rtsp://172.25.81.135:554/user=admin&password=&channel=1&stream=0.dsp?"

自己搭建的rtsp流播放

RTSP 简易服务器

https://github.com/aler9/rtsp-simple-server

./rtsp-simple-server 运行服务器 ffmpeg -re -i Forrest_Gump_IMAX.mp4 -c copy -f rtsp rtsp://localhost:8554/test_stream 推流 ffplay -rtsp_transport tcp "rtsp://172.25.80.136:8554/test_stream" 播放

gstreamer的测试命令

# gst-launch 播放视频(h264) gst-launch-1.0 filesrc location=/home/kylin/Forrest_Gump_IMAX.mp4 \ ! qtdemux ! h264parse ! mppvideodec ! rkximagesink # 播放测试视频 gst-launch-1.0 -v videotestsrc pattern=snow ! video/x-raw,\ width=1280,heigh=720 ! rkximagesink # uridecodebin 播放视频 gst-launch-1.0 uridecodebin \ uri=file:///home/kylin/Forrest_Gump_IMAX.mp4 ! rkximagesink # 用mpph264enc编码测试视频为ts gst-launch-1.0 videotestsrc num-buffers=512 ! \ video/x-raw,format=NV12,width=1920,height= 1080,framerate=30/1 ! \ queue ! mpph264enc ! queue ! h264parse ! mpegtsmux ! \ filesink location=/home/kylin/2k.ts # 编码h264 gst-launch-1.0 -v uridecodebin \ uri=file:///home/kylin/Forrest_Gump_IMAX.mp4 ! queue ! \ videoconvert ! mpph264enc ! mpegtsmux ! filesink location=out.h264 # 编码vp8 gst-launch-1.0 -v uridecodebin \ uri=file:///home/kylin/Forrest_Gump_IMAX.mp4 ! queue ! \ videoconvert ! mppvp8enc ! qtmux ! filesink location=out.vp8 # 播放 gst-launch-1.0 uridecodebin uri=file:///home/kylin/out.vp8 ! \ rkximagesink gst-launch-1.0 uridecodebin uri=file:///home/kylin/out.h264 ! \ rkximagesink # jpeg编解码 gst-launch-1.0 -v videotestsrc ! \ "video/x-raw,width=1920,height=1080" ! queue ! jpegenc ! queue ! \ jpegparse ! queue ! mppjpegdec ! rkximagesink gst-launch-1.0 -v videotestsrc ! \ "video/x-raw,width=1920,height=1080" ! queue ! mppjpegenc ! \ queue ! jpegparse ! queue ! jpegdec ! xvimagesink # 播放rtsp地址 rtsp://172.25.81.135:554/user=admin&password=&channel=1&stream=0.dsp? 是rtsp播放地址 gst-launch-1.0 playbin uri="rtsp://172.25.81.135:554/user=admin&password=&channel=1&stream=0.dsp?"
编辑
2024-12-17
工作知识
0

对于在Linux上测试TCP/IP的端口是否连通,这里可以使用nc和ss命令搭配。方法很简单,如下:

一:启动udp端口监听

sudo nc -lu 554

二:连接udp端口

nc -uv 172.25.80.122 554
如果这时候正常了,也就可以利用了udp的554端口进行通信了。

三:查看连接状态

554端口的机器:

~# ss -u Recv-Q Send-Q Local Address:Port Peer Address:Port Process 0 0 172.25.80.122:rtsp 172.25.80.124:36471

连接554端口的机器:

~$ ss -u Recv-Q Send-Q Local Address:Port Peer Address:Port Process 0 0 172.25.80.124:36471 172.25.80.122:rtsp

四:tcp连接

tcp的判断方法很多,如果通过nc命令,与上述差不多,只需要把u改成t就行。

sudo nc -lt 554 nc -tv 172.25.80.122 554

其他方法就不列举了。

编辑
2024-12-17
工作知识
0

一:宏扩展出错

#define FUN(x) 1 + x * x int main() {         printf("%d\n", 3*FUN(1)); return 0; }

这里宏扩展成了 31+11。并不是3*(1+1)。 为了避免这种出错,尽量在宏这里使用括号
#define FUN(x) (1 + x * x)

二:宏内部扩展出错

#define FUN(x) (x*x) int main() { printf("%d\n", FUN(1+1)); return 0; }

这里宏内部扩展成了(1+11+1)。并不是((1+1)(1+1)) 为了避免这种错误,尽量在宏的变量处添加括号
#define FUN(x) ((x)*(x)) 三:宏变量自加/自减出错

#define FUN(x) (x*x) int main() { int i=2; printf("%d\n", FUN(i++)); return 0; }

这里输出是6,也就是2*3,因为i自加了为了避免这种错误,自加/自减不要在宏扩展里面用。
四:宏函数扩展错误

#define FUN(x) x=10;x+=1 int main() { int i=2; if (i == 1) FUN(i); printf("%d\n", i); return 0; }

这里因为if没有缺省括号,导致宏扩展后,x+=1在if外面了。所以输出是3而不是2 为了避免这种错误,可以使用do while写法如下 #define FUN(x) do{x=10;x+=1;}while(0)

参考:《深入C语言和程序运行原理》

编辑
2024-12-17
工作知识
0

常规命令如下:

rpm -qi 包名 查看一个包的详细信息 rpm -qf 文件名 查看一个文件是由哪个包安装的 rpm -ql 包名 查看一个包安装了哪些文件 rpm -qa 查看系统中安装了哪些包 rpm -e 删除包rpm -ivh 安装包 rpm -Uvh 升级包 rpm -i --nodeps 安装某个包有依赖关系时,忽略依赖关系,强制安装 rpm -Uvh xxx.rpm --nodeps --force 强制的

rpm降级版本安装

rpm -Uvh --oldpackage xxx.rpm

查看RPM包里的内容
如果只相知道包里的文件列表执行:

rpm -qpl packetname

如果想要导出包里的内容,而不是安装,那么执行:

rpm2cpio pkgname | cpio -ivd 

rpm编译

1. 执行rpm -i you-package.src.rpm  2. cd /usr/src/redhat/SPECS (前两步和方法一相同)  3. rpmbuild -bb your-package.specs 一个和你的软件包同名的specs文件 -ba 既生成src.rpm又生成二进制rpm  -bs 只生成src的rpm  -bb 只生二进制的rpm  -bp 执行到pre  -bc 执行到 build段  -bi 执行install段  -bl 检测有文件没包含

spec文件

%pre rpm安装前执行的脚本 %post rpm安装后执行的脚本 %preun rpm卸载前执行的脚本 %postun rpm卸载后执行的脚本

arm可以找rpm包的网站

https://pkgs.org/
https://cbs.centos.org/koji/index
https://dl.fedoraproject.org/pub/epel/7/