FFMPEG学习【libavcodec】:解码

FFmpeg API 之 libavcodec库 libavformat 库负责封装和解封装,而 libavcodec 则用于解码和编码。 类型 AVPacket 表示编码后的数据,其中包含一个或多个编码后的帧数据。类型 AVFrame 表示解码后,或者说原始的帧数据。编码和解码在某种程度来说,就是两者之间的互相转换。 1、编解码概述 FFmpeg 提供的 encode/decode API 有如下四个函数 avcodec_send_packet () / avcodec_receive_frame () / avcodec_send_fram. 阅读详情

一、模块

帧解析



二、宏

#define 	AV_INPUT_BUFFER_PADDING_SIZE   32

注释:在输入比特流结尾的要求附加分配字节的数量上进行解码。

这主要是因为一些优化的比特流读取器一次读取32位或64位,并且可以读取结束字节之外。

注意:如果附加字节的前23位不为0,则损坏的MPEG比特流可能会导致重读和segfault。



三、枚举

enum  	AVDiscard { 
  AVDISCARD_NONE =-16,		//无丢弃
  AVDISCARD_DEFAULT = 0, 	//在avi中丢弃如0个大小的无用的数据包
  AVDISCARD_NONREF = 8, 	//丢弃所有非参考
  AVDISCARD_BIDIR = 16, 	//丢弃所有双向帧
  AVDISCARD_NONINTRA = 24,	//丢弃所有非内帧
  AVDISCARD_NONKEY = 32, 	//丢弃除关键帧之外的所有帧
  AVDISCARD_ALL = 48 		//丢弃所有
}


四、函数

1、AVCodec * avcodec_find_decoder(enum AVCodecID id)
注释:查找匹配编解码器ID的注册解码器。

参数:id-所请求解码器的AVCodecID

返回:返回找到的解码器,否则返回空。


2、AVCodec * avcodec_find_decoder_by_name (const char *name)

注释:查找指定名称的注册解码器。


3、int avcodec_default_get_buffer2 (AVCodecContext *s, AVFrame *frame, int flags)

注释:AVCodecContext.get_buffer2()的默认回调。

参数:name-请求的解码器的名称

返回:返回找到的解码器,否则返回空。


4、attribute_deprecated unsigned avcodec_get_edge_width(void)

注释:在不具有CODEC_FLAG_EMU_EDGE标志的编解码器的情况下,返回get_buffer回调必须围绕图像边缘提供的填充量。【已废除】

此被设置成公开,因此可以通过自定义get_buffer2()实现来对无AVCODEC_CAP_DR1设置的解码器进行调用。

返回:需要在像素中的填充

CODEC_FLAG_EMU_EDGE已被弃用,因此不再需要此函数


5、void avcodec_align_dimensions(AVCodecContext * s,int * width,int * height)

注释:修改宽度和高度值,以便如果不使用任何水平填充,它们将导致编解码器可接受的内存缓冲区。

只有在早已打开的具有AV_CODEC_CAP_DR1的编解码器才能使用。


6、void avcodec_align_dimensions2(AVCodecContext * s,int * width,int * height,int linesize_align [AV_NUM_DATA_POINTERS])

注释:修改宽度和高度值,以便如果还要确保所有行大小都是相应的linesize_align [i]的倍数,它们将导致编解码器可接受的内存缓冲区。

只有在早已打开的具有AV_CODEC_CAP_DR1的编解码器才能使用。


7、int avcodec_enum_to_chroma_pos(int * xpos,int * ypos,enum AVChromaLocation pos)

注释:将AVChromaLocation转换为swscale x / y色度位置。

位置表示坐标系中的色度(0,0)位置,其中亮度(0,0)表示原点,亮度(1,1)表示256,256

参数:xpos-水平色度样本位置

            ypos-垂直色度样本位置


8、enum AVChromaLocation avcodec_chroma_pos_to_enum (int xpos, int ypos)

注释:将swscale x / y色度位置转换为AVChromaLocation。

位置表示坐标系中的色度(0,0)位置,其中亮度(0,0)表示原点,亮度(1,1)表示256,256

参数:xpos-水平色度样本位置

            ypos-垂直色度样本位置


9、attribute_deprecated int avcodec_decode_audio4(AVCodecContext * avctx,AVFrame * frame,int * got_frame_ptr,const AVPacket * avpkt)

注释:将来自avpkt->data大小为avpkt->size的音频帧解码到frame。【已废除】

一些解码器可以支持单个AVPacket中的多个帧。 这样的解码器将解码第一帧,并且返回值将小于分组大小。 在这种情况下,必须再次使用包含剩余数据的AVPacket来再次调用avcodec_decode_audio4,以便对第二帧进行解码等。即使没有帧被返回,数据包也需要用剩余的数据提供给解码器,直到它被完全消耗或发生错误。

一些解码器(标有AV_CODEC_CAP_DELAY的解码器)在输入和输出之间有延迟。 这意味着对于某些数据包,它们不会立即产生解码输出,并且需要在解码结束时刷新以获得所有解码的数据。 通过使用avpkt->数据设置为NULL并将avpkt-> size设置为0的数据包调用此函数来完成刷新,直到它停止返回样本。 即使是那些没有标记AV_CODEC_CAP_DELAY的解码器也是安全的,所以不会返回样品。

警告:输入缓冲区avpkt->data必须大于实际读取字节的AV_INPUT_BUFFER_PADDING_SIZE,因为一些优化的位流读取器同时读取32位或64位,并可以超界阅读。

注意:AVCodecContext必须在avcodec_open2()之前打开,才能将数据包送入解码器。

参数:avctx-编解码器上下文

            [out]frame-用于存储解码音频样本的AVFrame。 解码器将通过调用AVCodecContext.get_buffer2()回调为解码帧分配一个缓冲区。 当AVCodecContext.refcounted_frames设置为1时,帧被引用计数,返回的引用属于呼叫者。 当不再需要帧时,呼叫者必须使用av_frame_unref()释放帧。 如果av_frame_is_writable()返回1,则呼叫者可以安全地写入帧。当AVCodecContext.refcounted_frames设置为0时,返回的引用属于解码器,并且只有在下一次调用此函数或直到关闭或刷新解码器之前才有效。 调用者可能不会写入。

            [out]got_frame_ptr:如果不能解码帧,则为零,否则为非零。 请注意,该字段设置为零并不意味着发生错误。 对于AV_CODEC_CAP_DELAY设置的解码器,没有给定的解码调用保证产生一个帧。

            [out]avpkt-输入AVPacket包含输入缓冲区。 应至少设置avpkt-> data和avpkt-> size。 某些解码器可能还需要设置其他字段。

返回:如果在解码期间发生错误,则返回负错误代码,否则返回从输入AVPacket消耗的字节数。

废弃:使用avcodec_send_packet()和avcodec_receive_frame()。


10、attribute_deprecated int avcodec_decode_video2(AVCodecContext * avctx,AVFrame * picture,int * got_picture_ptr,const AVPacket * avpkt)

注释:将来自avpkt->data大小为avpkt->size的音频帧解码到picture。【已废除】

一些解码器可以支持单个AVPacket中的多个帧,这样的解码器将仅解码第一帧。

警告:输入缓冲区avpkt->data必须大于实际读取字节的AV_INPUT_BUFFER_PADDING_SIZE,因为一些优化的位流读取器同时读取32位或64位,并可以超界阅读。输入缓冲区buf的结尾应设置为0,以确保损坏的MPEG流不会发生超线程。

注意:具有AV_CODEC_CAP_DELAY功能集的编解码器在输入和输出之间具有延迟,这些需要在末尾馈送avpkt-> data = NULL,avpkt-> size = 0以返回剩余的帧。AVCodecContext必须在avcodec_open2()之前打开,才能将数据包送入解码器。

参数:avctx-编解码器上下文

        [out]picture-将存储解码的视频帧的AVFrame。使用av_frame_alloc()获取AVFrame。编解码器将通过调用AVCodecContext.get_buffer2()回调为实际位图分配内存。当AVCodecContext.refcounted_frames设置为1时,帧被引用计数,返回的引用属于调用者的参数。如果av_frame_is_writable()返回1,则调用者可以安全地写入帧。当AVCodecContext.refcounted_frames设置为0时,返回的引用属于解码器,并且只有在下一次调用此函数或直到关闭或刷新解码器之前才有效。调用者可能不会写入。

            [in]avpkt-输入AVPacket包含输入缓冲区。 您可以使用av_init_packet()创建此类数据包,然后设置数据和大小,某些解码器可能需要其他字段,如flags&AV_PKT_FLAG_KEY。 所有解码器都设计为尽可能少地使用。

            [in,out]got_picture_ptr-如果不能解压缩帧,则为零,否则为非零。

返回:在错误时,返回一个负值,否则返回使用的字节数,如果没有帧可以被解压缩,则返回零。

废弃:使用avcodec_send_packet()和avcodec_receive_frame()。


11、int avcodec_decode_subtitle2(AVCodecContext * avctx,AVSubtitle * sub,int * got_sub_ptr,AVPacket * avpkt)

注释:解码字幕讯息。

返回错误的负值,否则返回使用的字节数。 如果没有字幕可以被解压缩,则get_sub_ptr为零。 否则,字幕存储在* sub中。 请注意,AV_CODEC_CAP_DR1不适用于字幕编解码器。 这是为了简单起见,因为性能差异是可以忽略的,并且由于潜在的非常不同的分配模式,重用为视频编解码器编写的get_buffer可能会执行不良。

一些解码器(标有AV_CODEC_CAP_DELAY的解码器)在输入和输出之间有延迟。 这意味着对于某些数据包,它们不会立即产生解码输出,并且需要在解码结束时刷新以获得所有解码的数据。 通过使用avpkt->data设置为NULL并将avpkt-> size设置为0的数据包调用此函数完成刷新,直到它停止返回字幕。 即使是没有标纪AV_CODEC_CAP_DELAY的解码器也是安全的,则不会返回任何字幕。

注意:AVCodecContext必须在avcodec_open2()之前打开,才能将数据包送入解码器。

参数:avctx-编解码器上下文

    [out]sub-已解码的字幕存储在其中的预分配AVSubtitle,如果设置了* got_sub_ptr,则必须使用avsubtitle_free释放。

    [in,out]got_sub_ptr-如果没有字幕可以解压缩,则为零,否则为非零。

            [in]avpkt-输入AVPacket包含输入缓冲区。


12、int avcodec_send_packet(AVCodecContext * avctx,const AVPacket * avpkt)

注释:将原始分组数据作为输入提供给解码器。

在内部,此调用将复制相关的AVCodecContext字段,这可以影响每个数据包的解码,并在数据包实际解码时应用它们。 (例如AVCodecContext.skip_frame,它可能会指示解码器丢弃由此函数发送的数据包所包含的帧。)

警告:输入缓冲区avpkt->data必须大于实际读取字节的AV_INPUT_BUFFER_PADDING_SIZE,因为一些优化的位流读取器同时读取32位或64位,并可以越界读取。不要将该API与旧版API(如avcodec_decode_video2())混合在同一AVCodecContext上。 它将会在现在或将来的libavcodec版本中返回意外的结果。

注意:AVCodecContext必须在avcodec_open2()之前打开,才能将数据包送入解码器。

参数:avctx-编解码器上下文

     [in]avpkt-输入AVPacket。 通常,这将是一个单一的视频帧,或几个完整的音频帧。 分组的所有权仍然在呼叫者身上,解码器将不会写入数据包。 解码器可以创建对分组数据的引用(或者如果分组未被引用计数则复制它)。 与旧的API不同,数据包总是完全消耗,如果包含多个帧(例如一些音频编解码器),则需要多次调用avcodec_receive_frame(),然后再发送一个新的数据包。 它可以为NULL(或者AVPacket的数据设置为NULL,大小设置为0); 在这种情况下,它被认为是一个flush数据包,它表示流的结尾。 发送第一个flush数据包将返回成功。 后续的是不必要的,并将返回AVERROR_EOF。 如果解码器仍然有帧缓冲,它将在发送flush数据包后返回它们。

返回:0成功,否则为否定错误代码:AVERROR(EAGAIN):在当前状态下不接受输入 - 用户必须使用avcodec_receive_frame()读取输出(一旦读取所有输出,应重新发送数据包,并且调用不会EAGAIN失败。AVERROR_EOF:解码器已被刷新,并且不会向其发送新的数据包(如果发送多于1个数据包,则返回)。AVERROR(EINVAL):编解码器未打开,它是编码器,或需要刷新。AVERROR(ENOMEM) :无法向内部队列添加数据包,或类似的其他错误:合法的解码错误。


13、int avcodec_receive_frame(AVCodecContext * avctx,AVFrame * frame)

注释:从解码器中返回解码的输出数据。

参数:avctx-编解码器上下文。

    frame-这将被设置为由解码器分配的参考计数的视频或音频帧(取决于解码器类型)。 请注意,在执行其他任何操作之前,该函数将始终调用av_frame_unref(frame)。

返回:0:成功,一个帧被返回。AVERROR(EAGAIN):输出在这种状态不可用 - 用户必须尝试发送新的输入。AVERROR_EOF:解码器已被完全刷新,并且不会有更多的输出帧。AVERROR(EINVAL): 编解码器未打开,否则为编码器其他负值:合法解码错误。


14、int avcodec_send_frame(AVCodecContext * avctx,const AVFrame * frame)

注释:向编码器提供原始视频或音频帧。

使用avcodec_receive_packet()来检索缓冲的输出数据包。

参数:avctx-编解码器上下文。

    [in]frame-AVFrame包含要编码的原始音频或视频帧。 帧的所有权保留在调用者身上,编码器不会写入帧。 编码器可以创建对帧数据的引用(或者如果帧不被引用计数,则其复制)。 它可以是NULL,在这种情况下,它被认为是一个flush数据包。 这表示流的结尾。 如果编码器仍然有缓冲的数据包,它将在此调用后返回。 一旦输入了刷新模式,将忽略其他刷新数据包,发送帧将返回AVERROR_EOF。

对于音频:如果设置了AV_CODEC_CAP_VARIABLE_FRAME_SIZE,则每个帧可以有任意数量的样本。 如果未设置,对于除最后一个以外的所有帧,frame-> nb_samples必须等于avctx-> frame_size。 最后一帧可能小于avctx-> frame_size。

返回:0成功,否则为错误代码。AVERROR(EAGAIN):在当前状态下不输入输入 - 用户必须使用avcodec_receive_packet()读取输出(一旦读取所有输出,应重新发送数据包,并且调用不会EAGAIN失败 )。 AVERROR_EOF:编码器已被刷新,并且没有新的帧可以发送到它。AVERROR(EINVAL):编解码器未打开,refcounted_frames未设置,它是解码器,或需要刷新。AVERROR(ENOMEM):无法向内部队列添加数据包 ,或类似的其他错误:合法的解码错误。



15、int avcodec_receive_packet(AVCodecContext * avctx,AVPacket * avpkt)

注释:从编码器读取编码数据。

参数:avctx-编解码器上下文。

    avpkt-这将被设置为由编码器分配的引用计数的分组。 请注意,在执行其他任何操作之前,该函数将始终调用av_frame_unref(frame)。

返回:0成功,否则为错误代码。AVERROR(EAGAIN):输出在当前状态下不可用 - 用户必须尝试发送输入。AVERROR_EOF:编码器已经完全刷新,并且不会有更多的输出数据包。AVERROR(EINVAL) :编解码器未打开,否则为编码器其他错误:合法解码错误。


ffmpeg播放器实现详解 - 视频同步控制 ffplay是ffmpeg源码中一个自带的开源播放器实例,同时支持本地视频文件的播放以及在线流媒体播放,功能非常强大。ffplay中的代码充分调用了ffmpeg中的函数库,因此,想学习ffmpeg的使用,或基于ffmpeg开发一个自己的播放器,ffplay都是一个很好的切入点。由于ffmpeg本身的开发文档比较少,且ffplay播放器源码的实现相对复杂,除了基础的ffmpeg组件调用外,还包含视频帧的渲染、音频帧的播放、音视频同步策略及线程调度等问题。 阅读详情

相关推荐

ffmpeg快速解码抽帧,解码关键帧

背景 有很多的视频抽帧的场景,比如视频内容审核,需要对大量的视频来做视频抽帧,虽然视频的解码速度比较快,但是视频量和时长上来后,对整体的资源开销也是非常的大,如果可以在抽帧过程中只解码需要的关键帧,就会节省大量的计算资源。 测试环境 构建测试片源 ffmpeg -i src.mp4 -c:v libx264 -preset veryfast -crf 24 -g 500 -keyint_min 250 -r 25 -an -f mp4 test.mp4 -y 查看片源I帧信息 ffprobe -i tes

ternence_hsu的博客 9397

ffmpeg的API函数变化记录

最近在搞ffmpeg的时候发现下面函数出错: tutor.o: In function \`our_get_buffer\': tutor.c:530: undefined reference to \`avcodec_default_get_buffer\' 怀疑是ffmpeg的函数变了,放弃了这个,查了文档,果然是这样。 Add avcodec_default_get_buffer2() a...

猫瑾的博客 5192

FFMPEG中libavcodec的软件架构是怎么样的?如何使用?

libavcodec`是FFmpeg项目中的核心库之一,它提供了一个开源的音视频编解码框架。`libavcodec`支持广泛的编解码器,可以处理几乎所有常见的音频和视频格式。它的软件架构设计为模块化,允许开发者根据需要选择和使用不同的编解码器。

bai915290475的博客 842

AV_CODEC_FLAG_GLOBAL_HEADER的设置问题

如果AVCodecContext中设置了AV_CODEC_FLAG_GLOBAL_HEADER标志,对于生成的视频文件(如mp4),在windows操作系统下,并以图标的方式查看该视频文件时,视频文件的图标将是视频文件的第一帧,从而起到预览的作用以下为转载内容(http://blog.51cto.com/fengyuzaitu/2058061)http://blog.youkuaiyun.com/passio...

8575

231003-四步MacOS-iPadOS设置无线竖屏随航SideCar

新建虚拟屏幕参考文献。

专注机器学习之路 7485

AI 自动生成商业计划书:AIGC 如何助力创业者?

在创业的早期阶段,商业计划书(Business Plan)是至关重要的。它不仅用于吸引投资者、明确发展路径,还能帮助团队对业务模式、市场定位和财务预测有清晰认知。然而,撰写一份高质量的商业计划书往往需要投入大量时间和精力。如今,AIGC(AI Generated Content,人工智能生成内容)技术正在改变这一现状。借助 AIGC,创业者可以更快速、高效地创建商业计划书,并通过 AI 进行优化和数据分析。

2401_82808034的博客 3780

FFMPEG学习【libavcodec】:解码:帧解析

一、数据结构 struct AVCodecParserContext struct AVCodecParser 二、枚举 enum AVPictureStructure {  AV_PICTURE_STRUCTURE_UNKNOWN,  AV_PICTURE_STRUCTURE_TOP_FIELD,  AV_PICTURE_STRUCTURE_BOTTOM_FIE

一世豁然的专栏 1470

手把手教你用ArduPilot搭建低成本无人车(附APM飞控+有刷电调配置清单)

本文提供了一份基于ArduPilot开源平台搭建低成本智能无人车的详细实战指南。核心内容包括APM架构飞控的选型、双向有刷电调的兼容性配置与校准、系统连接逻辑,以及通过Mission Planner地面站进行参数调校和自主导航功能设置的完整流程,帮助爱好者快速实现从手动控制到自主行驶的跨越。

java5的博客 850

FFMPEG学习【libavcodec】:发送/接收编码和解码API概述

avcodec_send_packet()/ avcodec_receive_frame()/ avcodec_send_frame()/ avcodec_receive_packet()函数提供了一个输入和输出的编码/解码API。 API与编码/解码和音频/视频非常相似,工作原理如下: 1、像往常一样设置和打开AVCodecContext。 2、发送有效输入:  1)

一世豁然的专栏 1万+

RocketMQ 为什么要自己做一个 NameServer ?RocketMQ 5.x 版本中的 proxy、controller 和 container 分别有什么用 ?

1.独立运行的分散结构 2.简化实现,容忍部分数据不一致 Proxy:多语言支持、简化开发 Controller: 提高 Broker 的性能 Container:提高资源利用率,平衡负载

xaiobit_hl的博客 1489

电磁场仿真软件:Sonnet_(3).Sonnet用户界面与操作

Sonnet支持用户通过二次开发自定义工具,例如:编写Python脚本,实现自定义功能。将脚本保存为工具插件。在Sonnet中加载并使用自定义工具。# 示例:自定义工具 import sonnet def custom_tool(design , object , parameter , value) : """自定义工具示例,设置对象的指定参数。

kkchenjj的博客 1523

FFMPEG学习【libavcodec】:编解码器:硬件加速器桥:VDA

一、文件 vda.h 公共libavcodec VDA头文件。 二、数据结构 struct   vda_context{ VDADecoder decoder; VDA解码器对象。 编码:未使用。 解码:通过libavcodec设置/取消。 CVPixelBufferRef cv_buffer; 包含当前图像数据的Core Video像素缓冲

一世豁然的专栏 3021

图解电动汽车:电动汽车主要参数

动力性指标 汽车的动力性指标主要有最高车速、加速时间、最大爬坡等,体现了汽车在行驶过程中能达到的极限运动水平。对于电动汽车,其动力性由搭载的驱动电动机决定,主要的参数包括最大扭矩、额定功率、最大功率、最大转速等。 功率是指物体在单位时间内所做的功的多少,是描述做功快慢的物理量,单位是 kW。 扭矩是指机械元件转动的力矩,也称转矩,表示转动力量的大小,单位是 N·m。 转速是指发动机/电动机的转速,的单位是 rpm,即转每分钟。额定转速是指在额定功率下电动机的转速,最大转速则是在最大功率下电动机的转速。

程序员「阿基米东」的编程之旅 2万+

FFMPEG学习【libavcodec】:编解码器:硬件加速器桥:VA API Decoding

一、文件 vaapi.h 公共libavcodec VA API头。 二、

一世豁然的专栏 1434

【目标跟踪】多目标跟踪的评价工具motmetrics怎么使用?

多目标跟踪,通过motmetrics测试评价对应的视频。

聿默的博客 5368

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

FFMPEG学习【libavcodec】:编解码器:硬件加速器桥:VDPAU解码器和渲染器

一、文件 vdpau.h 公共libavcodec VDPAU头文件。 二、数据结构 union   AVVDPAUPictureInfo{ VdpPictureInfoH264 h264; VdpPictureInfoMPEG1Or2 mpeg; VdpPictureInfoVC1 vc1; VdpPictureInfoMPEG4Part2

一世豁然的专栏 5363

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

FFMPEG学习【libavcodec】:编解码器:硬件加速器桥:XvMC

一、文件 xvmc.h 公共libavcodec XvMC头文件。 二、数据结构 三、宏 #define AV_XVMC_ID   0x1DC711C0

一世豁然的专栏 1484

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

FFMPEG学习【libavcodec】:编解码器:硬件加速器桥:Direct3D11

一、数据结构 struct AVD3D11VAContext{ ID3D11VideoDecoder * decoder; //D3D11解码器对象。 ID3D11VideoContext * video_context; //D3D11视频上下文 D3D11_VIDEO_DECODER_CONFIG * cfg //D3D11配置用于创建解码器。 unsi

一世豁然的专栏 6487

FFMPEG学习【libavcodec】:编解码器:硬件加速器桥:DXVA2

一、文件 dxva2.h 公共libavcodec DXVA2有文件。 二、数据结构 struct dxva_context{ IDirectXVideoDecoder * decoder; //DXVA2解码器对象。 const DXVA2_ConfigPictureDecode * cfg; //DXVA2配置用来创建解码器。 unsigned

一世豁然的专栏 2190

如何快速掌握FFmpeg核心功能?learn-ffmpeg带你入门容器与编解码器

想要快速掌握音视频处理的核心技术吗?FFmpeg作为业界最强大的多媒体处理工具,学习它可能会让你感到有些挑战。但别担心,通过learn-ffmpeg项目的系统学习,你将能够轻松理解容器与编解码器的核心概念,快速上手FFmpeg的各项功能。本文将为你提供一份完整的FFmpeg入门指南,帮助你从零开始掌握这个强大的音视频处理工具。 ## 🔍 FFmpeg到底是什么? FFmpeg是一套完整的开源

gitblog_01198的博客 689

音视频开发真实路径:C++→Linux→FFmpeg→WebRTC四阶进阶

音视频开发是融合底层编程、操作系统、多媒体协议与实时通信的复合型工程能力。其核心建立在C++的内存与并发控制之上,依托Linux内核机制实现高效数据流转,通过FFmpeg统一抽象协议、算法与硬件加速层,最终由WebRTC定义端到端实时传输的分布式系统范式。掌握这四大技术栈的嵌套关系与演进逻辑,是解决直播卡顿、编解码延迟、硬件适配异常等真实问题的关键基础。本文聚焦音视频开发中C++内存安全、Linux内核级调优、FFmpeg源码改造及WebRTC深度定制四大实战维度,覆盖智能硬件、远程协作、云游戏等强实时场景

weixin_30619101的博客 352

基于 FFMPEG 的视频解码(libavcodec ,致敬雷霄骅)

基于 FFMPEG 的视频解码(libavcodec ,致敬雷霄骅) 本文参考了雷博士的博客: 最简单的基于FFMPEG+SDL的视频播放器:拆分-解码器和播放器 基本上雷博士这篇博客已经把这个问题讲的挺清楚了。但是 ffmpeg 新版本的 API 有变化,这篇博客的代码已经无法直接编译运行。所以我写了今天这篇博客,用 新的 API 实现了视频解码的功能。 雷博士的代码除了视频解码还有音频解码,同时还利用 SDL 把视频显示出来了。 我觉得作为初学者还是每次学习的内容不要太多。既然我们的重点是视频解码,那就

Ivan 的专栏 6276

最简单的基于FFmpeg的解码器-纯净版(不包含libavformat)

本文记录一个更加“纯净”的基于FFmpeg的视频解码器。此前记录过基于FFmpeg的视频播放器实际上就是一个解码器:《最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)》这个播放器调用了FFmpeg中的libavformat和libavcodec两个库完成了视频解码工作。但是这不是一个“纯净”的解码器。该解码器中libavformat完成封装格式的解析,而libavcod

雷霄骅(leixiaohua1020)的专栏 6万+

FFmpeg 音频重采样的两种方法libavcodec和libswresample

1、libavcodec 2、libswresample

myvest的专栏 7423
上一篇: API Guide:自定义组件
下一篇: FFMPEG学习【libavcodec】:解码:帧解析
一世豁然
博客等级 码龄15年 1276粉丝 146原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值