FFmpeg5.0源码阅读—— av_read_frame

这篇具有很好参考价值的文章主要介绍了FFmpeg5.0源码阅读—— av_read_frame。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  摘要:本文主要描述了FFmpeg中用于打开编解码器接口av_read_frame的具体调用流程,详细描述了该接口被调用时所作的具体工作。
  关键字ffmpegav_read_frame
  读者须知:读者需要了解FFmpeg的基本使用流程,以及一些FFmpeg的基本常识,了解FFmpegIO相关的内容,以及大致的解码流程。
  使用FFmpeg解码视频时需要主动打开解码器获得解码器相关的Context,然后直接调用av_read_frame读取AVPacket码流数据送到FFmpeg中进行解码即可。本文主要通过源码了解FFmpeg搜索和打开解码器的基本实现原理和FFmpeg具体的解码流程。

2 av_read_frame

FFmpeg5.0源码阅读—— av_read_frame,ffmpeg,音视频,ffmpeg

  av_read_frame用于从已经打开的文件中读取未经过解码的码流AVPacket,对于视频帧就是一帧的压缩帧,对于音频帧如果音频是固定大小的话则可以是多帧,否则也是一帧。av_read_frame内部读取码流时调用avpriv_packet_list_getav_read_frame_internal
  avpriv_packet_list_get比较简单就是从当前媒体的PackList中取出一帧。av_read_frame的函数实现比较长,其大致流程为:

  1. 调用ff_read_packet读取一帧码流;
  2. 如果1步骤失败则调用parse_packet刷新解析器,否则继续到步骤3;
  3. 如果当前context需要更新解码器context,则将internal的解码器context更新到stream的解码器context;
  4. 如果成功拿到预期的帧则下一步,否则跳转到步骤1;
  5. 后续的工作就是解析元数据,计算需要丢弃的数据大小等。

  ff_read_packet会先检查缓冲区是否有帧没有的话就会调用s->iformat->read_packet即对应个是的解析码流的函数进行解码。每个FFmpeg支持的格式都有一个FormatContext描述对应格式的信息以及解析对应格式的函数指针,比如下面是mov的格式描述:

static const AVClass mov_class = {
    .class_name = "mov,mp4,m4a,3gp,3g2,mj2",
    .item_name  = av_default_item_name,
    .option     = mov_options,
    .version    = LIBAVUTIL_VERSION_INT,
};

const AVInputFormat ff_mov_demuxer = {
    .name           = "mov,mp4,m4a,3gp,3g2,mj2",
    .long_name      = NULL_IF_CONFIG_SMALL("QuickTime / MOV"),
    .priv_class     = &mov_class,
    .priv_data_size = sizeof(MOVContext),
    .extensions     = "mov,mp4,m4a,3gp,3g2,mj2,psp,m4b,ism,ismv,isma,f4v",
    .flags_internal = FF_FMT_INIT_CLEANUP,
    .read_probe     = mov_probe,
    .read_header    = mov_read_header,
    .read_packet    = mov_read_packet,
    .read_close     = mov_read_close,
    .read_seek      = mov_read_seek,
    .flags          = AVFMT_NO_BYTE_SEEK | AVFMT_SEEK_TO_PTS,
};

  从上面的过程能够看出av_read_frame完全是同步的操作,可能是比较耗时的,因为如果一直拿不到帧就会一直遍历当前媒体文件的buffer,因此一般建议开一个线程读取Packet。文章来源地址https://www.toymoban.com/news/detail-559925.html

到了这里,关于FFmpeg5.0源码阅读—— av_read_frame的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FFmpeg5.0源码阅读——FFmpeg大体框架(以GIF转码为示例)

       摘要 :前一段时间熟悉了下FFmpeg主流程源码实现,对FFmpeg的整体框架有了个大概的认识,因此在此做一个笔记,希望以比较容易理解的文字描述FFmpeg本身的结构,加深对FFmpeg的框架进行梳理加深理解,如果文章中有纰漏或者错误欢迎指出。本文描述了FFmpeg编解码框架的

    2024年02月10日
    浏览(41)
  • FFmpeg5.0源码阅读——avformat_open_input

       摘要 :本文主要描述了FFmpeg中用于打开文件接口 avformat_open_input 的具体调用流程,详细描述了该接口被调用时所作的具体工作。    : ffmpeg 、 avformat_open_input    注意 :读者需要了解FFmpeg的基本使用流程,以及一些FFmpeg的基本常识,了解FFmpegIO相关的内容,

    2024年02月11日
    浏览(36)
  • FFmpeg5.0源码阅读—— avcodec_send_frame && avcodec_receive_packet

       摘要 :本文主要描述了FFmpeg中用于编码的接口的具体调用流程,详细描述了该接口被调用时所作的具体工作。    : ffmpeg 、 avcodec_send_frame 、 avcodec_receive_packet    读者须知 :读者需要了解FFmpeg的基本使用流程,以及一些FFmpeg的基本常识,了解FFmpegIO相关的内

    2024年02月16日
    浏览(39)
  • 【Android音视频】MacOS上FFmpeg5.0.1编译

    1. FFmpeg官网下载链接(推荐下载release的版本): Download FFmpeg http://ffmpeg.org/download.html#releases  尽情去下载并开始编译吧 2. 下载压缩包,解压至自己想要的文件路径下即可。个人习惯用全英文路径,避免出现奇怪的问题。 3. Android Studio请预先下载好。点击AS右上角“SDK Manager”

    2024年02月02日
    浏览(41)
  • 三.ffmpeg 集成av1

    copy from zhujiamin 一、介绍 FFmpeg4.2支持AV1、AVS2等视频编码格式,但本身并不包含解码器,需要自己集成。集成的编解码器要避开GPL开源协议(–enable-gpl),因此不能用x264、AVS2等编解码器 我在研究FFmpeg升级时,寻找能提升多媒体系统表现力的新特性,发现FFmpeg支持的基于BSD协

    2023年04月24日
    浏览(39)
  • ffmpeg中的avs解码器综述

    最近拿了一个avs的视频流,用硬件可以解码,但是ffmpeg自带的却无法解码。 所以研究了一下,首先看ffmpeg的avs解码器: 可以看到avs有两个,第一个是avs 第二个是cavs. 我们先用avs来解码,解码的视频是通过【 avs编码器 】编码的: 结果发现有问题,尺寸本来是640 360,结果被强

    2024年02月08日
    浏览(52)
  • FFmpeg5.1.3编译动态库踩坑之旅(基于Linux虚拟机)

    环境准备 1.Windows安装Oracle VM VirtualBox 7.0.10,安装ubuntu-22.04.3。 坑一 :无法往虚拟机里拖放复制文件,解决办法:登录Ubuntu虚拟机时切换到xorg方式登录,参考地址:Ubuntu Desktop 22.04 无法实现拖放复制操作解决办法-CSDN博客 下载文件 下载ndk25 官网下载:ndk官网 网盘下载:andr

    2024年02月07日
    浏览(38)
  • ffmpeg 中 av_log 是怎样工作的?

    ---------------------------------------- author: hjjdebug date:   2023年 07月 27日 星期四 14:56:38 CST descriptor: ffmpeg 中 av_log 是怎样工作的? ---------------------------------------- av_log 功能其实只是添加了颜色,LOG级别,及log上下文名称,没有添加时间,函数名称,行号等信息. 就这一点就引起了血雨腥风的

    2024年02月15日
    浏览(31)
  • ffmpeg av_parser_parse2函数分析各种码流测试程序

    ffmpeg av_parser_parse2函数分析各种码流测试程序 ---------------------------------------- author: hjjdebug date: 2023年 07月 14日 星期五 16:14:05 CST date: 曾更新过... ---------------------------------------- 测试程序见后, 可编译运行(ffmpeg v4.4) 我需要一个简单的程序,实现能跟入ffmpeg 库.了解av_parser_parse2的工

    2024年02月16日
    浏览(37)
  • 音视频从入门到精通——FFmpeg之av_image_get_buffer_size函数

    函数的作用是通过指定像素格式、图像宽、图像高来计算所需的内存大小 重点说明一个参数align:此参数是设定内存对齐的对齐数,也就是按多大的字节进行内存对齐。比如设置为1,表示按1字节对齐,那么得到的结果就是与实际的内存大小一样。再比如设置为4,表示按4字节

    2023年04月15日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包