自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(21)
  • 收藏
  • 关注

原创 【Apollo 6.0】cyber rt协程实现

cyber协程在【Apollo 6.0】 cyber rt是如何使用Reader读取到Writer发送的数据(顶层逻辑) 中,分析到Reader::Init() 的时候,里面使用了协程进行事件处理,那这个协程是怎么实现的呢,这里我们就来分析一下:auto sched = scheduler::Instance();Scheduler* Instance() { Scheduler* obj = instance.load(std::memory_order_acquire); if (obj

2022-03-12 15:46:48 3036

原创 【Apollo 6.0】服务发现 cyber rt是如何进行节点间管理的

服务发现在上一章中我们分析了底层通信的流程,其中对于服务发现部分我们没有进行分析,这里我们来分析一下。上一章中对于reader和writer,在init的时候,都会调用JoinTheTopology加入服务的拓扑:void Reader<MessageT>::JoinTheTopology() { // add listener change_conn_ = channel_manager_->AddChangeListener(std::bind( &R

2022-03-06 11:20:22 1499

原创 【Apollo 6.0】 cyber rt是如何使用Reader读取到Writer发送的数据(底层逻辑)

Reader是如何读取到Writer的数据(底层逻辑)上一篇文章(上层逻辑)中讲了reader读取数据的流程,但是里面没有讲到底层的Tansport是这么进行进程间通信,这里我们来解析一下。在ReceiverManager::GetReceiver调用了transport::Transport::Instance()->CreateReceiver进行Receiver的创建:template <typename M>auto Transport::CreateReceiver(

2022-03-05 23:29:33 1782

原创 【Apollo 6.0】 cyber rt是如何使用Reader读取到Writer发送的数据(顶层逻辑)

Reader是如何读取到Writer的数据(顶层逻辑)​ 对于reader的创建,一般都是是有Node进行创建,比如说在Component类当中(Component最多可以同时处理四种消息类型,这里我们就选择一种数据类型来讲解):reader = node_->CreateReader<M0>(reader_cfg)​ 因此我们可以分析Node::CreateReader是如何创建出一个Reader的:template <typename MessageT>au

2022-03-05 19:31:32 2580

原创 利用堆,合并有序文件

#include <iostream>#include <vector>#include <string>#include <fstream>struct Node{ int num; int fileNum;};void swap(Node &i,Node &j){ Node tmp = i; i = j; j = tmp;}void fttb_heap(std::vect..

2022-01-15 15:47:29 322

原创 交叉编译boost context出现的问题

在上一篇文章中使用boost协程搭建tcp服务器,我介绍了怎么使用协程来搭建tcp服务,其中需要连接的库有boost_coroutine,boost_coroutine还使用到了libboost_context。当编写完代码后,我在ubuntu中运行没有问题,因此我就想要将其放到我的嵌入式设备当中运行,结果发现了问题。交叉编译脚本:我这里使用的是boost_1_78_0#!/bin/bashCROSS_COMPILE=$1CXX=${CR...

2021-12-29 13:52:05 2158 1

原创 使用boost协程搭建tcp服务器

在以前的项目中,使用过boost::asio来搭建Tcp服务器,最近有个新的项目也需要搭建服务器,因此想要将以前代码移植过来。原先的项目使用的是异步回调函数的方式进行搭建的,回想起来,当时写回调函数,和处理读写buffer时艰难的岁月,因此想要重新构建原先的架构。经过查找资料,发现可以使用boost的协程来实现,可以把异步处理成跟同步的效果。 先看一段代码:void do_read(void) { auto sel...

2021-12-25 18:50:47 3211

原创 海思3536输出PCM多路混音

由于项目需求,需要将进行多路混音的功能。对于海思音频库的处理程序//初始化int AudioInit(AIO_MODE_E enWorkmode){ HI_S32 s32Ret = HI_SUCCESS; ADEC_CHN AdChn = 0; AUDIO_DEV AoDev = 0; ADEC_CHN_ATTR_S stAdecAttr; ADEC_ATTR_AAC_S stAdecAac; stAdecAttr.enType = PT_AAC; stAdecA

2021-01-21 11:22:41 1397 3

原创 QML使用QAbstractListModel时遇到奔溃问题

在使用QAbstractListModel创建model的时候,其他使用的时候都正常,但是只要我一使用 beginResetModel();和endResetModel();更新整个model的数据的时候,程序就会奔溃。先看代码:qml中,通过index从model中获取isOnline的值isOnline:$avIntercomModel.getIsOnline(index)cpp中,从保存的数据当中,根据index返回数据:bool AvIntercomModel::getIsOnline(

2020-11-20 15:56:34 948

原创 YUYV(YUV422)转YUV420算法

最近需要将摄像头采集到的YUYV数据转换为YUV420,在网上找了很多算法,发现写的比较复杂,因此自己写了两个,仅供参考:void YUV422To420P(char *yuv422, char *yuv420,int i32Height ,int i32Width ) { if( yuv422 == nullptr || yuv420 == nullptr ) { return; } char *y = nullptr;

2020-10-24 09:23:23 1872

原创 海思3536编码H264接口HI_MPI_VENC_SendFrame不能连续调用的问题

#HI3536编码接口HI_MPI_VENC_SendFrame不能连续调用的问题最近在做一个音视频对接的功能,需要将摄像头取到的YUV数据编码为H264的,由于摄像头采到的YUV为YUYV,而H264需要用到420进行编码,因此需要将YUYV转为YUV420格式。在将YUYV转为YUV420之后,打算使用HI3536的编码接口HI_MPI_VENC_SendFrame将YUV编码为H264,但是在使用之后发现一个问题:只有在第一次调用该接口的时候才会成功,后面都会返回错误码:0xA0088003(参数

2020-10-15 10:57:59 2643 4

原创 QT + FFMPEG实现基本播放器(五):音频视频同步

QT + FFMPEG实现基本播放器(五):音频视频同步该文章主要参考:https://www.cnblogs.com/leisure_chn/p/10284653.html对于音视频播放来说,如果不进行同步的话,即使在视频开头是同步的,但是播放到后面肯定会出现不同步的现象。视频是按帧播放,图像显示设备每次显示一帧画面,视频播放速度由帧率确定,帧率指示每秒显示多少帧;音频按采样点播放,声音播放设备每次播放一个采样点,声音播放速度由采样率确定,采样率指示每秒播放多少个采样点。如果仅仅是视频按帧率播放,音

2020-08-04 15:20:19 1861 1

原创 QT + FFMPEG实现基本播放器(四):音频播放实现

QT + FFMPEG实现基本播放器(四):音频播放实现对于音频这里采用两种播放方式,一种使用QT的QAudioOutput,另一种使用SDL进行音频播放。在使用QAudioOutput的时候需要在pro文件中添加 QT += multimedia对于音频来说需要设置其相关的如声道,采样率,位数等参数:bool AudioThread::Start(){ Stop(); m_IsRuning = true;#ifndef _USE_SDL_ //使用QAu

2020-08-04 14:53:19 2305 2

原创 QT + FFMPEG实现基本播放器(三):视频播放实现

QT + FFMPEG实现基本播放器(三):视频播放实现在 《QT + FFMPEG实现基本播放器(二):FFMPEG解码功能实现》中,将所有avPacket放入到了全局的一个结构体的队列当中 g_MedieInfo.m_VideoPacketQueue.push(avPacket);因此可以实现视频的播放线程,从队列当中取出数据,从而可以将avPacket解码成原始的数据,从而将其转为QImage,发送到VideoWidget中进行显示:VideoThread继承QThread,因此主要实现run函

2020-08-04 11:11:24 1315

原创 QT + FFMPEG实现基本播放器(二):FFMPEG解码功能实现

QT + FFMPEG实现基本播放器(二):FFMPEG解码功能实现对于视频的解码模块,使用FFMPEG进行实现。将在上一节中实现的OpenFileHanle槽函数中,增加以下的代码,将提取到的文件名称,传给FFmpegThread,FFmpegThread使用单例模式管理FFMPEGint ret = FFmpegThread::Get()->OpenFile((const char *)strFileName.toLocal8Bit());if(ret < 0){ QMe

2020-07-28 14:26:22 1485

原创 QT + FFMPEG实现基本播放器(一):播放器基础界面实现

QT + FFMPEG实现基本播放器(一):播放器基础界面实现使用QT制作播放器的界面,界面使用QOpenGLWidget进行视频显示,将视频的每帧数据转为QImage,然后发送给Widget将QImage显示出来。想要将QImage显示在Widget上的话,需要重写panitEvent事件:void VideoWidget::paintEvent(QPaintEvent * /*e*/){ if (m_Image.isNull()) { return; }

2020-07-28 11:06:15 1958 2

原创 poll机制源码详解

要分析poll机制就得分析系统调用的sys_poll内核调用poll流程:进入sys_poll():asmlinkage long sys_poll(struct pollfd __user *ufds, unsigned int nfds, long timeout_msecs){ s64 timeout_jiffies; /*设置超时时间*/ if (timeout_msecs > 0) {#if HZ > 1000 /* We can only o

2020-06-27 20:36:16 554

原创 在海思平台下,交叉编译boost库、thrift库、openssl库、libevent库

编译openssl:1.下载openssl源码,我这里的为openssl-1.0.2o.tar.gz2. 解压到指定目录,tar xzfopenssl-1.0.2o.tar.gz -C /home/up3. 进入/home/up/openssl-1.0.2o4. 执行./config no-asm -fPIC shared --prefix=/home/up/openssl-...

2019-10-07 21:27:38 1857

原创 在海思平台下,使用boost与thrift编写服务器

公司有个项目,需要做一个服务器,我这边准备使用Boost作为网络通信的框架,然后再使用thrift作为进程间通信的接口,使用到的Boost版本为:boost_1_67_0,thrift版本为:thrift-0.11.0,thrift使用的是以前项目编译成的静态库。 在写服务器之前,需要对Boost与thrift进行调研,因此就写了一个小demo进行测试。 ...

2019-09-26 09:58:08 581 1

原创 海思3536解码G711音频

海思3536解码G711音频最近的一个项目,需要增加对G711的解码功能。而HI3536这款芯片是支持对G711进行CPU软件编解码的,所有的解码功能都基于独立封装的海思音频解码库,核心解码器工作在用户态,使用 CPU 软件解码。对于海思的芯片来说,如果想要解码标准的G711音频数据的话,需要在G711音频数据流的每一帧前面都要加上一个海思的数据头,这样的G711音频数据才能被海思所解码。对于...

2019-08-13 10:29:08 2848

原创 制作Linux最小根文件系统

在学习了韦东山老师的制作最小根文件系统视频之后,记录下的笔记制作最小根文件系统需要的步骤:设置/dev/console 和 /dev/null 将busybox加载到linux中去 配置 /etc/inittab文件 配置inittab中的process程序(在最小系统中,可以没有用户程序) 加载c库制作流程:最先在虚拟机work目录下创建nfs_sec...

2019-08-13 10:28:04 985

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除