![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
音视频
文章平均质量分 81
Odin_Hua
这个作者很懒,什么都没留下…
展开
-
音视频录制器—打包数据流
av_rescale_q_rnd:通过指定方式,使用两个时间基,调整一个64位整数;avformat_alloc_output_context2:申请一个用于输出格式的AVFormatContext。avformat_write_header:申请数据流的私有数据,并将数据流header写入到输出文件。根据帧持续时间和帧数计算出当前数据流时间,再根据输入数据流时间基,换算成输入数据流中的时间戳。...原创 2022-08-14 23:55:11 · 252 阅读 · 0 评论 -
音视频录制器—捕获并保存摄像头和麦克风数据
av_write_frame:将数据包写入输出媒体文件,与av_interleaved_write_frame类似,区别在于前者只能用于单一数据流,后者可以用于单一或多个数据流。avcodec_encode_video2:对视频帧进行编码,从AVFrame中获取输入的原始视频数据,并将下一个输出数据包写入到AVPacket中。channels和channel_layout,输入数据的通道数和通道布局,如双通道,AV_CH_LAYOUT_STEREO布局;:指向字典结构指针的指针。......原创 2022-08-14 23:50:01 · 236 阅读 · 0 评论 -
音视频播放器—变速播放
因为视频帧持续时间的获取是根据基于pts的音视频时钟差和初始持续时间来获取的,所以当音频和视频同时变速时,不需要更改音频帧和视频帧的pts数据,即可维持两者之间的差值在同一基准。由于时间关系,此处使用了一个简化版本的变速播放方案,即视频变速采用改变每帧持续时间的方法,音频变速采用丢帧和填充帧的方法;改变视频播放速率的方法为直接改变帧率即改变每帧的帧持续时间,加速时缩短帧持续时间,反之减小帧持续时间。但是这种方法会导致声音在变速的同时变调。丢帧和填充帧,即加速播放时丢帧处理,反之在原始帧之间填充空白帧。...原创 2022-07-26 01:28:43 · 583 阅读 · 0 评论 -
音视频播放器—快进快退及逐帧播放
选择跳转后选取的数据流,如果为-1,则选择默认流,并且时间戳会自动从AV_TIME_BASE单位转换为特定于流的time_base;以AVStream.time_base为单位的时间戳,如果未指定流,则以AV_TIME_BASE为单位。当发生文件跳转时,原本demux时存取在队列中的数据包,以及解码后的数据包都不能使用,因此要进行清空队列操作。然后加上当前的跳转变化量,作为跳转到文件中的位置。多媒体文件的句柄,即打开文件时所使用的AVFormatContext结构体;...原创 2022-07-21 00:08:43 · 899 阅读 · 0 评论 -
音视频播放器—音视频同步
以视频时钟举例,当解码了一帧视频帧后,即以转换了时间基的pts作为当前视频时钟的基准,同时保存当前的外部时钟时间。当获取视频时钟时,获取的不是视频帧pts,而是以pts为基准,加上更新视频时钟基准到现在过去的时间,作为视频时钟。中提到了PID控制器的方法,这里也试着使用这种方法,实际效果上能将音视频时钟差收敛至视频帧一帧持续时长内(测试视频的最高帧率为60fps)。,简单来说就是根据音频时钟和视频时钟的差值去动态校准视频帧的持续时长(若视频时钟落后太多则进行丢帧处理),以达到音视频同步的效果。...原创 2022-07-20 23:44:55 · 243 阅读 · 0 评论 -
视频播放器—外部时钟源同步
获取视频时钟,首先要获取视频帧的显示时间戳pts;在AVFrame结构体中,有一成员变量为best_effort_timestamp,该变量是 单位为数据流时间基的帧时间戳,官方解释如下:获取到该时间戳后,再将其单位由数据流时间基转换为正常时间;这里的时间基是使用AVRational结构提描述的,即分子—分母式的描述方式;这里使用 av_q2d() 函数对其进行转换,将AVRational描述的时间基转换为正常时间基。具体流程如下:获取外部时钟外部时钟主要依赖于 av_gettime() 函数,原创 2022-07-10 16:01:17 · 369 阅读 · 0 评论 -
视频播放器—纹理-渲染-窗口
SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成;其封装了复杂的视音频底层交互工作,简化了视音频处理的难度;多用于开发游戏、模拟器、媒体播放器等多媒体应用领域;OpenGL(Open Graphics Library - 开放图形库)是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API),这个接口由近350个不同的函数调用组成,用来从简单的图形比特绘制复杂的三维景象。SDL_CreateWindow:在特定位置创建一个指定大小原创 2022-07-10 15:58:00 · 171 阅读 · 0 评论 -
视频播放器—解码操作-图像后处理
avcodec_decode_video2:将大小为 avpkt->size 的视频帧从 avpkt->data 解码为图片。某些解码器可能支持单个 AVPacket包含多个帧,但解码器将只解码第一帧。AVCodecContext:描述该音频解码器上下文的结构体AVFrame:用于存储解码的数据int * got_frame_ptr:如果当前无法解码帧,则返回0;否则返回非0AVPacket:待解码的数据包返回值:负数表示出现错误,否则为解码时消耗AVPacket的字节数sws_getContext:原创 2022-07-10 15:56:46 · 933 阅读 · 0 评论 -
音频播放器—显示封面
AVStream结构体中的disposition参数,但该参数为AV_DISPOSITION_ATTACHED_PIC标志位时,表明存在封面图片。ffmpeg中对disposition参数的部分解释:ffmpeg中对AV_DISPOSITION_ATTACHED_PIC标志位解释如下因此当我们通过video stream的disposition参数判断是否有封面图片,然后从AVStream.attached_pic中去获取该封面图片。在创建纹理时需要指定输入数据的像素格式,同时该像素格式应为渲染器所支持。当原创 2022-07-10 15:53:56 · 627 阅读 · 0 评论 -
基于FFmpeg音视频项目的系列笔记
文章目录相关项目音频播放器视频播放器音视频播放器打包视频h264和音频aac为ts文件音视频录制器PCM音频数据封装为WAV文件FFmpeg笔记ffplay源码之serial变量ffplay源码之音视频同步分析基于FFmpeg音视频项目的基本知识点记录相关结构体AVPacket,AVFrame,AVStreamAVCodecContext,AVCodecAVFormatContext,AVIOContext音频播放器项目记录初始化打开音频设备(扬声器)保存未解码数据以及队列操作解码和重采样显示封面的图片视频原创 2022-04-22 02:34:22 · 2060 阅读 · 0 评论 -
Ubuntu 16.04 FFmpeg开发环境搭建
------------------------------------全系列文章目录------------------------------------以下为本人在搭建ffmpeg开发环境时遇到的问题和解决方法下载源码:https://launchpad.net/ubuntu/+source/ffmpeg/7:4.4.1-3ubuntu5选择某个版本,比如:ffmpeg_4.4.1.orig.tar.xz编译FFmpeg:https://www.cnblogs.com/deng-原创 2022-04-22 02:25:00 · 309 阅读 · 0 评论 -
音频播放器—解码和重采样
解码操作函数avcodec_decode_audio4,用于将AVPacket.size大小的AVPacket.data解码至AVFrame中,注意AVPacke可能包含多帧数据,但解码时一次只返回一帧数据。int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, const AVPacket *avpkt);AVCodecCo原创 2022-04-22 01:55:08 · 513 阅读 · 0 评论 -
音频播放器—读取未解码数据以及队列操作
读取MP3文件中的未解码数据包,保存为AAC文件av_read_frame(AVFormatContext *s, AVPacket *pkt) :此函数返回文件中存储的内容,它会将文件中存储的内容拆分为帧,并为每个调用返回一个帧。av_packet_unref(AVPacket *pkt):此函数用于擦拭数据包, 即取消引用数据包引用的缓冲区并将剩余的数据包字段重置为其默认值。url_feof(AVIOContext *s):当文件结束时返回非零,否则返回零。代码如下所示:/*原创 2022-04-22 01:52:56 · 2361 阅读 · 0 评论 -
音频播放器—打开音频设备(扬声器)
本文主要记录音频播放器中打开音频设备(扬声器)的操作音频文件主要有以下几个参数声道数:声道(Sound Channel) 是指声音在录制或播放时在不同空间位置采集或回放的相互独立的音频信号,所以声道数也就是声音录制时的音源数量或回放时相应的扬声器数量。声道布局:根据声道数,摆放录制设备或扬声器设备。采样数:一帧音频帧的样本数量。采样率:每秒音频的样本数量。采样位数/采样格式:每个采样样本的量化位数。SDL_AudioSpec结构体同样道理,要想音频设备驱动程序能正确使用音频设备播放一原创 2022-04-22 01:49:47 · 766 阅读 · 0 评论 -
音视频播放器—初始化操作
本文主要记录音视频播放器的一些初始化操作av_register_all()该函数调用avcodec_register_all()注册了和编解码器有关的组件,如硬件加速器、解码器、编码器、Parser和Bitstream Filter;同时注册了复用器、解复用器和协议处理器。注册函数都大同小异,都是设定一个全局静态的链表头,将注册的组件以链表的形式保存起来,同时进行一些初始化操作。如编解码器的注册函数如下,可知其最终是调用了avcodec_register这个函数。#define REG原创 2022-04-22 01:43:17 · 1986 阅读 · 0 评论 -
AVFormatContext,AVIOContext结构体
URLContext用于描述URLProtocol的上下文typedef struct URLContext { const AVClass *av_class; /**< information for av_log(). Set by url_open(). */ const struct URLProtocol *prot; void *priv_data; char *filename; /**< specified原创 2022-04-22 01:32:53 · 135 阅读 · 0 评论 -
AVCodecContext,AVCodec结构体
AVCodec该结构体用于描述编解码器信息/* !!! 略有删减 */typedef struct AVCodec { const char *name; //编解码器名称,编码器之间和解码器之间是唯一的,但是编码器和解码器可共享同一个名字 const char *long_name; //编解码器的描述性名称,更易于阅读 enum AVMediaType type; //指明编解码器类型,视频、音频或字幕 enum AVCodecID id; //编解码器原创 2022-04-22 01:30:03 · 1307 阅读 · 0 评论 -
AVPacket,AVFrame,AVStream结构体
AVPacket用于描述压缩编码数据,其可作为输入传递给解码器,或者作为输出传递给编码器。对于视频,它通常应该包含一个压缩帧。对于音频,它可能包含多个压缩帧。使用 av_packet_alloc() 分配,使用 av_packet_free() 释放。/* !!!略有删减 */typedef struct AVPacket { AVBufferRef *buf; int64_t pts; //显示时间戳 int64_t dts; //解码时间戳 uint原创 2022-04-22 01:25:24 · 454 阅读 · 0 评论 -
PCM音频数据封装为WAV文件
PCM(Pulse Code Modulation,脉冲编码调制),PCM音频数据是指经过采样、量化、编码转换成的未压缩数字音频数据。WAV最常见的声音文件格式之一,是微软公司专门为Windows开发的一种标准数字音频文件,该文件能记录各种单声道或立体声的声音信息,并能保证声音不失真。WAV格式组成RIFF(Resource Interchange File Format,资源交换档案标准),是一种把资料储存在被标记的区块(tagged chunks)中的档案格式(meta-forma..原创 2022-03-19 15:36:37 · 3418 阅读 · 0 评论 -
ffplay源码之音视频同步分析
本文是根据ffplay源码-https://ffmpeg.org/download.html,分析其音视频同步的方式,不当之处恳请批评指正。视频显示的操作在主线程的refresh_loop_wait_event函数中,该函数及相关注释如下static void refresh_loop_wait_event(VideoState *is, SDL_Event *event) { double remaining_time = 0.0; /*从设备收集所有待处理的输入信息并将其放入事件原创 2022-02-07 15:23:31 · 1457 阅读 · 0 评论 -
ffplay源码之serial变量
本文是根据ffplay源码-https://ffmpeg.org/download.html,分析其中的serial变量,不当之处恳请批评指正。serial翻译为连续的,在ffplay中是用于判断播放是否连续的标志,serial变量存在于自定义的多个结构体中/*存储未解码数据包*/typedef struct MyAVPacketList { AVPacket *pkt; int serial;} MyAVPacketList;/*存储未解码数据包的队列*/typedef原创 2022-02-07 15:05:23 · 1374 阅读 · 0 评论