FFmpeg+javacpp+javacv使用

FFmpeg+javacpp+javacv使用

  • Bytedeco官网案例
  • 1、导入opencv、ffmpeg依赖包
  • 2、FFmpeg 数据结构
    • 2.1 AVFormatContext 格式化I/O上下文
      • 2.1.1 metadata
      • 2.1.2 Duration、start、bitrate等其他信息
      • 2.1.3 dump信息

Bytedeco
GitHub:javacpp

Bytedeco官网案例

FFmpeg – [示例用法] [API] – 一个完整的跨平台解决方案,用于录制、转换和流式传输音频和视频
FFmpeg 6.1.1 http://ffmpeg.org/ 关于 FFmpeg
JavaCPP Presets for FFmpeg 6.1.1-1.5.10 API
javacv:https://github.com/bytedeco/javacv


坑哧吭坑: 这可能是最详细的javaCV-FFmpeg防踩坑入门了
javaCV入门指南
雷霄骅(leixiaohua1020)的专栏 FFmpeg
FFmpeg - 打造一款万能的音乐播放器

1、导入opencv、ffmpeg依赖包

ext {javacvVersion = '1.5.9'ffmpegVersion = '6.0'windowsVersion = 'windows-x86_64'
}dependencies {/* javacv + FFmpeg */// implementation group: 'org.bytedeco', name: 'javacv-platform', version: "$javacvVersion"implementation "org.bytedeco:javacpp:${javacvVersion}:${windowsVersion}"implementation "org.bytedeco:javacv:${javacvVersion}"implementation "org.bytedeco:ffmpeg:${ffmpegVersion}-${javacvVersion}"implementation "org.bytedeco:ffmpeg:${ffmpegVersion}-${javacvVersion}:${windowsVersion}"testImplementation platform('org.junit:junit-bom:5.9.1')testImplementation 'org.junit.jupiter:junit-jupiter'
}

在这里插入图片描述

2、FFmpeg 数据结构

2.1 AVFormatContext 格式化I/O上下文

在这里插入图片描述

这是FFMpeg中最为基本的一个结构,是其他所有结构的根,是一个多媒体文件或流的根本抽象。其中nb_streamsstreams所表示的AVStream结构指针数组包含了所有内嵌媒体流的描述;iformatoformat指向对应的demuxer和muxer指针;pb则指向一个控制底层数据读写的ByteIOContext结构。 start_timeduration是从streams数组的各个AVStream中推断出的多媒体文件的起始时间和长度,以微妙为单位。 通常,这个结构由av_open_input_file在内部创建并以缺省值初始化部分成员。但是,如果调用者希望自己创建该结构,则需要显式为该结构的一些成员置缺省值;如果没有缺省值的话,会导致之后的动作产生异常。

String url = "C:\\Users\\Administrator\\Desktop\\Let Me Down Slowly.mp3";
// 解封装上下文
AVFormatContext pFormatCtx = new AVFormatContext(null);
if (null == pFormatCtx) {XLog.e("获取解封装上下文失败");return;
}// 打开流媒体
if (avformat_open_input(pFormatCtx, url, null, null) != 0) {XLog.e("打开媒体失败");return;
}// 读取流媒体数据,以获得流的信息
if (avformat_find_stream_info(pFormatCtx, (PointerPointer<Pointer>) null) < 0) {XLog.e("获得媒体流信息失败");return;
}

2.1.1 metadata

在这里插入图片描述

AVDictionaryEntry tag = null;
tag = av_dict_get(pFormatCtx.metadata(), "", tag, AV_DICT_IGNORE_SUFFIX);
while (tag != null) {XLog.d("tag.key : " + tag.key().getString() + "; tag.value : " + tag.value().getString());tag = av_dict_get(pFormatCtx.metadata(), "", tag, AV_DICT_IGNORE_SUFFIX);
}

在这里插入图片描述

2.1.2 Duration、start、bitrate等其他信息

时间基准 public static final int AV_TIME_BASE = 1000000;
在这里插入图片描述

XLog.d("pFormatCtx url() = " + pFormatCtx.url().getString());
XLog.d("pFormatCtx start_time() = " + pFormatCtx.start_time());
XLog.d("pFormatCtx duration() = " + pFormatCtx.duration());
XLog.d("pFormatCtx bit_rate() = " + pFormatCtx.bit_rate());

在这里插入图片描述

2.1.3 dump信息

av_dump_format(pFormatCtx, 0, url, 0);
在这里插入图片描述

源码ffmpeg-6.0\libavformat\dump.c

void av_dump_format(AVFormatContext *ic, int index,const char *url, int is_output)
{int i;uint8_t *printed = ic->nb_streams ? av_mallocz(ic->nb_streams) : NULL;if (ic->nb_streams && !printed)return;av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",is_output ? "Output" : "Input",index,is_output ? ic->oformat->name : ic->iformat->name,is_output ? "to" : "from", url);dump_metadata(NULL, ic->metadata, "  ");if (!is_output) {av_log(NULL, AV_LOG_INFO, "  Duration: ");if (ic->duration != AV_NOPTS_VALUE) {int64_t hours, mins, secs, us;int64_t duration = ic->duration + (ic->duration <= INT64_MAX - 5000 ? 5000 : 0);secs  = duration / AV_TIME_BASE;us    = duration % AV_TIME_BASE;mins  = secs / 60;secs %= 60;hours = mins / 60;mins %= 60;av_log(NULL, AV_LOG_INFO, "%02"PRId64":%02"PRId64":%02"PRId64".%02"PRId64"", hours, mins, secs,(100 * us) / AV_TIME_BASE);} else {av_log(NULL, AV_LOG_INFO, "N/A");}if (ic->start_time != AV_NOPTS_VALUE) {int secs, us;av_log(NULL, AV_LOG_INFO, ", start: ");secs = llabs(ic->start_time / AV_TIME_BASE);us   = llabs(ic->start_time % AV_TIME_BASE);av_log(NULL, AV_LOG_INFO, "%s%d.%06d",ic->start_time >= 0 ? "" : "-",secs,(int) av_rescale(us, 1000000, AV_TIME_BASE));}av_log(NULL, AV_LOG_INFO, ", bitrate: ");if (ic->bit_rate)av_log(NULL, AV_LOG_INFO, "%"PRId64" kb/s", ic->bit_rate / 1000);elseav_log(NULL, AV_LOG_INFO, "N/A");av_log(NULL, AV_LOG_INFO, "\n");}if (ic->nb_chapters)av_log(NULL, AV_LOG_INFO, "  Chapters:\n");for (i = 0; i < ic->nb_chapters; i++) {const AVChapter *ch = ic->chapters[i];av_log(NULL, AV_LOG_INFO, "    Chapter #%d:%d: ", index, i);av_log(NULL, AV_LOG_INFO,"start %f, ", ch->start * av_q2d(ch->time_base));av_log(NULL, AV_LOG_INFO,"end %f\n", ch->end * av_q2d(ch->time_base));dump_metadata(NULL, ch->metadata, "      ");}if (ic->nb_programs) {int j, k, total = 0;for (j = 0; j < ic->nb_programs; j++) {const AVProgram *program = ic->programs[j];const AVDictionaryEntry *name = av_dict_get(program->metadata,"name", NULL, 0);av_log(NULL, AV_LOG_INFO, "  Program %d %s\n", program->id,name ? name->value : "");dump_metadata(NULL, program->metadata, "    ");for (k = 0; k < program->nb_stream_indexes; k++) {dump_stream_format(ic, program->stream_index[k],index, is_output);printed[program->stream_index[k]] = 1;}total += program->nb_stream_indexes;}if (total < ic->nb_streams)av_log(NULL, AV_LOG_INFO, "  No Program\n");}for (i = 0; i < ic->nb_streams; i++)if (!printed[i])dump_stream_format(ic, i, index, is_output);av_free(printed);
}

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

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

相关文章

Qt Object:智能即时聊天室项目

目录 1.项目介绍 2.设计思路 3.Pro文件配置 4.项目演示 5.项目开源 项目介绍 智能即时聊天室系统&#xff08;AIChatProject&#xff09;是一个高效、灵活的即时通讯解决方案。它融合了百度的开源大型语言模型——文心一言&#xff0c;通过API接口实现深度集成。系统专为聊天和…

Ubuntu使用 NVIDIA GPU 和 CUDA 设置 LLM 的训练、微调和推理

0.引言 近年来&#xff0c;人工智能领域取得了令人瞩目的进步&#xff0c;其核心是图形处理单元&#xff08;GPU&#xff09;和并行计算平台的强大组合。 大模型如 GPT、BER能够理解和生成具有前所未有的流畅性和连贯性的类人文本。然而&#xff0c;训练这些模型需要大量的数据…

【SAP ME 42】关于SAP ME自定义开发中NWDS中配置JDK

1、NWDS启动配置JDK -vm C:/Java/jdk1.8.0_361/bin 2、开发组件配置JDK

基于Python+Flask+MySQL+HTML的B站数据可视化分析系统

FlaskMySQLVue 基于PythonFlaskMySQLHTML的B站数据可视化分析系统 项目采用前后端分离技术&#xff0c;项目包含完整的前端HTML&#xff0c;以及Flask构成完整的前后端分离系统 爬虫文件基于selenium&#xff0c;需要配合登录账号 简介 主页 登录页面&#xff0c;用户打开浏…

YIA主题侧边栏如何添加3D旋转标签云?

WordPress站点侧边栏默认的标签云排版很一般&#xff0c;而3D旋转标签云就比较酷炫了。下面boke112百科就以YIA主题为例&#xff0c;跟大家说一说如何将默认的标签云修改成3D旋转标签云&#xff0c;具体步骤如下&#xff1a; 1、点此下载3d标签云文件&#xff08;密码&#xf…

氢氧化铝佐剂,完美替代进口品牌明矾佐剂

氢氧化铝佐剂 氢氧化铝佐剂是使用历史最为悠久的疫苗佐剂&#xff0c;已有近百年历史&#xff0c;广泛用于各种人用疫苗和兽用疫苗。氢氧化铝佐剂能够极大地促进体液免疫&#xff08;抗体&#xff09;反应和TH2类细胞免疫反应。 用途 1、免疫各种实验动物制备多克隆或单克隆抗…

【大作业】今日事、今日毕任务管理系统

一份声明文档,描述你的程序的功能,包括你的输入输出、程序提供的数据、预期输出等内容。 这是一个任务管理系统,功能列表如下。 一、这是主界面: === 欢迎使用 今日事今日毕 任务管理系统 === 查看所有任务查看未完成任务查看已完成任务添加新任务标记任务为已完成修改当天…

Oracle表中的数据量达到30万条

当Oracle表中的数据量达到30万条&#xff0c;并且查询性能过慢时&#xff0c;增加索引是一个有效的优化方案。以下是一些建议来增加索引以提高查询性能&#xff1a; 分析查询需求&#xff1a; 首先&#xff0c;需要明确哪些查询是经常执行的&#xff0c;以及这些查询的WHERE子…

基于物理信息的深度神经网络模拟混凝土中氯离子的扩散

氯离子在混凝土中的扩散是一个复杂的化学物理过程,对混凝土腐蚀起始时间的预测具有重要意义。但考虑到混凝土的非线性氯离子结合能力,模拟氯离子扩散的方程是有限的。本研究提出了一种基于物理信息的深度神经网络来模拟氯离子在混凝土中的扩散机制并预测氯离子浓度的分布。物…

数据挖掘与分析——特征选择

数据读取 wine葡萄酒数据集是来自UCI的公开数据集&#xff0c;也scikit-learn库自带的数据集&#xff0c;它是对意大利同一地区种植的葡萄酒进行化学分析的结果&#xff0c;这些葡萄酒来自三个不同的品种。该分析确定了三种葡萄酒中每种葡萄酒中含有的13种成分的数量。 每行代…

【Java面试】二十、JVM篇(上):JVM结构

文章目录 1、JVM2、程序计数器3、堆4、栈4.1 垃圾回收是否涉及栈内存4.2 栈内存分配越大越好吗4.3 方法内的局部变量是否线程安全吗4.4 栈内存溢出的情况4.5 堆和栈的区别是什么 5、方法区5.1 常量池5.2 运行时常量池 6、直接内存 1、JVM Java源码编译成class字节码后&#xf…

用C++做一个猫吃鱼的函数代码

要求&#xff1a; 写一个类Fish&#xff0c;有品种和重量两个属性&#xff0c;属性的类型自己选择&#xff0c;要求属性封装。 写一个类Cat&#xff0c;Cat中有一个公有的成员函数&#xff1a; Fish& eat(Fish &f); eat函数的功能要求判断Fish的品种&#xff1a; ●如果…

qt 获取系统主机名、UID序列号、以及磁盘空间等其他信息

使用qt接口获取系统主机名、UID序列号、以及磁盘空间、当前网络传输速率&#xff0c;显卡参数等 void logPCInfo() { LOG_FUN(LOG_LEVEL_INFO, "Host Name: %s", QSysInfo::machineHostName().toStdString().c_str()); LOG_FUN(LOG_LEVEL_INFO, "Machin…

Open3D点云处理学习

Color ICP Colored point cloud registration — Open3D 0.11.0 documentation Colored point cloud registration - Open3D 0.18.0 documentation 展示了使用color-icp结果 对比gicp错误处理结果 intel自己的论文 Colored Point Cloud Registration Revisited 优化方程 参…

临时关闭Windows安全中心

在使用WindowsOS是&#xff0c;微软安全中心是我们必不可少的安全防护&#xff0c;但有时我们也会产生想要将其关闭的需求&#xff0c;下面将要介绍如何临时关闭Windows的安全中心 一、打开安全中心、选择“病毒与威胁防护”&#xff0c;点击“管理设置” 之后将其实时保护关闭…

PPT的精细化优化与提升策略

&#x1f44f;&#x1f44f;&#x1f44f;欢迎来到我的博客 ! 亲爱的朋友们&#xff0c;欢迎您们莅临我的博客&#xff01;这是一个分享知识、交流想法、记录生活的温馨角落。在这里&#xff0c;您可以找到我对世界独特视角的诠释&#xff0c;也可以与我一起探讨各种话题&#…

openjudge_2.5基本算法之搜索_8465:马走日

题目 8465:马走日 总时间限制: 1000ms 内存限制: 65536kB 描述 马在中国象棋以日字形规则移动。 请编写一段程序&#xff0c;给定n*m大小的棋盘&#xff0c;以及马的初始位置(x&#xff0c;y)&#xff0c;要求不能重复经过棋盘上的同一个点&#xff0c;计算马可以有多少途径遍…

ROS中C++、Python完整的目录结构

文章目录 在ROS中&#xff0c;一个典型的C软件包目录结构通常包括以下几个主要目录&#xff1a; include&#xff1a;该目录包含C头文件&#xff08;.hpp或者.h文件&#xff09;&#xff0c;用于声明类、函数、变量等。通常&#xff0c;这些头文件定义了ROS节点、消息类型、服务…

轻量级日志系统——Loki

目录 一、loki简介 二、Loki 快速上手 第一步安装 Loki 第二步安装 Promtail 第三步安装granafa 三、LogQL 语法 四、Loki收集nginx日志 1、修改nginx配置 2、nginx服务器上安装promtail 3、添加doshbarod 一、loki简介 Loki是 Grafana Labs 团队最新的开源项目&am…

什么是负载均衡技术?

随着网络技术的快速发展&#xff0c;互联网行业也越来越广泛&#xff0c;人们的日常生活中也离不开网络技术&#xff0c;大量的用户进行浏览访问网站时&#xff0c;企业会使用负载均衡技术&#xff0c;降低当前网站的负载&#xff0c;以此来提高网站的访问速度。 今天小编就来给…