音视频与流媒体
虽迟但到灬
一起快乐的努力
展开
-
解码(七):音频重采样SwrContext和swr_convert相关函数详解
上面的接口,涉及到音频采样的创建,设置,初始化,清零。swr_convert:接口功能,将一帧帧的音频做相应的重采样。原创 2021-12-20 20:52:33 · 534 阅读 · 0 评论 -
解码(六):sws_scale像素格式转换代码演示
如下代码: if (vctx) { if (!rgb) rgb = new unsigned char[frame->width*frame->height * 4]; uint8_t *data[2] = { 0 }; data[0] = rgb; int lines[2] = { 0 }; lines[0] = frame->width * 4; //一行的字节数 sws_scale(vctx,原创 2021-12-20 20:45:27 · 386 阅读 · 0 评论 -
解码(五):sws_getContext和sws_scale像素格式和尺寸转换函数详解
视频像素格式和尺寸转换sws_getContext(像素格式转换上下文),提供了两个函数sws_getContext像素格式上下文初始化代码演示如下代码://表示是视频 if (cc == vc) { vctx = sws_getCachedContext( vctx, //传NULL会新创建 frame->width, frame->height, (AVPixelFormat)frame->format,//输入的宽,高,原创 2021-12-20 20:33:38 · 609 阅读 · 0 评论 -
解码(四):avcodec_send_packet和avcodec_receive_frame函数讲解
1.avcodec_send_packetint avcodec_send_packet(AVCodecContext *avctx,const AVPacket *avpkt);第一个参数:原来解封装的时候有一个上下文,现在做解码有另外一个上下文,这个上下文贯穿于整个解码逻辑。第二个参数:会把这个AVPacket放到我们的缓存中。2.avcodec_receive_frameint avcodec_receive_frame(AVCodecContext *avctx,AVFrame *fram原创 2021-12-19 20:12:25 · 3827 阅读 · 0 评论 -
解码(三):AVFrame格式解析和空间处理函数
1.在打开了解码器上下文之后,我们开始来一帧一帧的数据解码。解码之前我们需要先看一个结构体:AVFrame:用来存放我们解码后的数据,而这就涉及到了内存空间的问题。所有我们要考虑下这个空间怎么分配,怎么释放。2.看如下接口AVFrame的空间分配和释放的方法等同于AVPacket,AVFrame相比与AVPacket的区别是,它的占用空间可能更大,所以会有如下的内存申请和释放。接口,如图。3.包含的内容:4.linesizeYUV存放的目的,主要是为了对齐。需要按行进行拷贝。...原创 2021-12-19 15:38:02 · 449 阅读 · 0 评论 -
解码(二):音视频解码上下文创建配置和打开avcodec_open2打开演示
如下代码:///////////////////////////////////////////////////////// ///视频解码器打开 ///找到视频解码器 AVCodec *vcodec = avcodec_find_decoder(ic->streams[videoStream]->codecpar->codec_id); if (!vcodec) { cout << "can't find the codec id" << ic原创 2021-12-19 15:22:04 · 468 阅读 · 0 评论 -
解码(一):AVCodecContext解码上下文初始化讲解
一:概述:在前面我们已经解封转获得了压缩编码后的数据,这时候我们需要将其解码。于是就有了我们接下来要讲的。所以第一步我们要知道用什么样的解码器来进行解码。 如H264,H263等不同而解码器。第一步:注册所有的解码器。avcodec_register_all()第二步:获取对应的解码器。AVCodec *avcodec_find_decoder(enum AVCodecID id );如下图所示:二:解码上下文:AVCondecContext三:参数设置 avcodec_parametes原创 2021-12-19 13:53:46 · 1138 阅读 · 0 评论 -
解封装(十)总结代码
#include <iostream>#include <thread>extern "C"{#include "libavformat\avformat.h"}#pragma comment(lib,"avformat.lib")#pragma comment(lib,"avutil.lib")#pragma comment(lib,"avcodec.lib")using namespace std;static double r2d(AVRationa原创 2021-12-18 17:00:35 · 165 阅读 · 0 评论 -
解封装(九):av_read_frame和av_seek_frame代码示例分析内存占用和清理情况
如下代码://malloce avpacket 并初始化 AVPacket *pkt = av_packet_alloc(); for (;;) { int re = av_read_frame(ic, pkt); if (re != 0) { //循环播放 cout << "========================end=========================="<<endl; int ms = 3000; // 三秒位置,原创 2021-12-18 16:54:02 · 548 阅读 · 0 评论 -
解封装(八):av_seek_frame改变播放进度函数
av_seek_frame函数原型:/**Seek to the keyframe at timestamp.‘timestamp’ in ‘stream_index’.@param s media file handle@param stream_index If stream_index is (-1), a defaultstream is selected, and timestamp is automatically convertedfrom AV_TIME_BASE uni原创 2021-12-18 16:24:44 · 328 阅读 · 0 评论 -
解封装(七):av_read_frame读取帧数据函数分析和产生的空间问题分析,以及AVPacket分析
1.在完成了视频的格式的解析,即音视频编码参数获取之后,我们就可以开始读取具体的音视频帧数据。av_read_frame我们要忠实的是,函数调用之后是否应该涉及到清理方法。先看下上面函数的参数:AVFormatContext *s //文件格式的上下文AVPacket *pkt //你传的指针是否需要事先处理,如何处理(提前说这个指针是不能传NULL的)AVPacket重点讲:里面的成员:1.AVBufferrRef *buf;2.int原创 2021-12-18 15:35:37 · 689 阅读 · 0 评论 -
解封装(六):通过遍历获取AVStream音视频流信息并打印参数
一般获取音视频流的方式有如下两种方法:如下代码//音视频索引,读取时区分音视频 int videoStream = 0; int audioStream = 1; //第一种获取音视频流的方法 //获取音频流信息,(遍历,函数获取) for (int i = 0; i < ic->nb_streams; i++) { AVStream *as = ic->streams[i]; //判断哪个是音频,哪个是视频 //音频 if (as->codecpa原创 2021-12-18 14:43:51 · 342 阅读 · 0 评论 -
go语言函数的常用用法
如下代码:package mainimport ( "fmt" "unsafe")func main() { //make和new函数 //new函数用法 //a := 10 //默认值 int rune byte float bool string这些类型都有默认值 //指针,切片,map,接口这些默认值是nil类型 var a int a = 10 fmt.Println(a) //var p *int //声明一个变量,但是变量没有初始值,所以这样是不行的,只有一个占原创 2021-12-17 21:46:59 · 253 阅读 · 0 评论 -
go中make和new的用法,以及nil用法
看如下代码package mainimport ( "fmt" "unsafe")func main() { //make和new函数 //new函数用法 //a := 10 //默认值 int rune byte float bool string这些类型都有默认值 //指针,切片,map,接口这些默认值是nil类型 var a int a = 10 fmt.Println(a) //var p *int //声明一个变量,但是变量没有初始值,所以这样是不行的,只有一个占原创 2021-12-17 21:16:38 · 726 阅读 · 0 评论 -
解封装(五):AVStream和AVCodecParameters分析
1.AVStream概念就是我们会在AVFormatContext中存放多个AVStream信息,音频和视频都是存在同样的类型中。2.主要参数AVCodecContext *codec; //过时了AVRational time_base; //时间基数,也可以理解为分数,存放的是分子和分母int64_t duration //ms: durateion *((double)time_base.num/(double)tim原创 2021-12-17 15:57:07 · 400 阅读 · 0 评论 -
解封装(四):avformat_find_stream_info探测获取封装上下文并打印
获取视频流格式信息注意:MP4视频文件,在avformat_open_input的时候就已经获取了它全部的信息,但有一部分视频文件如flv格式的视频文件,在调用上面接口的时候可能并没有获取他的重要信息。这时候我们需要用其他方式获取。如下代码: //获取流信息(不是所有的格式都调用),虽然mp4文件在上面的接口中已经获取了它的信息,但这里再获取一边也不会有错 re = avformat_find_stream_info(ic, 0); //总时长,换算为ms int totalMS = ic-&原创 2021-12-17 15:03:17 · 134 阅读 · 0 评论 -
解封装(三):AVFormatContext分析
AVFormatContext是一个结构体,我们在IDE中对其转到定义之后,会发现有很多它的成员。1.AVIOContext *pb:指的是我们自己定义一个读写格式。2.char filename[1024]:指的是我们打开的文件,比如涉及到的断开重连,都是经常用到的。3.unsigned int nb_streams与AVStream **streams这个连个属于一组:一般0是视频下表,1是音频下标。4.int64_t duration:总长度 //AV_TIME_BASE5.int64_t原创 2021-12-17 14:29:56 · 281 阅读 · 0 评论 -
解封装(二):初始化解封装avformat_open_input,各参数分析,以及简单流程
如下代码:#include <iostream>extern "C"{#include "libavformat\avformat.h"}#pragma comment(lib,"avformat.lib")#pragma comment(lib,"avutil.lib")using namespace std;int main(){ cout << "test Demux ffmpeg.club" << endl; //初始化封装库 a原创 2021-12-17 11:31:50 · 2389 阅读 · 0 评论 -
解封装(一):ffmpeg解封装
1.注意:什么是解封装,就是将二进制音视频文件,开始音视频文件分离,解码的具体操作。2.解封装没有严格的性能问题。它的开销非常小。3.解封装使用的一些接口(1)av_register_all()会注册所有的解封装和加封装格式。也可以单个注册,这个是在使用之前,最先执行的一个借口。(2)avformat_network_init()直接解封装rtsp数据,一般指摄像机(3)avformat_open_input()打开文件并解析(4)avformat_find_stream_info查找文原创 2021-12-16 22:03:57 · 1800 阅读 · 0 评论 -
ffmpeg软硬件解码基础(总目录)
它包括了,音视频原始文件,解码,像素格式转换,和重采样,然后播放的整体概念。重点可以来理解下pts/dts.pts:显示的时间。tds:解码的时间。在算pts的时候,要注意音视频的同步。接下来的几篇博客,会分别对这写操作进行一一讲解。...原创 2021-12-16 21:28:38 · 1236 阅读 · 0 评论 -
ffmpeg打开音频设备
1.ffmpeg采集音频流流程2.ffmpeg音频采集步骤主要设置采集方式,就是我们调用相关api的参数,avfoudation一般指mac系统,dshow指windows系统,alsa指linux系统各相关参数。原创 2021-12-05 15:13:35 · 1323 阅读 · 0 评论 -
MACAPP中引入ffmpeg库完成具体功能
我的上几篇博客写了具体的swift去实现具体的前端界面逻辑,接下来主要讲如何在swift项目中引入具体完成了音视频处理流程的C文件,现具体功能1.看如下图这几个路径就是我们ffmeg包中主要包含的很多库文件那引入ffmpeg库的几个步骤如下图:注意:关闭沙箱是的只属于这部分的资源可以被外部访问2.把文件拷贝到对应的目录后,再进行IDE配置(1)引入库(2)引入头文件至此,我们完成了文件的拷贝与库连接头文件包含下面来看具体应用例子:#include "testC.h"#原创 2021-12-04 23:23:56 · 1957 阅读 · 0 评论 -
采集音频的方式
1.采集音频的方式:(1)Andrpid端采集方式(2)ios端采集的方式(3)windows端的采集方式2.通用ffmpeg采集方式(1)ffmpeg命令的方式采集(2)调用API的就方式采集有了上面的知识,本博客主要介绍通过ffmpeg命令的方式采集信息命令一:ffmpeg -f avfoundation -i:0 out.wavffpaly out.wav...原创 2021-12-04 19:19:17 · 1531 阅读 · 0 评论 -
PCM与WAV
1.音视频原始数据格式PCM与WAV,注意一般WAV就是PCM加了一个头,便于播放器是用正确的参数进行数据展示。2.量化的基本概念3.码率计算4.WAV Header这三个花圈的内容是最为重要的5.WAV例子原创 2021-12-04 18:54:29 · 318 阅读 · 0 评论 -
音视频之模数转换
概念:对于一段音频来说实际上都可以理解为一段模拟信号。对于这样一段模拟信号来说我们要把它在计算机中模拟出来,必须转换成数字信号,而这个过程就是模数转换。下面来看张图,一段声音模拟信号图。下面这张图是量化后的数字信息而这就是音频采样额一个结果,对于音频的采样不肯能收集无数个点,那样的话数据量太大,通过采样率是44.1k/s,经过这样的采样率,即可将模拟信号转化为数字信号。收集到10进制数字需要将其转化为2进制数在转化为二进制方波到这里我们就可以将信号转化为计算机真正可以读取的数据了。..原创 2021-12-03 11:41:49 · 2144 阅读 · 0 评论 -
声音的相关知识
一:声音的产生和传播1.声音是由物体振动产生的。2.它可以通过空气,固体,液体等进行传输3.振动耳膜二:人类的听觉范围注意:HZ指物体一秒钟之内振动的次数三:各种生物听觉和发声范围四:声音的三要素1.音调:音频的快慢2.音量:振动的幅度3.音色:谐波...原创 2021-12-03 11:28:39 · 795 阅读 · 0 评论 -
直播客户端处理流程
1.整个处理流程2.音视频数据流我们的数字信号一般是pcm文件,经过aac/mp3编码器进行信号编码压缩,生成对应型号的文件如aac/mp3格式文件,然后再套一层“衣服”将其转化为mp4/flv等对应的视频文件。反过来也是类似的,只不过是一个回溯过程。如下图所示...原创 2021-12-03 11:11:38 · 73 阅读 · 0 评论 -
mac下安装编译ffmepg方法
登陆官网:ffmpeg官网如下图点击:download snapshot编译并指定安装路径./configure --perfix=/usr/local/ffmpegmake -j 4make install之后我们可以在上面的安装路径下看到如下图所示目录原创 2021-12-01 22:50:23 · 499 阅读 · 0 评论 -
ffmpeg视频播放流程
1.下这张图是我们播放视频的时候原始文件一步步解码,数据转换直到计算机可以播放的情况的整体流程2.下面这张图是原始文件播放和分解为音视频文件的流程图3.下面这张图是ffmpeg解码的数据结构分析:注意上面的图AVStream[0]数组下标0,这一排一般代表视频文件系列。AVStream[1]数组下标1,这一排一般代表音频文件系列。最终所有的数据是通过AVPacket打包的组织形式存在,包再通过decode解码,解析出ACFrame一帧一帧的数据。4.下面这张图是ffmpeg解码流程图...原创 2021-11-29 21:05:21 · 845 阅读 · 0 评论 -
ffmpeg基础流程:音频处理
一:样例流程下图是音频采样PCM的一个过程。模拟数据->采样:将对应格式的连续的模拟信号装转化为离散的数字信号。采样->量化:就是尽可能最大化最具代表性的集结采样信息离散点,是原来的数据能够正常表达。量化->编码:将这些量化的信息,转化为计算机能够识别的信息。编码->数字信息:最后将这些信息转化为计算机能够处理的和样本信号,实现音视频的播放。二:基本使用具体操作流程请看我的资源里面的介绍。ffmpeg入门及应用方法三:PCM过程的一些参数分析1.采样率:单位HZ原创 2021-11-29 16:05:51 · 1856 阅读 · 0 评论