
音视频开发
文章平均质量分 56
zhou jiabo
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
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 · 968 阅读 · 0 评论 -
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 · 4063 阅读 · 3 评论 -
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 · 1410 阅读 · 0 评论 -
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 · 940 阅读 · 0 评论 -
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 · 1276 阅读 · 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 · 981 阅读 · 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 · 2202 阅读 · 3 评论 -
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 · 731 阅读 · 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 · 544 阅读 · 1 评论 -
Hi3518ev200:byun hawkeye刷机与配网
背景:从浩峰大佬那拿的boyun hawkeye互联网摄像机,听说是从闲鱼上淘的,被淘汰的产品;买来用来二次开发。1)拆开外面的外壳,然后将串口线引出,接usb转ttl,usb供电,用xshell/SecureCRT登陆,波特率115200。2)准备一个SD卡,格式化为FAT32,拷贝fir原创 2021-06-05 17:52:36 · 2407 阅读 · 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 · 1458 阅读 · 0 评论 -
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 · 2432 阅读 · 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 · 5101 阅读 · 1 评论 -
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 · 2821 阅读 · 0 评论 -
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 · 27676 阅读 · 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 · 1417 阅读 · 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 · 822 阅读 · 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 · 4177 阅读 · 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 · 2400 阅读 · 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 · 2871 阅读 · 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 · 461 阅读 · 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 · 1900 阅读 · 0 评论 -
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 · 438 阅读 · 0 评论 -
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 · 337 阅读 · 0 评论 -
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 · 2841 阅读 · 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 · 1496 阅读 · 0 评论 -
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 · 558 阅读 · 0 评论 -
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 · 2011 阅读 · 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 · 1007 阅读 · 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 · 885 阅读 · 0 评论 -
ffmpeg —— v4l2获取摄像头图像
FFmpeg中有一个和多媒体设备交互的类库:libavdevice。使用这个库可以读取电脑(或者其他设备上)的多媒体设备的数据,或者输出数据到指定的多媒体设备上。常见的输入端设备:alsaavfoundationfbdevopenalosspulsevideo4linux2, v4l2常见的输出端设备:alsadecklinkfbdevopenglosspulsesdl采集一帧图像:在Linux平台上可以使用video4linux2打开视频设备,图像格式由摄像头决原创 2021-05-08 23:57:15 · 1272 阅读 · 0 评论 -
音频编码基础知识
音频编码压缩分类:有损压缩(消除冗余信息)、无损压缩。所谓冗余信息就是 人耳听觉范围外的音频信息以及被遮蔽掉的音频信息。频域遮蔽效应:频率相近的几个声源中,强度高的声音可能会将其它低强度声音遮蔽。无损编码(熵编码):哈夫曼编码,算法编码,香农编码。音频编码过程:常见的音频编码器AAC、OPUS、Ogg、Speex、iLBC、G.711等音频编码质量对比:AAC编码器: AAC(advanced audio coding)由Fraunhofer IIS、杜比实验室、AT&原创 2021-05-08 22:20:56 · 2414 阅读 · 0 评论 -
ffmpeg导入x264、libfdk_aac外部库(已解决wrong ELF class: ELFCLASS32)
起因:在做pcm编码aac时,运行报错:failed to find codec查看ffmpeg中已有的aac编码器:ffmpeg -encoders | grep aac没有找到libfdk_aac尝试重新编译 ffmpeg:./configure --enable-shared --enable-gpl --enable-nonfree --enable-libx264 --enable-libfdk-aac --enable-libmp3lame --prefix=/opt/ffmpeg原创 2021-05-04 13:50:36 · 6201 阅读 · 0 评论 -
ffmpeg音视频编码入门:音频解码(acc/mp3 转 pcm)
1、目标:使用ffmpeg库函数,将音频码流(AAC、mp3等)解码为pcm采样数据。2、音频解码过程1)根据输入的码流文件,初始化格式上下文(fmt_ctx);2)根据格式上下文,找到合适的解码器(Codec),同时返回流索引(音频对应streams[0],视频对应stream[1]);3)根据格式上下文,获取编码时的参数设置(fmt_ctx->streams[index]->codecpar);4)创建解码器的上下文(cod_ctx),根据编码参数初始化解码器上下文,打开解码器;原创 2021-05-03 20:08:06 · 2710 阅读 · 1 评论 -
音视频数据处理入门:RTP协议解析
协议分析1、RTP(Real-time Transport Protocol)RTP报文由两部分组成:报头和有效载荷。RTP头部:这里只说明几个我们需要用到的字段:V(2位):协议版本号pt(7位):payload type载荷类型sequence number(2字节):序列号,每个报文都有一个序列号;接收者据此来检测报文丢失情况,重组报文。timestamp(4字节):时间戳,反映采样时间;接收者据此来计算延迟和延迟抖动,并进行同步控制。2、MPEG-TS音频数据和视频数据经原创 2021-05-01 13:18:33 · 1737 阅读 · 0 评论 -
音视频数据处理入门:解析h264视频码流
1、获取h264视频码流从mp4中抽取视频码流:ffmpeg -i 001.mp4 -codec copy -bsf: h264_mp4toannexb -f h264 001.h264-codec copy: 从mp4中拷贝-bsf: h264_mp4toannexb: 从mp4拷贝到annexB封装-f h264: 采用h264格式// 视频不要太长,建议用-t 10选项只剪切一部分出来解析。2、h264码流结构H.264码流由一个个NAL(网络抽象层)单元组成:在H.264/A原创 2021-04-29 00:02:10 · 1292 阅读 · 1 评论 -
音视频数据处理入门:rgb与yuv相互转换
1、rgb --> yuvY= ( 66R + 129G + 25B)>>8 + 16U= (-38R - 74G + 112B)>>8 +128V= (112R - 94G - 18B)>>8 + 128代码:unsigned char clip_0_255(int val) { if (val < 0) return 0; else if (val > 255) return 255; r原创 2021-04-27 17:45:20 · 395 阅读 · 0 评论 -
音视频数据处理入门:rgb转bmp
BMP图像内部实际存储的是RGB数据,我们通过添加bmp头部信息,调整RGB分量存储顺序,可以将RGB数据封装得到bmp图像。1、BMP文件格式:BITMAPFILEHEADER + BITMAPINFOHEADER + RGB像素数据bmp头部信息:位图文件头(14字节):{‘B’,‘M’} + fsize + blank + offset位图信息头(40字节):信息头大小,图像宽高、色深,压缩方式,图像数据大小,,,2、具体的头部信息和转换过程请看下列核心代码:typedef str原创 2021-04-26 23:03:17 · 460 阅读 · 0 评论 -
音视频数据处理入门:获取/播放.rgb图片
怎么获得一张.rgb格式的图像:png转rgb怎么播放RGB格式图像:雷神修改的YUV/RGB播放器下载完成后,YUVplayer\Release下即有能直接使用的二进制可执行文件yuvplayer.exe。打开xxx.rgb图像:将转换得到的图像,拖到播放器;然后设置好分辨率(要记住原来png图像的分辨)和像素格式(RGB24),成功显示出如下图像: 问题:yuvplayer重新打开时,要重新自定义分辨率。小白:先将png图像分辨设置为默认值352*288,然后再转换rgb大佬:修改源码添加原创 2021-04-26 18:30:37 · 557 阅读 · 0 评论 -
音视频数据处理入门:yuv灰阶测试与PSNR评估
1、生成YUV420p格式的灰阶测试图灰阶代表了由最暗到最亮之间不同亮度的层次级。这中间层级越多,所能够呈现的画面效果也就越细腻。// 生成灰阶测试图, barnum指有多少个亮度层次void yuv420_graybar(int w, int h, int ymin, int ymax, int barnum) { FILE *fout = fopen("output_graybar.yuv", "w+"); unsigned char data_y[w*h]; u原创 2021-04-25 12:11:16 · 671 阅读 · 1 评论