![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
音视频开发
文章平均质量分 53
ccloud11
分享技术就如同分享快乐一样,独乐乐不如众乐乐。
展开
-
利用qt播放音频数据
这边写入即是利用c语言打开二进制文件的方式进行读取后写入缓冲区,这边需要注意的是,缓冲区的大小是有大小限制。由于磁盘读取文件的速度很快,如果超出缓冲区大小的话播放音频会出现问题,所以在这边做出限制,当缓冲区的剩余空间小于本次要写入的大小时就跳过本次写入,代码如下。首先需要准备好一段pcm的原始音频数据,这边可以通过ffmpeg的命令将mp4视频格式中的音频提取出来并按照pcm的格式进行保存。保存的安装short类型,即16位的数据,字节存储格式为小端模式。最后利用QIODevice类向缓冲区中写入数据。..原创 2022-07-31 23:48:07 · 2026 阅读 · 0 评论 -
音视频解码流程
我们都知道视频的存储方式一般都是MP4、avi、FLV等封装的格式,如果需要在设备进行播放视频,就需要对其进行相应的处理,图片一般需要yuv或rgb格式的图片数据才能进行显示,音频需要pcm的格式数据进行播放,所以这时候就需要对封装格式的视频进行解码,而ffmpeg提供了一套接口可以对视频进行处理。这边的ic是调用上面的初始化解封装器后获得的解封装上下文,里面包含了所有流的信息,nb_streams是一个有多少个流。下面是源码分享,主要是打印了流程中的一些信息,并没有对图像和音频进行显示。...原创 2022-07-30 19:36:43 · 2908 阅读 · 0 评论 -
音视频开发系列(18):利用qt界面使用ffmpeg进行推流
上次分享了使用XController类来进行封装控制进行音视频频推流,并对整个项目类之间的关系进行了说明,这次主要要分享一下利用qt设计界面后,用界面的方式来进行视频推流。最后的运行效果大致如图所示,做的比较简陋,大家可以自己进行改造。主要功能就是通过点击开始按钮就开始进行视频推流,再点击一次就停止视频推流 这边改变界面主要是通过改变界面的样式表然后分享一下对应界面的.h和.cpp文件xrtmpstreamer.hxrtmpstreamer.cpp用到的类在之前都有进行分享,这边就不进行分原创 2022-07-13 23:07:21 · 1786 阅读 · 6 评论 -
音视频开发系列(17):封装控制类使用音视频类
上次分享了如何对图像进行进行处理以达到图像磨皮的效果,由于后面要把这个音视频项目做成一个带有界面的项目,所以需要对其中例如编码器初始化这些操作封装成一个控制类,这样的话界面只需要调用该类即可,就不需要再写重复的代码。这个项目主要的核心类如下图所示。 这次主要要封装一个控制类,该类主要包括以下方法和属性:该类为一个线程类,主要在用户调用该类进行Start后就会开启一个线程,然后在线程里面就会开启音视频录制类线程并进行读取录制好的数据,这样在主函数中只需要调用Start和Stop来开启和暂停线程即可,接下原创 2022-07-11 23:47:53 · 132 阅读 · 1 评论 -
音视频开发系列(16):利用opencv的函数进行图像磨皮处理
本次主要分享一下如何对图像进行磨皮处理,即进行一定的美颜效果,这边主要用到的是opencv的bilateralFilter()函数来进行处理。InputArray src: 输入图像,可以是Mat类型,图像必须是8位或浮点型单通道、三通道的图像。 OutputArray dst: 输出图像,和原图像有相同的尺寸和类型。 int d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。 double sigmaColor: 颜色空间过滤器原创 2022-07-10 23:31:53 · 756 阅读 · 1 评论 -
音视频开发系列(15):视频与音频同步
上次分享了将视频与音频同时推流到服务上的代码封装,然后上节分享在测试后会发现音视频不同步,这边说一下原因:从帧率及采样率,即可知道视频/音频播放速度。声卡和显卡均是以一帧数据来作为播放单位,如果单纯依赖帧率及采样率来进行播放,在理想条件下,应该是同步的,不会出现偏差。以一个44.1KHz的AAC音频流和24FPS的视频流为例:一个AAC音频frame每个声道包含1024个采样点,则一个frame的播放时长(duration)为:(1024/44100)×1000ms = 23.22ms;一个视频fram原创 2022-07-09 21:20:27 · 2174 阅读 · 1 评论 -
音视频开发系列(14):将视频和音频同时推流到nginx服务器上
上次分享了视频录制代码的封装,这次分享一下同时将视频和音频推流到服务器上,注意(这次分享的内容不包括音视频同步方面的),所以会出现音视频不同步的情音视频同时发送的策略主要是:利用一个链表存储音视频帧,然后开启两个线程,即音频录制线程,视频录制线程,然后在主线程中循环一直从链表中读取音视频帧,我这边主要是先读取音视频帧,然后在读取视频帧,如果两个同时为空的话就跳过本次循环,然后分别推流到nginx服务器上。然后在这边要注意,由于AVPack 中默认的stream_index为0,所以如果没有对上次的SendF原创 2022-07-06 23:30:42 · 1526 阅读 · 3 评论 -
音视频开发系列(13):视频录制的封装及代码重构
上次分享了音频录制的封装,这次准备分享一下视频录制的接口封装,首先视频录制接口的封装都是需要初始化,开始,暂停这些函数,由于音频录制和视频录制都是开启一个线程进行录制的,所以把线程封装成一个类提供接口给这两个类进行使用,线程类主要包括以下属性和方法:由于视频和音频数据都可以用char *类型来进行存储,所以将此数据类型封装成一个类,该数据类型的属性主要包括数据内容及数据的大小,具体的方法和属性如下:void Drop();函数的功能为清理数据内容和数据大小。视频和音频录制的主要思路为:在录制的时原创 2022-07-05 22:14:39 · 417 阅读 · 1 评论 -
音视频开发系列(12):音频录制的代码封装
这节课分享一下如何对基于qt的音频推流的代码进行封装,首先先说明一下封装的目的,主要是为了以后如何有多种方案可以进行使用时,只需要在该封装的类上提供新的接口即可。本次封装的类的基类为XAudioRecord,该类继承于QThread,由于在读取录制的音频的时候为了保持系统的稳定性,所以开了一个线程用于读取录制后的音频,该基类是一个工厂类,与前面封装的音频视频类一样,使用基类返回的值进行初始化。该基类主要包括以下内容。第一个枚举类型的数据主要是为了提供该音频录制是使用哪个方式进行录制的,由于本次封原创 2022-07-03 11:55:02 · 153 阅读 · 1 评论 -
音视频开发系列(11):基于qt音频推流的代码封装
本次分享的内容是对上次分享的音频的代码进行封装,将其封装成两个类,本次的封装主要是在上次分享的视频推流的封装上进行的,所以与视频推流中的封装类一致,即(XMediaEncode:音视频编解码类,XRtmp:网络推流类。)XMediaEncode类的音频部分主要包括以下几个函数:由于视频和音频的推流部分相似,所以只是对其中的代码逻辑部分进行改动,接下来是源码分享,由于与上次视频封装的内容相似,代码中也有具体的解释,所以就不进行过多的说明了XRtmp.hXRtmp.cppXMediaEncod原创 2022-06-27 22:44:56 · 724 阅读 · 1 评论 -
音视频开发系列(10):基于qt的音频推流
今天分享一下利用qt录制音频,然后再利用ffmpeg推流到nginx服务器,最后再利用vlc进行拉流的demo。首先介绍一下如何利用qt来进行音频的录制,qt的音频录制主要利用qt的QAudioFormat先进行音频信息的配置。主要需要配置以下的信息:然后使用QAudioDeviceInfo来获取是否支持改设置信息,如果不支持的话就取其最近的配置。然后再利用QIODevice开始录制音频,具体的读取方式如下所示。到这里利用qt进行音频的录制就完成了,接下来是利用ffmpeg进行推流,推流的原创 2022-06-26 13:41:34 · 1851 阅读 · 0 评论 -
音视频开发系列(9)vs2015的qt环境搭建
由于本次分享的项目需要用到qt的gui界面,所以今天先介绍一下如何在vs2015中安装qt的插件。首先需要安装qt,这个在官网上就可以进行下载了,这边就不进行介绍了。(ps:后面都是一键化安装)然后需要安装vs中qt的插件。这边分享一下vs2015的qt插件。链接:https://pan.baidu.com/s/1kLt8r5ne6wiv3psnaltIfA 提取码:gfbl在这边进行安装后会在vs2015多一个选项Qt Vs Tools然后点击Qt Vs Tools中进行配置qt的环境。 选择Qt Op原创 2022-06-20 23:24:50 · 328 阅读 · 0 评论 -
音视频开发系列(8):封装本地摄像头推流代码
本次分享的内容主要是针对上次分享的内容做一次封装,上次是利用c语言的特性来实现的,这次要利用c++的特性--封装来实现,后期可以封装成动态库,下次就可以直接使用。本次封装后的类主要分成两个类XMediaEncode:音视频编解码类,XRtmp:网络推流类。由于后面还会封装音频类,所以这两个类会作为抽象类来使用(c++中没有抽象类这个概念,就是定义一个纯虚函数后类似其他语言中的抽象类),然后将这两个类改变成工厂模式进行使用,即将构造函数定义成protected权限,然后开放一个静态的函数提供给外部进行使用该构原创 2022-06-19 23:00:30 · 418 阅读 · 0 评论 -
音视频开发系列(7):完成本地摄像头直播推流
今天把读取本地摄像头将视频流推流到nginx服务器的直播代码学习完了,这里对代码的流程做一下记录,以便以后进行复习。这边用到了opencv和ffmpeg的开源库(PS:在前面有进行分享),配置环境在之前也有进行分享。第一步:先用到了opencv的VideoCapture类的open函数打开摄像头,这边的参数可以自己设置,我这边是打开本地的摄像头,所以参数为0。第二步:初始化格式转化转换上下文,由于从opencv的函数读取出来的图片格式是rgb格式的,后面需要进行编码成h264格式的视频,h264格式的视频需原创 2022-06-12 16:18:04 · 2319 阅读 · 1 评论 -
音视频开发系列(6):opencv打开摄像头进行播放,并且进行像素格式转换
好久没更新博客了,最近在交毕设的材料耽搁了学习的时间,今天继续开始进行音视频学习的记录,上次利用rtmp进行推流完成了一个基本的流媒体直播,这次要利用本地的摄像头采集视频帧然后利用rtmp将采集到的视频上传到服务器进行直播,这次需要利用opencv和ffmpeg的库进行,所以在编写代码之前需要对项目进行配置。文件夹的目录还是与之前的一致,bin文件夹存放生成的文件,include文件夹存放头文件,lib文件夹存放库文件,src文件夹存放源代码。配置的方法还是和之前的一致,在属性中的常规将生成的路径修改成bi原创 2022-06-10 00:00:40 · 826 阅读 · 0 评论 -
音视频开发系列(5):opencv基础
由于本项目需要用到opencv开源库,需要用到opencv来打开摄像头和利用opencv来对图像进行处理,首先介绍一下如何在vs中搭建opencv的环境,首先分享一下opencv的库文件。链接:https://pan.baidu.com/s/1zzwdTsjYsJ64lZB4FnRzgQ提取码:bkbn里面主要分成三级目录,bin文件夹主要用来存放dll文件和生成的exe文件,lib文件夹用来存放动态库文件,src文件夹用来存放头文件和源文件。然后就可以配置opencv的环境了。.原创 2022-05-26 00:04:06 · 973 阅读 · 0 评论 -
音视频开发系列(4):完成rtmp推流vlc拉流
上节分享了打印AVPacket中的时间戳信息,这节准备分享一下利用rtmp协议将视频和音频数据推流到nginx服务器上并利用vlc来进行拉流播放视频,达到直播的效果。由于AVPacket包数据中的解码时间戳dts、显示时间戳pts是使用输入流来进行配置的,上节分享的是利用av_read_frame()函数读取数据,由于第一个参数是输入流的帧,所以配置的dts和pts就是输入流的配置,要想用输出流的pts、dts配置,可以利用ffmpeg中的int64_t av_rescale_q_rnd(int64_t原创 2022-05-24 23:13:08 · 2744 阅读 · 0 评论 -
音视频开发系列(3):打开rtmp并读取音视频帧
上节介绍了如何打开音视频文件并将输出流进行配置,这节分享一下如何读取音视频帧,将读取的帧让rtmp进行推流。首先用int avio_open(AVIOContext **s, const char *url, int flags);打开文件io流,第一个参数是io上下文,在输出流上下文结构体中的有存放该结构体第二个参数是输出的视频地址第三个参数是打开方式,这里传入AVIO_FLAG_WRITE,意思就是写入的意思然后利用int avformat_write_header(AVFormat原创 2022-05-19 23:28:45 · 666 阅读 · 0 评论 -
音视频开发系列(2):打印视频流信息及输出流配置信息
最近在忙毕业的事情,导致学习音视频的进度耽搁了。言归正传,上节介绍了如何在vs中配ffmpeg库。学习一个新的东西总得找点东西来做,所以看到了一个课程是关于音视频开发的,就是实现直播系统,从本地读取视频然后通过推流将数据发送到nginx服务器上(PS:nginx服务器配置过程可以参考别人的博客哦,这边暂时不介绍)。本节介绍如何从本地读取视频文件并打印视频信息以及如何配置视频信息。首先初始化所有的封装和解封装的函数,利用av_register_all()函数来初始化。然后定义AVFormatC原创 2022-05-18 23:22:05 · 371 阅读 · 0 评论 -
音视频开发系列(1):环境搭建
今天重新开始写博客了,最近在学习音视频开发,准备把自己学习的内容记录一下。今天先介绍一下环境的搭建,我自己使用的编译器是VS2015,用的开源库是ffmpeg3.3.1大家可以去官网下载哦,这里分享一下链接供大家下载http://链接:https://pan.baidu.com/s/1dRH-fTmSBEFCXAPbZgWBwA 提取码:l4q7大家可以在这个链接下载。先介绍一下文件的架构,bin文件夹主要用来存放生成的文件的路径, include文件夹用来存放头文件,lib文件夹用原创 2022-05-15 21:00:10 · 615 阅读 · 0 评论