NDKr20编译ffmpeg-4.2.2

2024-08-22 15:38
文章标签 编译 ffmpeg 4.2 ndkr20

本文主要是介绍NDKr20编译ffmpeg-4.2.2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在前面,我们已经将ffmpeg引入到Android工程中去了,如果你还不知道如何在Android中使用ffmpeg,可以回头看看这篇文章:
将ffmpeg引入到Android Studio工程中
那么如何使用ffmeg对音视频做一些开发工作呢?今天我们学习来学习一下使用ffmpeg对音视频进行解封装。

我们先来看一张图:
音视频的格式内容
从图中可以看出要想对音视频进行解码,首先需要的是对音视频进行解封装。
解封装主要是为了获取一些音视频的信息,比如时长,视频所使用的编码器,音频流的索引、视频流的索引等等。

我们用一张图展示一下解封装的步骤以及需要用到的一些相关API:
解封装步骤

首先引入log库,定义一个宏,方便后面打印日志。

#ifndef FLYPLAYER_FLYLOG_H
#define FLYPLAYER_FLYLOG_H#include <android/log.h>//定义一个宏,使用log库输出日志#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,"FFMPEG",__VA_ARGS__)#endif //FLYPLAYER_FLYLOG_H

解封装的主要代码:

//引入ffmpeg的头文件
// 因为ffmpeg是纯C代码,要在cpp中使用则需要使用 extern "C"
extern "C" {
#include "libavutil/avutil.h"
#include <libavformat/avformat.h>
}/*** 将数据转换成double类型的一个方法* @param r* @return*/
static double r2d(AVRational r)
{return r.num==0||r.den == 0 ? 0 :(double)r.num/(double)r.den;
}extern "C"
JNIEXPORT jint JNICALL
Java_com_flyer_ffmpeg_FFmpegUtils_analyzeMedia(JNIEnv *env, jclass clazz, jstring media_path) {//初始化解封装av_register_all();//初始化网络avformat_network_init();//打开文件AVFormatContext *ic = NULL;const char *path = env->GetStringUTFChars(media_path, 0);int re = avformat_open_input(&ic,path,0,0);if(re != 0){LOGE("avformat_open_input failed!:%s",av_err2str(re));return -1;}LOGE("avformat_open_input %s success!",path);//获取流信息re = avformat_find_stream_info(ic,0);if(re != 0){LOGE("avformat_find_stream_info failed!");return -3;}LOGE("duration = %lld nb_streams = %d",ic->duration,ic->nb_streams);int fps = 0;int videoStream = -1;int audioStream = -1;// 有两个方法获取视频或者视频流的索引,一种是遍历,一种是使用自动探测的api// 通过遍历的方法获取索引for(int i = 0; i < ic->nb_streams; i++){AVStream *as = ic->streams[i];if(as->codecpar->codec_type == AVMEDIA_TYPE_VIDEO){LOGE("视频数据");videoStream = i;fps = r2d(as->avg_frame_rate);LOGE("videoStream=%d,fps = %d,width=%d height=%d codeid=%d pixformat=%d",videoStream,fps,as->codecpar->width,as->codecpar->height,as->codecpar->codec_id,as->codecpar->format);}else if(as->codecpar->codec_type ==AVMEDIA_TYPE_AUDIO ){LOGE("音频数据");audioStream = i;LOGE("audioStream=%d,sample_rate=%d channels=%d sample_format=%d",audioStream,as->codecpar->sample_rate,as->codecpar->channels,as->codecpar->format);}}// 通过探测的方式获取索引//获取音频流信息audioStream = av_find_best_stream(ic,AVMEDIA_TYPE_AUDIO,-1,-1,NULL,0);LOGE("av_find_best_stream audioStream = %d",audioStream);env->ReleaseStringUTFChars(media_path, path);//关闭上下文avformat_close_input(&ic);LOGE("解封装成功","");return 0;
}

运行看看打印的日志有没有解封装成功:
解封装成功的日志

最后如果你对音视频开发感兴趣可扫码关注,笔者在各个知识点学习完毕之后也会使用ffmepg从零开始编写一个多媒体播放器,包括本地播放及网络流播放等等。欢迎关注,后续我们共同探讨,共同进步。

这篇关于NDKr20编译ffmpeg-4.2.2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1096691

相关文章

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

Python使用FFmpeg实现高效音频格式转换工具

《Python使用FFmpeg实现高效音频格式转换工具》在数字音频处理领域,音频格式转换是一项基础但至关重要的功能,本文主要为大家介绍了Python如何使用FFmpeg实现强大功能的图形化音频转换工具... 目录概述功能详解软件效果展示主界面布局转换过程截图完成提示开发步骤详解1. 环境准备2. 项目功能结

SpringBoot使用ffmpeg实现视频压缩

《SpringBoot使用ffmpeg实现视频压缩》FFmpeg是一个开源的跨平台多媒体处理工具集,用于录制,转换,编辑和流式传输音频和视频,本文将使用ffmpeg实现视频压缩功能,有需要的可以参考... 目录核心功能1.格式转换2.编解码3.音视频处理4.流媒体支持5.滤镜(Filter)安装配置linu

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO