当前位置: 首页 > news >正文

从H264视频中获取宽、高、帧率、比特率等属性信息

背景

最近整理视频编解码的代码,早前在jetson上封装了jetson multimedia作为视频编解码的类,供其他同事和其他组使用,但该解码接口有一个问题,无法首先获取视频宽高信息,更无法直接获取视频的帧率、比特率等信息。

解决方法

  1. 使用ffmpeg库,命令行参数不适合代码集成
  2. 使用ffmpeg的API接口进行封装

源码实现

// ffmpeg_videoinfo.h#ifndef FFMPEG_VIDEOINFO_H
#define FFMPEG_VIDEOINFO_H#include <iostream>
#include <memory>struct VideoAsset {float width; float height;float fps;float bitrate; /** bit per second */float duration; /** seconds */
};#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */int GetVideoInfo(const char *in_file,  std::shared_ptr<VideoAsset> &info);#ifdef __cplusplus
};
#endif#endif  // FFMPEG_VIDEOINFO_H
// ffmpeg_videoinfo.cpp#include "ffmpeg_videoinfo.h"#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libavutil/avutil.h>int GetVideoInfo(const char *in_file,  std::shared_ptr<VideoAsset> &info){// 注册所有格式和编解码器av_register_all();// 创建一个格式上下文(Format Context)AVFormatContext* formatContext = nullptr;if (avformat_open_input(&formatContext, in_file, nullptr, nullptr) != 0) {fprintf(stderr, "Could not open input file '%s'", in_file);return -1;}// 获取流信息if (avformat_find_stream_info(formatContext, nullptr) < 0) {fprintf(stderr, "Could not find stream information '%s'", in_file);return -1;}// 查找视频流int videoStreamIndex = -1;for (unsigned i = 0; i < formatContext->nb_streams; i++) {if (formatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {videoStreamIndex = i;break;}}if (videoStreamIndex == -1) {fprintf(stderr, "Could not find video stream '%s'", in_file);return -1;}// 获取视频流的编码参数AVCodecParameters* codecParameters = formatContext->streams[videoStreamIndex]->codecpar;AVStream* videoStream = formatContext->streams[videoStreamIndex];info->fps = av_q2d(videoStream->avg_frame_rate);info->width = codecParameters->width;info->height = codecParameters->height;int64_t totalSize = 0;int64_t totalDuration = 0;AVPacket packet;while (av_read_frame(formatContext, &packet) >= 0) {if (packet.stream_index == 0) {totalSize += packet.size;totalDuration += packet.duration;}av_packet_unref(&packet);}AVRational timeBase = videoStream->time_base; /** 时间基 */info->duration = (float)totalDuration * av_q2d(timeBase);info->bitrate = (totalDuration > 0) ? (totalSize * 8.0 / info->duration) : 0.0;// 清理avformat_close_input(&formatContext);return 0;
}
#ifdef __cplusplus
};
#endif
// 测试脚本 test_single_videoinfo.cpp#include "ffmpeg_videoinfo.h"int main(int argc, char **argv) {if(argc<2){return 1;}const std::string &input_h264=argv[1];std::shared_ptr<VideoAsset> video_info_ptr = std::make_shared<VideoAsset>();// VideoAsset video_info;int status_code = GetVideoInfo(input_h264.c_str(), video_info_ptr);if (status_code < 0) {printf("GetVideoInfo failed\n");return -1;}printf("bitrate:%f, duration:%f, fps:%f, height:%f, width:%f\n",video_info_ptr->bitrate, video_info_ptr->duration, video_info_ptr->fps, video_info_ptr->height, video_info_ptr->width);return 1;
}
# CMakelist.txt核心add_executable(test_video_info test_single_videoinfo.cpp ffmpeg_videoinfo.h ffmpeg_videoinfo.cpp)
target_compile_features(test_video_info PRIVATE cxx_std_14)
target_link_libraries(test_video_info avcodec avutil avformat)
# 测试./test_video_info /data/videos/l4t.h264# 输出信息示例
[h264 @ 0xaaaac14b16a0] Stream #0: not enough frames to estimate rate; consider increasing probesize
bitrate:30681866.000000, duration:164.490005, fps:20.000000, height:2160.000000, width:3840.000000

后记

本人对ffmpeg接口并不熟悉,以上根据文档及搜索结果进行的实现,不敢保证没有bug,如果各位遇到问题,可以留言交流

相关文章:

从H264视频中获取宽、高、帧率、比特率等属性信息

背景 最近整理视频编解码的代码&#xff0c;早前在jetson上封装了jetson multimedia作为视频编解码的类&#xff0c;供其他同事和其他组使用&#xff0c;但该解码接口有一个问题&#xff0c;无法首先获取视频宽高信息&#xff0c;更无法直接获取视频的帧率、比特率等信息。 解…...

Cyberchef配合Wireshark提取并解析TCP/FTP流量数据包中的文件

前一篇文章中讲述了如何使用cyberchef提取HTTP/TLS数据包中的文件,详见《Cyberchef配合Wireshark提取并解析HTTP/TLS流量数据包中的文件》,链接这里,本文讲述下如何使用cyberchef提取FTP/TCP数据包中的文件。 FTP 是最为常见的文件传输协议,和HTTP协议不同的是FTP协议传输…...

Nginx中使用keepalive实现保持上游长连接实现提高吞吐量示例与测试

场景 HTTP1 .1之后协议支持持久连接&#xff0c;也就是长连接&#xff0c;优点在于在一个TCP连接上可以传送多个HTTP请求和响应&#xff0c; 减少了建立和关闭连接的消耗和延迟。 如果我们使用了nginx去作为反向代理或者负载均衡&#xff0c;从客户端过来的长连接请求就会被…...

深度学习-卷积神经网络CNN

案例-图像分类 网络结构: 卷积BN激活池化 数据集介绍 CIFAR-10数据集5万张训练图像、1万张测试图像、10个类别、每个类别有6k个图像&#xff0c;图像大小32323。下图列举了10个类&#xff0c;每一类随机展示了10张图片&#xff1a; 特征图计算 在卷积层和池化层结束后, 将特征…...

241114.学习日志——[CSDIY] [Cpp]零基础速成 [03]

​ CSDIY&#xff1a;这是一个非科班学生的努力之路&#xff0c;从今天开始这个系列会长期更新&#xff0c;&#xff08;最好做到日更&#xff09;&#xff0c;我会慢慢把自己目前对CS的努力逐一上传&#xff0c;帮助那些和我一样有着梦想的玩家取得胜利&#xff01;&#xff0…...

大模型研究报告 | 2024年中国金融大模型产业发展洞察报告|附34页PDF文件下载

随着生成算法、预训练模型、多模态数据分析等AI技术的聚集融合&#xff0c;AIGC技术的实践效用迎来了行业级大爆发。通用大模型技术的成熟推动了新一轮行业生产力变革&#xff0c;在投入提升与政策扶植的双重作用下&#xff0c;以大模型技术为底座、结合专业化金融能力的金融大…...

数据库SQL——什么是实体-联系模型(E-R模型)?

目录 什么是实体-联系模型&#xff1f; 1.实体集 2.联系集 3.映射基数 一对一&#xff08;1:1&#xff09; 一对多&#xff08;1:n&#xff09; 多对一&#xff08;n:1&#xff09; 多对多&#xff08;m:n&#xff09; 全部参与&#xff1a; 4.主码 弱实体集&#xf…...

在 MySQL 8.0 中,SSL 解密失败,在使用 SSL 加密连接时出现了问题

在 MySQL 8.0 中&#xff0c;SSL 解密失败通常指的是在使用 SSL 加密连接时出现了问题&#xff0c;导致无法建立加密通信。这个问题可能由多种原因引起&#xff0c;下面是一些常见的原因和排查方法&#xff1a; 1. 证书配置问题 确保您在 MySQL 配置中使用了正确的 SSL 证书和…...

React Native 全栈开发实战班 - 第四部分:用户界面进阶之动画效果实现

在移动应用中&#xff0c;动画效果 是提升用户体验的重要手段。合理的动画设计可以增强应用的交互性、流畅性和视觉吸引力。React Native 提供了多种实现动画的方式&#xff0c;包括内置的 Animated API、LayoutAnimation 以及第三方库&#xff08;如 react-native-reanimated&…...

【CICD】GitLab Runner 和执行器(Executor

GitLab Runner 和执行器&#xff08;Executor&#xff09;是 GitLab CI/CD 管道中的两个重要组成部分。理解它们之间的关系有助于更好地配置和使用 CI/CD 流水线。runer是gitlab的ci-agent对接gitlab&#xff0c;而执行器是接受runer下发的ci的任务来干活的。也就是说gitrunner…...

实用教程:如何无损修改MP4视频时长

如何在UltraEdit中搜索MP4文件中的“mvhd”关键字 引言 在视频编辑和分析领域&#xff0c;有时我们需要深入到视频文件的底层结构中去。UltraEdit&#xff08;UE&#xff09;和UEStudio作为强大的文本编辑器&#xff0c;允许我们以十六进制模式打开和搜索MP4文件。本文将指导…...

mysqldump命令搭配source命令完成数据库迁移备份

mysqldump 命令使用 需保证mysqld在运行中&#xff0c; 这个命令的目的是将数据库导出到文件中&#xff0c;例如 mysqldump -uusername -ppassword database > db.sql 注意该命令不是在MySQL客户端&#xff08;即MySQL命令行&#xff09;执行的&#xff0c;而是在系统命…...

生信:TCGA学习(R、RStudio安装与下载、常用语法与常用快捷键)

前置环境 macOS系统&#xff0c;已安装homebrew且会相关命令。 近期在整理草稿区&#xff0c;所以放出该贴。 R语言、RStudio、R包安装 R语言安装 brew install rRStudio安装 官网地址&#xff1a;https://posit.co/download/rstudio-desktop/ R包下载 注意R语言环境自带…...

十三、注解配置SpringMVC

文章目录 1. 创建初始化类&#xff0c;代替web.xml2. 创建SpringConfig配置类&#xff0c;代替spring的配置文件3. 创建WebConfig配置类&#xff0c;代替SpringMVC的配置文件4. 测试功能 1. 创建初始化类&#xff0c;代替web.xml 2. 创建SpringConfig配置类&#xff0c;代替spr…...

为什么海外服务器IP会被封

海外服务器因为免备案而备受用户欢迎&#xff0c;近年来租用海外服务器的用户也越来越多&#xff0c;自然也可能会出现一些问题。 如果服务器IP被封&#xff0c;在该服务器下的所有业务都无法访问&#xff0c;对自己和对用户来说都会有较大的影响。因此&#xff0c;我们应做好相…...

图像处理技术椒盐噪声

椒盐噪声&#xff0c;也称为脉冲噪声&#xff0c;是图像中经常见到的一种噪声。它是一种随机出现的白点或者黑点&#xff0c;可能是亮的区域有黑色像素或是在暗的区域有白色像素&#xff08;或是两者皆有&#xff09;。这些白点和黑点会在图像中随机分布&#xff0c;导致图像中…...

[笔记]L6599的极限工作条件考量

0.名词 OTP over tempature protect.OCP over current protectOVP over voltage protectBrownout Protection Undervoltage Protection可能需要考虑hysteresis response.因为要考虑一些高频干扰 1.基本的过流保护逻辑 参考&#xff1a;ST L6599 器件手册 LLC开关电源&#…...

机器学习基础04

目录 1.朴素贝叶斯-分类 1.1贝叶斯分类理论 1.2条件概率 1.3全概率公式 1.4贝叶斯推断 1.5朴素贝叶斯推断 1.6拉普拉斯平滑系数 1.7API 2.决策树-分类 2.1决策树 2.2基于信息增益的决策树建立 2.2.1信息熵 2.2.2信息增益 2.2.3信息增益决策树建立步骤 2.3基于基…...

Ubuntu 20.04 配置开发环境(持续更新)

搜狗输入法不能显示中文 sudo apt install libqt5qml5 libgsettings-qt1 sudo apt install libqt5qml5 libqt5quick5 libqt5quickwidgets5 qml-module-qtquick2 编译环境配置 sudo apt-get update #base tools of ubuntu sudo apt install net-tools gitk tree vim termina…...

Rocky9/Ubuntu使用pip安装python的库mysqlclient失败解决方式

# Rocky9 直接使用pip安装mysqlclient会出现缺少依赖&#xff0c;需要先安装mysql-devel相关依赖。由于rocky9用MariaDB替代了MySQL&#xff0c;所以我们可以通过安装mariadb-devel来安装所需要的依赖。 如果Rocky9已经开启了powertool repo可以直接使用下面命令安装 dnf in…...

PP-DocLayoutV3参数详解:text/title/table/figure等11类版面区域置信度解析

PP-DocLayoutV3参数详解&#xff1a;text/title/table/figure等11类版面区域置信度解析 1. 引言&#xff1a;为什么版面分析需要“置信度”&#xff1f; 想象一下&#xff0c;你拿到一份扫描的合同&#xff0c;想用OCR&#xff08;文字识别&#xff09;把它变成可编辑的电子版…...

MaxKB社区版限制解除后,别忘了检查这3个地方!v1.10.2-lts实战经验分享

MaxKB社区版限制解除后的深度验证指南&#xff1a;v1.10.2-lts实战经验 当你按照教程完成MaxKB社区版的限制解除操作后&#xff0c;真正的挑战才刚刚开始。很多技术人员在修改代码并重启服务后&#xff0c;往往以为大功告成&#xff0c;却忽略了后续的关键验证步骤。本文将带你…...

Netty实战:从零搭建一个高性能聊天室(附完整源码)

Netty实战&#xff1a;从零构建高性能聊天室的架构设计与实现 引言&#xff1a;为什么选择Netty构建实时通讯系统&#xff1f; 当我们需要开发一个支持高并发的实时聊天应用时&#xff0c;传统IO模型往往会遇到性能瓶颈。我曾参与过一个在线教育平台的即时通讯模块开发&#xf…...

终极解决方案:5分钟完成DOCX到LaTeX的专业转换指南 [特殊字符]

终极解决方案&#xff1a;5分钟完成DOCX到LaTeX的专业转换指南 &#x1f680; 【免费下载链接】docx2tex Converts Microsoft Word docx to LaTeX 项目地址: https://gitcode.com/gh_mirrors/do/docx2tex 还在为Word文档转换LaTeX格式而烦恼吗&#xff1f;docx2tex就是你…...

原创分享:长图分割神器,让超长网页和聊天记录轻松打印

你是不是也遇到过这种情况&#xff1f; 1、想把微信里一段长长的聊天记录打印出来留存&#xff0c;结果发现截图太长&#xff0c;打印出来字小得看不清&#xff0c;或者直接被裁掉一大半 2、看到一篇很好的网页文章&#xff0c;想打印成纸质版慢慢看&#xff0c;但网页截图是一…...

Win11共享打印机连接失败?绕过安全策略的终极指南

1. Win11共享打印机连接失败的真相 最近帮朋友处理Win11共享打印机的问题时&#xff0c;发现这个看似简单的操作居然能卡住这么多人。明明按照传统方法一步步操作&#xff0c;却总是提示各种错误。其实这背后是微软在Win11 22H2版本后引入的新安全策略在作祟 - 他们默认关闭了S…...

别再画线框图了!用Axure/墨刀搞定HIS门诊医生站高保真原型的5个实战技巧

医疗HIS系统高保真原型设计&#xff1a;Axure/墨刀5大进阶技巧 在医疗信息化领域&#xff0c;门诊医生站作为HIS系统的核心模块&#xff0c;其原型设计的质量直接影响开发效率和最终用户体验。传统线框图已无法满足现代医疗系统复杂交互的需求&#xff0c;掌握Axure或墨刀的高阶…...

激光+视觉+IMU+RTK融合实战:如何用多传感器打造厘米级三维重建系统?

激光视觉IMURTK融合实战&#xff1a;如何用多传感器打造厘米级三维重建系统&#xff1f; 在自动驾驶和机器人领域&#xff0c;三维重建技术正经历着从实验室走向工业落地的关键转折。传统单一传感器方案已无法满足复杂场景下的精度需求&#xff0c;而多传感器融合正成为突破性能…...

Linux七大常见误解与真相解析

1. Linux 神话的起源与现状Linux 作为开源操作系统的代表&#xff0c;自1991年诞生以来就伴随着各种误解和神话。这些误解往往源于早期Linux的使用门槛较高、图形界面不够完善等历史原因。但经过30多年的发展&#xff0c;现代Linux发行版已经发生了翻天覆地的变化。在技术社区中…...

Qwen3-14B项目管理助手:需求文档生成、甘特图描述、风险点预判

Qwen3-14B项目管理助手&#xff1a;需求文档生成、甘特图描述、风险点预判 1. 项目管理的AI革命 项目管理是一项复杂的工作&#xff0c;涉及需求分析、进度规划、资源调配和风险控制等多个环节。传统方式下&#xff0c;项目经理需要花费大量时间编写文档、绘制甘特图和评估风…...