自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(70)
  • 资源 (1)
  • 收藏
  • 关注

原创 有限状态机与状态模式

先来看看我们编程时常见的一个例子enum Network_State { Net_Close, Net_Open, Net_Connect,};void operation(int state) { if (state == Net_Close) { // 。。。。 } else if (state == Net_Open) { // 。。。。 } else if (state == Net_Connect) {

2021-07-22 16:24:46 740

原创 缓冲区机制(生产者-消费者模式)

生产者、消费者模式是我们在编程时经常用到的一个编程方法。生产者是生产数据,提供原料的一方;消费是消耗数据,处理原料的一方。缓冲区的意义缓冲区一般是充当一个数据中转站的作用,使得生产数据和处理数据双方解耦合,各自分工。根据生产者和消费者的能力,进行均衡调整,使得系统高效配合工作。电脑中的缓冲例子:当CPU需要去读取磁盘数据时,因为CPU和磁盘的读写速度相差几个数量级,这样会导致CPU处于空等待状态,所以采用了一个缓冲机制,先将磁盘数据放到缓冲区,当数据读取完成后,再通知CPU从缓冲中取数据。从

2021-07-07 10:44:51 1624 1

原创 柔性数组例子

柔性数组例子#include <stdio.h>#include <stdlib.h>#include <string.h> struct player { int id; int age; char name[];}; int main () { // 柔性数组,结构中的最后一个元素为可变长数组,定义为[]或[0] // 只作为标识占位符,在sizeof()统计长度时不被计算其中 // 含有柔性数组的结构,通常只能在堆上生成

2021-07-05 00:44:18 202

原创 inline内联函数的意义

使用inline声明函数,表示建议编译器在编译时内联展开。何为内联展开?类似宏一样,直接将函数在调用的位置展开。1)inline声明后编译器一定会内联展开吗?不一定编译器会根据实际情况,如函数体大小,是否有循环、递归,函数调用是否频繁来决定。gcc编译器一般不会对内联函数展开,只有在优化级别开到-O2时,或设置属性强制展开;2)内联函数的意义如果一个函数很短,无循环、递归等复杂操作,且该函数经常被调用(指运行的次数多,而非调用的地址多);那么为了减少调用的开销(保存、恢复现场),将函数

2021-07-05 00:27:42 317

原创 如何规范地定义一个MAX宏?

如何规范地定义一个MAX宏?include <stdio.h> // 加括号,避免展开出错#define MAX(A, B) ((A)>(B)? (A):(B))// 避免自增问题, 如MAX(i++, j++);#define MAX_PRO1(A, B) ({ \ int a = A; \ int b = B; \ a > b ? a : b; \})// 兼容不同数据类型,且不用显式指定类型#define MAX_PRO3(A, B) ({

2021-07-05 00:16:16 584

原创 数码相册项目(带密码登陆,代码已开源)

一、前言数码相册项目是嵌入式系统课程的综合实验项目;总体来说,难度适中,是一个相对不错的练手项目。其中涉及的知识点有:搭建交叉编译工具链,编译内核和加载驱动,需要掌握链表数据结构的使用,以及一些Linux系统编程相关的技能(IO操作,input子系统,多线程等)。二、项目介绍项目设计文件下载:综合设计-数码相册-验收标准.pdf工程结构: . ---welcome.bmp // 欢迎界面 ---login.bmp // 密码登陆 ---picture

2021-06-25 21:51:44 1062 3

原创 RTSP实时监控项目:项目索引

RTSP服务器项目索引:1)RTSP服务器:RTSP协议介绍2)RTSP服务器:RTSP协议实现(与VLC交互)3)音视频数据处理:解析h264视频码流4)RTSP服务器:RTP打包传输H264码流5)音视频数据处理:解析AAC音频码流6)RTSP服务器:RTP打包传输AAC码流7)RTSP服务器:实现一个传输h264/aac的RTSP服务器8)RTSP服务器:RTP over TCP9)摄像头采集编码,保存到本地或推流10)RTSP服务器综合项目:rtsp实时监控Gitee项目地址

2021-06-25 17:52:08 786

原创 RTSP服务器综合项目:rtsp实时监控

点击 编写RTSP服务器:项目索引,回到目录。目标:添加摄像头采集编码和码流队列管理,完成实时监控功能。protocol.h添加采集相关设置// RTSP服务器测试#define RTSP_USE_RTP_H264 0 // rtsp传输h264#define RTSP_USE_RTP_H264_RT 1 // 实时监控// capture_h264.c采集相关设置#define MEDIA_DURATION 40#define CAMERA_DEV "/de.

2021-06-25 17:44:59 3876 1

原创 RTSP服务器:RTP over TCP

协议回顾RTP协议负责实际数据的传输。通常使用UDP来传送数据,但RTP也可以在TCP或ATM等其他协议之上工作。基于UDP的RTP和基于TCP的RTP各有千秋。如果需要低延时,可容忍部分数据丢失,选用UDP;如果需要可靠性高,对实时性要求不高,选用TCP。这里只简单地说明两者的优缺点,在具体项目中需要考虑的细节可能远不止上面几点。RTP/AVP & RTP/AVP/TCP推荐:https://www.jianshu.com/p/7b9793eb2f4eRTSP流(传输RTP包)的传输方

2021-06-24 23:53:02 1158

原创 RTSP服务器:一个传输h264/aac的RTSP服务器

糅合RTSP协议实现与RTP传输h264码流/RTP传输aac码流,即可实现一个传输h264码流的RTSP服务器。思路很简单。基于RTSP与VLC的交互流程,在接收到PLAY请求时,使用rtp_play_h264传输视频码流,或使用rtp_play_aac传输音频码流。①传输h264码流:do_client(client_sockfd, &client, rtp_fd, rtcp_fd, rtp_play_h264);②传输aac码流:do_client(client_sockfd, &am

2021-06-24 22:29:12 748

原创 RTSP服务器:RTP传输AAC流

参考文章:AAC音频码流解析RTP打包传输H264码流业务流程:1)读取ADTS头(7字节),解析得到aac帧的信息(频率,声道,帧长度)2)读取aac原始数据块,使用RTP打包aac原始数据RTP打包h264码流时,由于h264数据长度不稳定,少则几字节,多则几千字节,所以RTP打包形式较多,需要根据大小决定是否进行分片。而AAC数据块长度不会像h264那样变化,一般稳定在几百字节,所以它的打包方式比较单一。打包方式如下RTP包 = rtpheader(12字节) + 载荷标识

2021-06-24 18:48:23 1098 1

原创 RTSP服务器:RTSP协议实现(与vlc交互)

RTSP协议介绍,请参考:RTSP传输流过程分析协议实现过程:1)创建TCP连接,与VLC客户端连接。工作流程:创建tcp套接字,绑定端口,监听2)解析客户端请求客户端请求格式:method url vesion\r\nCSeq: x\r\nxxx\r\n...\r\n客户端的请求方法包括OPTIONS, DESCRIBE, SETUP, PLAY。。。分析:首先我们先解析得到请求方法method,对于SETUP之外的方法,我们只解析CSeq;而对于SETUP,我们需要将clie

2021-06-22 19:22:33 787 2

原创 RTSP服务器:RTP打包传输H264码流

H264码流与RTP协议分析1)H264码流由一个个NALU组成,每个NALU前面都有起始码(00 00 00 01或00 00 01),充当分隔符作用。每个NALU有1字节的头部信息。①NALU头信息(1字节)= 【forbidden_bit(恒为0),priority(优先级)2bit,type(类型)5bit】。②NALU的长度 = 下一个起始码位置 - 当前起始码位置 - 当前起始码长度(3/4字节)More:H264码流解析2)RTP = header + payload。RTP头部共

2021-06-15 17:15:19 1878 2

原创 Hi3518ev200:RTSP传输流过程分析

参数配置文件:/etc/ipc.ini启动监控命令:rtsp_server(摄像头作为RTSP服务器)RTSP介绍1)RTSP是一个应用层的实时传输流协议。通常说的RTSP包括RTSP协议、RTP协议、RTCP协议。它们的职责分工如下:RTSP协议负责服务器和客户端之间的请求与响应;RTP协议负责实际数据的传输。通常使用UDP来传送数据,但RTP也可以在TCP或ATM等其他协议之上工作。RTCP本身并不传输数据,但和RTP一起协作将多媒体数据打包和发送,为RTP传输提供反馈信息。2

2021-06-12 18:11:41 523 2

原创 Hi3518ev200:开发环境测试,运行sample/venc抓拍图片

开发环境依赖库和驱动(分别对应SDK中mpp目录下的lib和ko)驱动需要在运行代码前加载,驱动加载命令(/root/ko/loadhi3518e -i ov9732)可以直接添加到/etc/profile。mpp/sample下的例程:海思媒体处理平台主要分为视频输入(VI)、视频处理(VPSS)、视频编码(VENC)、视频解码(VDEC)、视频输出(VO)、视频侦测分析(VDA)、音频输入(AI)、音频输出(AO)、音频编码(AENC)、音频解码(ADEC)、区域管理(REGION)等模

2021-06-11 23:20:53 375 1

原创 Hi3518ev200:内核启动分析

1)从DDR地址0x82000000加载内核镜像hisilicon # bootm 82000000## Booting kernel from Legacy Image at 82000000 ... Image Name: Linux-4.9.37 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 2206715 Bytes = 2.1 MiB Load Address: 80008000

2021-06-06 16:40:56 850

原创 Hi3518ev200:uboot分析

1)Flash分区从《byun hawkeye刷机与配网》我们知道,Flash分区划分如下:分区地址范围空间大小uboot0x0 ~ 0x80000512Kkernel0x80000 ~ 0x2800002Mrootfs0x300000 ~ 0x100000013M硬件内存:HI3518E芯片内置64MB DDR,外置16MB的SPIFlash(存放bootloader、kernel、rootfs),扩展16G大小SD卡(存放用户数据)。2

2021-06-06 10:41:27 417

原创 Hi3518ev200:byun hawkeye刷机与配网

背景:从浩峰大佬那拿的boyun hawkeye互联网摄像机,听说是从闲鱼上淘的,被淘汰的产品;买来用来二次开发。1)拆开外面的外壳,然后将串口线引出,接usb转ttl,usb供电,用xshell/SecureCRT登陆,波特率115200。![image-20210605174750306](https://img-blog.csdnimg.cn/img_convert/536030549413ad524fe6c64f13e017a6.png)2)准备一个SD卡,格式化为FAT32,拷贝fir

2021-06-05 17:52:36 1889 2

原创 FLV格式解析

参考文章:Flv格式详解(表格形式,图解)FLV格式解析(二进制形式,图解)FLV文件解析代码FLV文件布局:FLV Header具体字段:代码表达:typedef struct { uint8_t signature[3]; // 'f' 'l' 'v' uint8_t version; // 1 uint8_t flags; // 00000 1 0 1,该字节第0位和第2位表示视频、音频存在 uint8_t of

2021-06-04 23:11:18 1097

原创 构建AVL树

AVL(Adelson-Velskii and Landis)树是满足平衡条件的二叉搜索树:左右子树的深度差不大于1。一、理解AVL树目标:通过调整二叉树结构,提高二叉查找的效率。构建手段:左旋转、右旋转、双旋转。类似抖葡萄那样,找到合适的节点作为新的根,拎起来抖两下,树结构就得到了调整。四种失衡情况:1)LL(left-left)型:失衡位置从名字可以看出,左子树的左侧挂了太多节点;此时需要的调整是右旋,顺时针旋转一下,即可恢复平衡。2)RR(right-right)型3)LR

2021-06-02 22:41:40 863 1

原创 ffmpeg 摄像头采集编码,保存到本地或推流

1)初始化采集输入设备,设置编码器与图像转换上下文#define CAMERA_DEV "/dev/video0"#define CAMERA_FMT AV_PIX_FMT_YUYV422#define ENCODE_FMT AV_PIX_FMT_YUV420Ptypedef struct { uint8_t *buf[4]; int linesize[4]; int size;} cnv_t;typedef struct { AVFormatContext

2021-05-30 23:21:06 1849 6

原创 ffmpeg拉流 —— RTMP拉流例程

参考:最简单的基于FFMPEG的推流器附件:收流器rtmp拉流例程:#include <stdio.h>#include "libavformat/avformat.h"#include "libavutil/time.h"#include "libavutil/mathematics.h"// rtmp拉流,保存为out.flv文件#define RTMP_ADDR "rtmp://127.0.0.1:1935/live/1234"void receive_rtmp(co

2021-05-28 23:55:43 4532 1

原创 获取已打开文件的fd

获取进程中已打开文件的文件描述符:1、运行测试代码:#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>int main(int argc, char const* argv[]){ int fd = open(argv[1], O_RDONLY); printf("pid

2021-05-28 18:10:42 1173

原创 ffmpeg推流 —— RTMP推流例程

参考:雷霄骅 - 最简单的基于FFmpeg的推流器(以推送RTMP为例)RTMP推流例程:#include <stdio.h>#include "libavformat/avformat.h"#include "libavutil/time.h"#include "libavutil/mathematics.h"#define RTMP_ADDR "rtmp://127.0.0.1:1935/live/1234"void fix_packet_pts(AVPacket *pa

2021-05-27 23:02:11 2564

原创 nginx+rtmp配置,网页播放rtmp流(实测可用)

1、下载编译librtmp:git clone git://git.ffmpeg.org/rtmpdumpcd rtmpdump/makesudo make install 带--enable-librtmp重新编译安装ffmpeg,请参考:ffmpeg导入外部库libx264。2、搭建nginx服务器:git clone https://github.com/arut/nginx-rtmp-modulewget http://nginx.org/download/nginx-1.8.0

2021-05-26 23:09:28 21088 7

原创 ffmpeg 录制aac音频(使用audio_fifo优化)

音频相关文章:通过Alsa框架采集音频数据ffmpeg 通过libavdevice录音ffmpeg音视频编码入门:音频编码(pcm编码aac)Audio FIFO 相关函数介绍目标:1)利用libavdevice采集音频数据,并编码输出aac文件;2)使用audio_fifo优化代码,提高录制音频的质量。采集与编码过程:1)初始化声卡设备,初始化格式上下文,查找流信息2)初始编码器上下文,创建frame,用于保存一帧音频数据3)创建sound_packet,保存从声卡设备中获取的

2021-05-22 23:45:05 1114 2

原创 ffmpeg 通过libavdevice录音

"hw0,0"是默认声卡设备声卡命令规则:card {数字1}: xxxx, device {数字2}: xxxx我们选择哪个设备,则alsa下对应的声卡名称为:"hw:{数字1},{数字2}代码:#include <stdio.h>#include <unistd.h>#include <signal.h>#include "libavcodec/avcodec.h"#include "libavformat/avformat.h"#incl

2021-05-21 22:47:32 604 3

原创 ffmpeg h264和aac封装为mp4文件

1、I帧/P帧/B帧I帧:帧内编码图像帧,也叫关键帧,包含一幅完整的图像信息,不含运行矢量,在解码时不需要参考其它帧图像。在闭合式GOP(画面组)中,每个GOP的开始是IDR帧,且当前GOP的数据不会参考前后GOP的数据。在编解码中,为了方便将首个I帧(IDR,即时解码器刷新)和其它I帧区别开来,这样就能方便控制编码和解码流程。IDR帧的作用是立刻刷新,使错误不至于传播,从IDR帧开始重新算一个新的序列开始编码。IDR会导致DPB(参考帧列表)清空,在IDR帧之后的所有帧都不能引用IDR帧之前的帧的

2021-05-20 23:31:38 3202 10

原创 ffmpeg综合项目:mp4播放器(项目代码已上传到码云)

0、系列文章:ffmpeg音视频编码入门:视频解码ffmpeg音视频编码入门:音频解码(acc/mp3 转 pcm)ffmpeg —— SDL2播放yuv文件(使用事件驱动和多线程,支持按键暂停/退出)ffmpeg —— SDL2播放pcm音频ffmpeg 视频文件解封装,提取mp4中的h264码流和aac码流1、mp4播放器主体框架: 项目思路:创建两个环形队列,里面用来存放可直接播放的h264码流数据和AAC码流;创建一个解封装线程,不断demuxer并进行过滤/添加adts头处

2021-05-18 21:14:32 2060 7

原创 ffmpeg 视频文件解封装,提取mp4中的h264码流和aac码流

本次目标:1)将容器中的音频码流和视频码流分离出来。2)针对mp4文件中的码流情况进行修复。解封装的基本过程:#include <stdio.h>#include "libavcodec/avcodec.h"#include "libavformat/avformat.h"// MPEG-TS文件解封装得到的码流可播放,MP4解封装得到的码流不可播放;// 这与容器的封装方式有关。void demuxer(const char *url) { // 初始化格式上下文

2021-05-14 12:00:08 1833 3

原创 ffmpeg音视频编码入门:视频解码

视频解码过程:1)创建格式上下文,打开输入流,读取文件信息到fmt_ctx;AVFormatContext *fmt_ctx = avformat_alloc_context();avformat_open_input(&fmt_ctx, url, NULL, NULL); avformat_find_stream_info(fmt_ctx, NULL);2)创建解码器上下文,寻找视频流的下标,将视频流编码信息拷贝到上下文中;AVCodecContext *cod_ctx =

2021-05-13 17:26:19 343 1

原创 ffmpeg 接口函数变更

源码目录下的doc/APIchanges文件记录了接口的变更历史。这里记录几个常见的接口函数和结构的变更。1、编码解码函数:旧: avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, pPacket); 新: avcodec_send_packet(pCodecCtx, pPacket); avcodec_receive_frame(pCodecCtx, pFrame);旧: avcodec_encode_video

2021-05-12 22:54:28 1194

原创 ffmpeg —— SDL2播放yuv文件(使用事件驱动和多线程,支持按键暂停/退出)

目标:使用SDL2库播放yuv420p格式的视频。几个结构体:SDL_Window:视频播放时弹出的窗口(可以创建多个窗口)。SDL_Texture:显示YUV数据。一个SDL_Texture对应一帧YUV数据。SDL_Renderer:渲染SDL_Texture至SDL_Window。SDL_Rect:确定图像显示的位置。代码1:直接读取yuv数据进行播放,40ms一帧。#include <stdio.h>#include "SDL2/SDL.h"void play

2021-05-12 21:58:42 322

原创 ffmpeg —— SDL2播放pcm音频

目标:使用sdl2库,播放pcm音频文件。代码:#include <stdio.h>#include "SDL2/SDL.h"#define PCM_FILE "../output.pcm"// 缓冲区管理unsigned int audio_len = 0;unsigned char *audio_chunk = NULL;unsigned char *audio_pos = NULL;void read_audio_data(void *udata, uint

2021-05-12 21:34:48 259

原创 ffmpeg音视频编码入门:音频编码(pcm编码aac)

关于frame中nb_samples字段的解释:nb_samples表示一帧音频数据中采样的数量(次数),nb_samples与具体的码流类型和编码级别有关。nb_samples和AVCodecContext中的frame_size相同。采样率44100Khz,采样格式s16,双声道时:一秒44100个采样点,一个采样点2字节,总数据量为88200字节;一帧nb_samples次采样,数据量为nb_samples x 2 x 2;一秒有88200/(nb_sample x 4)帧音频。编码类

2021-05-11 21:33:43 1831 1

原创 通过Alsa框架采集音频数据

录音命令:ffmpeg -f alsa -ac 2 -ar 44100 -i hw:0 -t 30 out.wav通过Alsa框架进行录音,获取pcm数据:#include <stdio.h>#include <stdlib.h>#include <alsa/asoundlib.h>// 通过Alsa框架进行录音,获取pcm数据#define AUDIO_RATE 44100#define AUDIO_CHANNEL 2void record_pcm

2021-05-11 16:54:42 1174

原创 arecord -l 失败(cannot execute binary file) 重装alas-utils的两种方法

arecord -l命令发现aplay是32bit的,是之前交叉编译时安装得到的,当时应该是忘了指定(–prefix=/you_directory),所以不小心安装到了虚拟机环境中。方法一(没有解决):去alsa-lib和alsa-utils源码目录,重新编译安装。①安装alsa-lib-1.2.2su // 切换到root用户./configure --prefix=/usrmake && make install②安装alsa-utils-1.2.2./confi

2021-05-11 12:30:58 409

原创 ffmpeg —— v4l2录制h264视频文件(边采集边转码)

相关文章:v4l2采集图像并转换格式视频编码(yuv编码h264)目标:使用v4l2采集摄像头图像数据,并实时编码成h264视频文件。代码:#include <stdio.h>#include <sys/time.h>#include "libavcodec/avcodec.h"#include "libavformat/avformat.h"#include "libavutil/imgutils.h"#include "libavdevice/avdevi

2021-05-10 23:30:04 1492 1

原创 ffmpeg音视频编码入门:视频编码(yuv编码h264)

1、基础概念:帧类型:I帧:原始帧,内部编码帧,也叫关键帧。视频的第一帧都是I帧,可独立编码。P帧:向前预测帧。编码需要依赖前一帧。B帧:前后预测帧,也叫双向预测帧。编码需要依赖本帧与前一帧和后一帧的对比。B帧压缩率高,但对性能要求也高。GOP:画面组,一个组连续画面。gop_size = 250时表示每250帧插入一个I帧。I帧越少,视频越小;但过分的小,会导到处视频编码失败,所以要适量。2、编码过程:1)初始化编码器(找到编码器,初始化编码器上下文,打开编码器)2)初始化AVFr

2021-05-10 10:24:12 800 1

原创 ffmpeg —— v4l2图像格式转换

目标:摄像头数据通过v4l2采集,然后进行图像格式转化以及拉伸缩放。代码:#include <stdio.h>#include "libavcodec/avcodec.h"#include "libavformat/avformat.h"#include "libavdevice/avdevice.h"#include "libswscale/swscale.h"#define dev "/dev/video0"// 宽高由用户自定义,格式为使用最广泛的yuv420pvo

2021-05-09 14:54:03 661

mp4_player.zip

ffmpeg综合项目:mp4播放器

2021-05-21

空空如也

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

TA关注的人

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