ffmpeg的函数调用知识点

av_dump_format 打印的内容是什么意思?

av_dump_format 会打印出AVFormatContext的内容,打印的内容是什么意思?

我们使用av_dump_format打印出如下信息:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'https://demo.com/BigBuckBunny.mp4':Metadata:major_brand     : mp42minor_version   : 0compatible_brands: isomavc1mp42creation_time   : 2010-01-10T08:29:06.000000ZDuration: 00:09:56.47, start: 0.000000, bitrate: 2119 kb/sStream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default)Metadata:creation_time   : 2010-01-10T08:29:06.000000Zhandler_name    : (C) 2007 Google Inc. v08.13.2007.Stream #0:1(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1991 kb/s, 24 fps, 24 tbr, 24k tbn, 48 tbc (default)Metadata:creation_time   : 2010-01-10T08:29:06.000000Zhandler_name    : (C) 2007 Google Inc. v08.13.2007.

什么是文件的容器格式?

"mov,mp4,m4a,3gp,3g2,mj2" 表示输入文件的容器格式(Container Format)支持的扩展名。

在多媒体文件中,容器格式用于组织和存储多个音视频流以及其他相关数据。不同的容器格式支持不同的文件扩展名。这些扩展名用于指示文件的格式和类型。

在示例输出中,"mov,mp4,m4a,3gp,3g2,mj2" 表示输入文件是支持这些扩展名的容器格式。具体含义如下:

  • "mov":QuickTime Movie 文件,通常用于 macOS 平台。

  • "mp4":MPEG-4 Part 14 文件,是一种常见的多媒体容器格式,广泛用于存储音视频数据。

  • "m4a":MPEG-4 Audio 文件,用于存储音频数据。

  • "3gp":3rd Generation Partnership Project 文件,用于在移动设备上播放音视频。

  • "3g2":3rd Generation Partnership Project 2 文件,是 3GP 的增强版本。

  • "mj2":Motion JPEG 2000 文件,用于存储基于 JPEG 2000 压缩的视频。

因此,"mov,mp4,m4a,3gp,3g2,mj2" 表示输入文件是支持这些容器格式的文件,可以根据文件扩展名来推断文件的类型和格式。

多媒体文件格式说法比较笼统,准确说应该是被分为两种格式,编码格式 + 容器格式。

这就相当于我们会用盘子盛菜,也能用盘子盛米饭。

我们可以使用不同的容器格式盛放不同的编码格式。(当然这里也是有一些规定的,某个容器格式允许盛放哪些编码格式都是有明确要求的)

这个容器格式也就是我们日常看到的文件后缀。

在这里的输出中,我们有多个容器格式,说明我们是允许这个网络url下载的内容存放在mov/mp4/m4a等文件格式中的。

Metadata 有哪些信息?

av_dump_format() 输出的信息中,"Metadata" 部分包含了一些元数据信息,用于描述媒体文件的特定属性和相关数据。下面是对每个字段的解释:

  • major_brand:表示文件的主要品牌标识。它表示“最好”基于哪种格式来解析当前的文件。在示例中,"mp42" 表示该文件的主要品牌为 "mp42"。这是一种标识符,用于标识所使用的容器格式或编码器。

  • minor_version:表示文件的次要版本号。在示例中,"0" 表示该文件的次要版本为 0。

  • compatible_brands:表示文件与哪些兼容的品牌标识符兼容。在示例中,"isomavc1mp42" 表示该文件兼容 "isom"、"avc1" 和 "mp42" 这些品牌标识符。

  • creation_time:表示文件的创建时间。在示例中,"2010-01-10T08:29:06.000000Z" 表示该文件的创建时间为 2010 年 1 月 10 日 08:29:06(UTC 时间)。

这些元数据信息提供了关于媒体文件的额外信息,如文件的品牌标识、版本号、兼容性和创建时间。这些信息可以用于判断文件的属性、兼容性和制作信息。

Duration有哪些信息?

Duration: 00:09:56.47, start: 0.000000, bitrate: 2119 kb/s

这个信息比较好理解,视频文件有9分56秒,播放比特率是2119kb/s

视频的比特率(bitrate)是指在单位时间内传输或处理的比特数,通常以每秒的比特数(bps,bits per second)为单位。它表示视频数据的传输速率或处理速度。

比特率直接影响视频的数据量和质量,较高的比特率意味着更多的数据被分配给每个时间单位,从而提供更高的视频质量和更精细的细节。较低的比特率则表示视频数据被压缩得更多,可以减小文件大小或降低传输带宽要求,但可能会导致视频质量的损失和细节的丢失。

音频流有哪些信息?

Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default)Metadata:creation_time   : 2010-01-10T08:29:06.000000Zhandler_name    : (C) 2007 Google Inc. v08.13.2007.

"Stream #0:0(und)" 表示第一个流(Stream)的信息。下面是对每个字段的解释:

  • Audio:表示该流是音频流。

  • aac (LC):表示音频编解码器为 AAC(Advanced Audio Coding)的低复杂度(Low Complexity)模式。

  • mp4a / 0x6134706D:表示音频编码器的标识符为 "mp4a",对应的十六进制值为 "0x6134706D"。

  • 44100 Hz:表示音频采样率为 44,100 Hz,即每秒采集和播放的音频样本数。

  • stereo:表示音频通道模式为立体声,即左右两个声道。

  • fltp:表示音频采样格式为浮点型(floating point)。

  • 125 kb/s:表示音频的比特率为 125 kb/s,即每秒传输或处理的音频数据量为 125 kb。

  • (default):表示该流是默认的流。

  • handler_name: 表示是由 Google 公司开发的某个版本的处理程序生成或处理的。

视频流有哪些信息?

"Stream #0:1(und)" 表示第二个流(Stream)的信息,即视频流。下面是对每个字段的解释:

  • Video:表示该流是视频流。

  • h264 (High):表示视频编解码器为 H.264(高级)。

  • avc1 / 0x31637661:表示视频编码器的标识符为 "avc1",对应的十六进制值为 "0x31637661"。

  • yuv420p:表示视频采样格式为 YUV420P,即色彩空间为 YUV,亮度和色度分量的采样比例为 4:2:0。

  • 1280x720:表示视频分辨率为 1280x720 像素。

  • [SAR 1:1 DAR 16:9]:表示视频的样本宽高比(Sample Aspect Ratio)为 1:1,显示宽高比(Display Aspect Ratio)为 16:9。

  • 1991 kb/s:表示视频的比特率为 1991 kb/s,即每秒传输或处理的视频数据量为 1991 kb。

  • 24 fps:表示视频的帧率为 24 帧每秒。

  • 24 tbr, 24k tbn, 48 tbc:表示视频的时间基准信息。

  • (default):表示该流是默认的流。

  • handler_name: 表示是由 Google 公司开发的某个版本的处理程序生成或处理的。

AVStream结构有哪些元素?

AVStream 结构是 FFmpeg 中表示媒体流的数据结构,它包含了媒体流的各种属性和信息。下面是 AVStream 结构中一些常用的成员变量:

  • index:表示流的索引号。

  • id:表示流的唯一标识符。

  • codecpar:指向 AVCodecParameters 结构的指针,包含了与该流关联的编解码器参数。

  • time_base:表示流的时间基准,用于将时间单位转换为实际时间。

  • start_time:表示流的起始时间。

  • duration:表示流的时长。

  • nb_frames:表示流中的帧数。

  • disposition:表示流的布局或位置相关的标志。

  • avg_frame_rate:表示流的平均帧率。

  • r_frame_rate:表示流的参考帧率。

  • metadata:指向 AVDictionary 结构的指针,包含了流的元数据。

要使用 AVStream 结构,可以先通过 AVFormatContext 结构中的 streams 数组获取特定的 AVStream 结构,然后使用相应的成员变量获取所需的信息。例如,要获取流的索引号可以使用 avStream->index,获取流的时间基准可以使用 avStream->time_base,获取流的元数据可以使用 avStream->metadata

ffmpeg如何读取视频流?

ffmpeg需要先定位mp4中的视频流,从视频流stream中读取每一帧,将每一帧再转换为yuv格式。

// 解码器AVCodec* codec = nullptr;AVCodecContext* codecContext = avcodec_alloc_context3(codec);// 寻找到视频流int videoStreamIndex = av_find_best_stream(inputContext, AVMEDIA_TYPE_VIDEO, -1, -1, &codec, 0);if (videoStreamIndex < 0) {// 没有找到视频流return -1;}// 获取视频流AVStream* stream = inputContext->streams[videoStreamIndex];if (avcodec_parameters_to_context(codecContext, stream->codecpar) < 0) {// 获取解码器上下文失败return -1;}if (avcodec_open2(codecContext, codec, nullptr) < 0) {// 打开解码器失败return -1;}// 分配视频帧和 YUV 帧AVFrame* frame = av_frame_alloc();AVFrame* frameYUV = av_frame_alloc();int frameBufferSize = av_image_get_buffer_size(AV_PIX_FMT_YUV420P, codecContext->width, codecContext->height, 1);uint8_t* frameBuffer = (uint8_t*)av_malloc(frameBufferSize * sizeof(uint8_t));av_image_fill_arrays(frameYUV->data, frameYUV->linesize, frameBuffer, AV_PIX_FMT_YUV420P, codecContext->width, codecContext->height, 1);// 初始化图像转换上下文struct SwsContext* swsContext = sws_getContext(codecContext->width, codecContext->height, codecContext->pix_fmt, codecContext->width, codecContext->height, AV_PIX_FMT_YUV420P, SWS_BILINEAR, nullptr, nullptr, nullptr);// 读取视频帧并转换为 YUV 格式AVPacket packet;while (av_read_frame(inputContext, &packet) >= 0) {if (packet.stream_index == videoStreamIndex) {// 解码视频帧avcodec_send_packet(codecContext, &packet);avcodec_receive_frame(codecContext, frame);// 转换为 YUV 格式sws_scale(swsContext, frame->data, frame->linesize, 0, codecContext->height, frameYUV->data, frameYUV->linesize);// 在这里可以对 YUV 数据进行处理// 释放帧的引用av_frame_unref(frame);}av_packet_unref(&packet);}

ffmpeg如何定位到某个流的第几秒开始播放?

使用 av_seek_frame 函数:可以使用 av_seek_frame 函数在特定的时间点进行定位。这个函数可以用于音频和视频流。以下是一个示例代码片段,展示了如何使用 av_seek_frame 定位到指定的时间点:

int64_t timestamp = desired_time * AV_TIME_BASE;  // 将秒转换为时间戳
int stream_index = 0;  // 假设我们要定位到第一个流AVStream* stream = formatContext->streams[stream_index];
int64_t seek_target = av_rescale_q(timestamp, AV_TIME_BASE_Q, stream->time_base);// 定位到指定时间点
av_seek_frame(formatContext, stream_index, seek_target, AVSEEK_FLAG_BACKWARD);

参考

5分钟入门MP4文件格式

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/3252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python版Day45

70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 完全背包解法 注意这是求排列问题&#xff0c;1、2步 和 2、1步都是上三个台阶&#xff0c;但是这两种方法不一样 先遍历背包再遍历物…

关于微信小程序 textarea 遇到的坑

1、获取到焦点 键盘弹出时 页面上拉 解决方法 设置adjust-position为false 参考官网&#xff1a;textarea | uni-app官网 textarea的abjust-position属性 例子&#xff1a;注意加&#xff1a; <textarea :adjust-position"false" /> 2、键盘弹出的时…

Java版企业工程项目管理系统源码+java版本+项目模块功能清单+spring cloud +spring boot

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…

ArcGIS、ENVI、InVEST、FRAGSTATS等多技术提升数据分析能力

专题一、空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 专题二、ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化&#xff1a;地图符号与…

在第二代SpringCloud中配置网关组件

我们接着上次的微服务的项目继续搭建网关组件: 搭建微服务项目 前提准备: 1.打开nacos服务注册中心,在浏览器通过这地址访问 http://10.48.185.7:8848/nacos/index.html 2.启动page和product的微服务 1.新建一个网关的项目 2.导入pom依赖 <!-- Spring Boot父启动器…

美团面试官:那你讲一讲Vuex吧

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 前言 周一接到了美团的一面&#xff0c;面试官人很好&#xff0c;基本都是围绕着简历来问&#xff0c;下面就是我重新…

DBeaver连接华为高斯数据库 DBeaver连接Gaussdb数据库 DBeaver connect Gaussdb

DBeaver连接华为高斯数据库 DBeaver连接Gaussdb数据库 DBeaver connect Gaussdb 一、概述 华为GaussDB出来已经有一段时间&#xff0c;最近工作中刚到Gauss数据库。作为coder&#xff0c;那么如何通过可视化工具来操作Gauss呢&#xff1f; 本文将记录使用免费、开源的DBeaver来…

【kubernetes系列】Kubernetes之资源配置范围管理LimitRange

概述 在默认情况下&#xff0c;Kubernetes不会对Pod加上CPU和内存限制&#xff0c;这意味着Kubernetes系统中任何Pod都可以使用其所在节点的所有可用的CPU和内存。在之前的章节https://blog.csdn.net/margu_168/article/details/131786000分享了针对集群中某个pod的资源限制&a…

云迁移第二波热潮来袭,你准备好了吗?

最近&#xff0c;云迁移再次被频繁提及&#xff0c;企业对云迁移的需求量有回升趋势&#xff0c;究其根本&#xff0c;主要有以下原因&#xff1a; 企业数字化进程加速&#xff0c;本地上云需求强劲 根据《2021中国企业上云指数洞察报告》&#xff0c;我国实体经济上云渗透率…

Appium+Python+PO 设计模式

目录 前言&#xff1a; 什么是 PageObject? 关于报告的输出 总结 前言&#xff1a; Appium是一个用于自动化移动应用程序测试的开源工具&#xff0c;Python是一种简单易学且功能强大的编程语言&#xff0c;PO&#xff08;Page Object&#xff09;设计模式是一种在自动化测…

使用shell监控应用运行状态通过企业微信接收监控通知

目的&#xff1a;编写shell脚本来监控应用服务运行状态&#xff0c;若是应用异常则自动重启应用通过企业微信接收监控告警通知 知识要点&#xff1a; 使用shell脚本监控应用服务使用shell脚本自动恢复异常服务通过企业微信通知接收监控结果shell脚本使用数组知识&#xff0c;…

行为型模式之迭代器模式

迭代器模式&#xff08;Iterator Pattern&#xff09; 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为设计模式&#xff0c;它提供了一种顺序访问集合对象中各个元素的方法&#xff0c;而无需暴露集合的内部表示。 在迭代器模式中&#xff0c;有三个主要角色&a…

session 生命周期和经典案例-防止非法进入管理页面

文章目录 session 生命周期和Session 经典案例-防止非法进入管理页面session 生命周期Session 生命周期-说明代码演示说明 Session 的生命周期创建CreateSession2创建ReadSession2 解读Session 的生命周期代码示例创建DeleteSession Session 经典案例-防止非法进入管理页面需求…

bgp联邦

1、ip配置 [r1-LoopBack0]ip address 192.168.1.1 24 [r1-LoopBack1]ip address 10.0.0.1 24 [r1-GigabitEthernet0/0/0]ip address 12.0.0.1 24[r2-GigabitEthernet0/0/0]ip address 12.0.0.2 24 [r2-GigabitEthernet0/0/1]ip address 172.16.1.1 29 [r2-GigabitEthernet0/0/…

【从零开始学习CSS | 第三篇】选择器优先级

目录 前言&#xff1a; 常见选择器的优先级&#xff08;从高到低&#xff09; 选择器的权重&#xff1a; 总结&#xff1a; 前言&#xff1a; 在前几篇文章中我们介绍了大量的选择器&#xff0c;那么大量的选择器在使用的时候&#xff0c;一定是有一个优先级顺序的&#xff…

【计算机视觉】DINOv2(视觉大模型)代码使用和测试(完整的源代码)

文章目录 一、环境部署二、导入原图2.1 使用vit_s14的模型 三、使用其他模型3.1 使用vit_b14的模型3.2 使用vit_l14的模型3.3 使用vit_g14的模型 一、环境部署 !git clone https://ghproxy.com/https://github.com/facebookresearch/dinov2.git输出为&#xff1a; Cloning in…

DT灯光基础(辉光 雾 阴影 渲染选项)

点光源 不能宣染&#xff0c;换个版本。不能正常预览 聚光灯 t 手柄 挡光版 平行光阴影 光线追踪阴影 没有看见阴影 灯光使用贴图 环境光 不进行渲染物体 不渲染阴影 接收阴影 不反射 可以看到反射 没有反射了 灯光链接 取消灯照 灯光雾 辉光 变化不明显

C++初阶 - 3.类和对象(中)

目录 1.类的6个默认成员函数 2.构造函数 2.2特性 3.析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 5.赋值运算符重载 5.1运算符重载 5.2 赋值运算符重载 5.3 前置和后置重载 6.日期类的实现 7.const成员 8.取地址及const取地址操作符重载 1.类…

FCOS 论文学习

1. 解决了什么问题&#xff1f; 之前的目标检测器如 RetinaNet、SSD、YOLOv3 都依赖于 anchors。基于 anchors 的检测器有如下三个缺点&#xff1a; 检测表现对于 anchors 的大小、宽高比和数量等超参数很敏感&#xff1b;即使精心设计了 anchors&#xff0c;但由于大小和宽高…

论文投稿前细节检查

参考文献的doi统一要或不要&#xff0c;要参考期刊/会议之前的版本参考文献的会议和期刊作者的缩写方式&#xff0c;论文标题的首字母&#xff0c;发表会议或期刊的首字母&#xff0c;年份的位置等是否统一。同时&#xff0c;建议会议直接给缩写&#xff0c;期刊给全称。Fig、T…