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.rhkb.cn/news/363266.html

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

相关文章

基于 SpringBoot + Vue 的图书购物商城项目

本项目是一个基于 SpringBoot 和 Vue 的图书购物商城系统。系统主要实现了用户注册、登录&#xff0c;图书浏览、查询、加购&#xff0c;购物车管理&#xff0c;订单结算&#xff0c;会员折扣&#xff0c;下单&#xff0c;个人订单管理&#xff0c;书籍及分类管理&#xff0c;用…

一个AI图片生成工具导航网站

上周末上线了一个AI图片生成工具导航网站&#xff0c;主要是面向AI图片工具这个垂直领域。 https://chatgpt-image-generator.com/ 目标是通过收集当下的一些工具&#xff0c;然后进行分类管理&#xff0c;一方面方便大家发现新的工具&#xff0c;另一方面能够更加有针对性、…

利用Matlab制作Gif图

Gif图相当于是由许多张图片拼接而成的一个“短视频”&#xff0c;因此在制作Gif图之前我们需要先准备多张图片。以下代码实现的是在当前路径下创建了一个image文件夹&#xff0c;并将绘制的HRRP通过saveas函数保存至image文件夹中&#xff0c;并命名为1.png、2.png、 %% 绘制H…

关于Mac mini 10G网口的问题

问题: 购入一个10G网口的Mac mini M2&#xff0c;将其和自己的2.5G交换机连接&#xff0c;使用共享屏幕进行远程操作的过程中出现了频率极高的卡顿&#xff0c;几乎是几秒钟卡一下&#xff0c;使用ping进行测试发现卡的时候就ping不通了。测试使用Mac mini的无线网和雷电转2.5G…

CISCN--西南半决赛--pwn

1.vuln 这是主函数&#xff0c;数一下就发现可以溢出最后的0x4008d0 然后会执行到这里&#xff0c;逻辑就是在v0上写shellcode&#xff0c;不过执行写0x10&#xff0c;不够sh&#xff0c;很明显要先read。 以下是exp: from pwn import * context.archamd64 ioprocess(./vuln)…

【Android】【Compose】Compose里面的Row和Column的简单使用

内容 Row和Column的简单使用方式和常用属性含义 Row 在 Jetpack Compose 中&#xff0c;Row 是一种用于在水平方向排列子元素的布局组件。它类似于传统 Android 中的 LinearLayout&#xff0c;但更加灵活和强大。 Row的代码 Composable inline fun Row(modifier: Modifier…

LLM大模型实战 —— DB-GPT阿里云部署指南

简介&#xff1a; DB-GPT 是一个实验性的开源应用&#xff0c;它基于FastChat&#xff0c;并使用vicuna-13b作为基础模型, 模型与数据全部本地化部署, 绝对保障数据的隐私安全。 同时此GPT项目可以直接本地部署连接到私有数据库, 进行私有数据处理&#xff0c; 目前已支持SQL生…

WPF文本框中加提示语

效果&#xff1a; WPF中貌似不能像winfrom里一样直接加提示语&#xff0c;需要使用TextBox.Style&#xff0c;将Trigger标签插入进去。 贴源码&#xff1a; <WrapPanel Name"TakeOverExpressNo1"><Label Content"物流单号&#xff1a;"><…

AV Foundation学习笔记二 - 播放器

ASSets AVFoundation框架的最核心的类是AVAsset&#xff0c;该类是整个AVFoundation框架设计的中心。AVAsset是一个抽象的&#xff08;意味着你不能调用AVAsset的alloc或者new方法来创建一个AVAsset实例对象&#xff0c;而是通过该类的静态方法来创建实例对象&#xff09;、不…

python中的并发编程

文章目录 并发编程1、进程、线程与协程【1】进程概念【2】线程的概念线程的生命周期进程与线程的区别 【3】协程(Coroutines) 2、多线程实现【1】threading模块【2】线程应用案例【3】线程池【4】互斥锁(同步锁)【5】线程队列&#xff08;1&#xff09;队列的基本语法&#xff…

Logback-打印方法名及代码行号

背景 公司产品使用了logback作为日志输出框架&#xff0c;日志输出的pattern里配置了打印调用方法名及代码行号的配置&#xff0c;但是实际输出的日志方法名总是显示? 在强迫症的驱使下&#xff0c;开启了探秘之旅 Logback版本 1.2.3 项目中Logging.pattern配置如下&#xff1…

经典排序算法详解

目录 创作不易&#xff0c;如对您有帮助&#xff0c;还望一键三连&#xff0c;谢谢&#xff01; 前言 学习目标&#xff1a; 直接插入排序 基本思想&#xff1a; 代码 希尔排序&#xff1a; gap取值 代码 特性总结 选择排序 基本思想 代码 堆排序 思想 代码 冒…

【PHP项目实战训练】——后台-RBAC权限管理原理

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

Ubuntu多显示器设置不同缩放比例

Ubuntu多显示器设置不同缩放比例 设备问题解决方案 设备 笔记本屏幕分辨率为2560 \times 1600&#xff0c;外接显示器的分辨率为3840 \times 2160。 问题 Ubuntu默认的显示器设置中&#xff0c;缩放仅能选择100%&#xff0c;200%&#xff0c;300%&#xff0c;400%。假…

北邮《计算机网络》蒋老师思考题及答案-传输层

蒋yj老师yyds&#xff01; 答案自制&#xff0c;仅供参考&#xff0c;欢迎质疑讨论 问题一览 传输层思考题P2P和E2E的区别使用socket的c/s模式通信&#xff0c;流控如何反映到编程模型三次握手解决什么问题举一个两次握手失败的例子为什么链路层是两次握手而非三次&#xff1f;…

求生之路史低入手 教你怎么使用求生之路创意工坊提高体验性

求生之路是一款抵御丧尸的第一人称射击游戏&#xff0c;四名幸存者联机配合&#xff0c;在现代的城市中&#xff0c;击败各种丧尸还有强大的变种人BOSS&#xff0c;虽然是十几年前的游戏&#xff0c;但是毫不夸张的说&#xff0c;游戏丝毫不过时&#xff0c;目前steam夏促&…

数据结构5---矩阵和广义表

一、矩阵的压缩存储 特殊矩阵:矩阵中很多值相同的元素并且它们的分布有一定的规律。 稀疏矩阵:矩阵中有很多零元素。压缩存储的基本思想是: (1)为多个值相同的元素只分配一个存储空间; (2)对零元素不分配存储空间。 1、特殊矩阵的压缩存储 &#xff08;1&#xff09;对称矩…

数据库自动备份到gitee上,实现数据自动化备份

本人有个不太好的习惯&#xff0c;每次项目的数据库都是在线上创建&#xff0c;Navicat 连接线上数据库进行处理&#xff0c;最近有一个项目需要二次升级&#xff0c;发现老项目部署的服务器到期了&#xff0c;完蛋&#xff0c;数据库咩了&#xff01;&#xff01;&#xff01;…

从 Hadoop 迁移,无需淘汰和替换

我们仍然惊讶于有如此多的客户来找我们&#xff0c;希望从HDFS迁移到现代对象存储&#xff0c;如MinIO。我们现在以为每个人都已经完成了过渡&#xff0c;但每周&#xff0c;我们都会与一个决定进行过渡的主要、高技术性组织交谈。 很多时候&#xff0c;在这些讨论中&#xff…

游戏AI的创造思路-技术基础-深度学习(5)

继续深度学习技术的探讨&#xff0c;填坑不断&#xff0c;头秃不断~~~~~ 目录 3.5. 自编码器&#xff08;AE&#xff09; 3.5.1. 定义 3.5.2. 形成过程 3.5.3. 运行原理 3.5.3.1.运行原理及基本框架 3.5.3.2. 示例代码 3.5.4. 优缺点 3.5.5. 存在的问题和解决方法 3.5…