音视频实践学习

  • android全平台编译ffmpeg以及x264与fdk-aac实践
  • ubuntu下使用nginx和nginx-rtmp-module配置直播推流服务器
  • android全平台编译ffmpeg合并为单个库实践
  • android-studio使用cmake编译ffmpeg实践
  • android全平台编译ffmpeg视频解码器实践
  • android全平台编译ffmpeg支持命令行实践
  • android全平台编译ffmpeg视频推流实践
  • android平台下音频编码之编译LAME库转码PCM为MP3
  • ubuntu平台下编译vlc-android视频播放器实践
  • 图解YU12、I420、YV12、NV12、NV21、YUV420P、YUV420SP、YUV422P、YUV444P的区别
  • 图解RGB565、RGB555、RGB16、RGB24、RGB32、ARGB32等格式的区别
  • YUV420P、YUV420SP、NV12、NV21和RGB互相转换并存储为JPEG以及PNG图片
  • android全平台编译libyuv库实现YUV和RGB的转换

本例使用的是合并的libffmpeg库,可参考之前的实践操作 android全平台编译ffmpeg合并为单个库实践

目录

  • 配置环境
  • 新建hello工程

配置环境

操作系统: ubuntu 16.05

注意: ffmpeg库的编译使用的是android-ndk-r10e版本,使用高版本编译会报错

android-studio工程中配合cmake使用的版本则是android-ndk-r16b版本

android-studio使用cmake编译ffmpeg实践_第1张图片

新建工程ffmpeg-single-hello

android-studio使用cmake编译ffmpeg实践_第2张图片

  • 配置build.gradle如下
android {    ......    defaultConfig {        ......        externalNativeBuild {            cmake {                cppFlags ""            }            ndk {                abiFilters "armeabi-v7a"            }        }        sourceSets {            main {                //库地址                jniLibs.srcDirs = ['libs']            }        }    }    ......    externalNativeBuild {        cmake {            path "CMakeLists.txt"        }    }}
  • 新建CMakeLists.txt文件,配置如下
cmake_minimum_required(VERSION 3.4.1)add_library(ffmpeg-hello           SHARED           src/main/cpp/ffmpeg_hello.c)find_library(log-lib            log)#获取上级目录的路径get_filename_component(PARENT_DIR ${CMAKE_SOURCE_DIR} PATH)set(LIBRARY_DIR ${PARENT_DIR}/ffmpeg-single)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")set(CMAKE_VERBOSE_MAKEFILE on)add_library(ffmpeg-single           SHARED           IMPORTED)set_target_properties(ffmpeg-single                    PROPERTIES IMPORTED_LOCATION                    ${LIBRARY_DIR}/libs/${ANDROID_ABI}/libffmpeg.so                    )#包含头文件include_directories(${LIBRARY_DIR}/libs/${ANDROID_ABI}/include)target_link_libraries(ffmpeg-hello ffmpeg-single ${log-lib})

笔者这里考虑到后续的都是基于同一个libffmpeg.so库,因此不必每个module都放置一个,因此单独分离了一个组件ffmpeg-single,将所需要的头文件和库放置在libs目录
其他的单个库例子则都是依赖这个库

android-studio使用cmake编译ffmpeg实践_第3张图片

  • 新建类FFmpegHello.java
package com.onzhou.ffmpeg.hello;public class FFmpegHello {    static {        System.loadLibrary("ffmpeg");        System.loadLibrary("ffmpeg-hello");    }    public native String urlprotocolinfo();    public native String avformatinfo();    public native String avcodecinfo();    public native String avfilterinfo();    public native String configurationinfo();}
  • src/main/cpp目录新建源文件ffmpeg_hello.c
#include <jni.h>#include <stdio.h>#include <time.h>#include "libavcodec/avcodec.h"#include "libavformat/avformat.h"#include "libavfilter/avfilter.h"#include "libavutil/log.h"#ifdef ANDROID#include <android/log.h>#define LOG_TAG    "FFmpegHello"#define LOGE(format, ...)  __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, format, ##__VA_ARGS__)#define LOGI(format, ...)  __android_log_print(ANDROID_LOG_INFO,  LOG_TAG, format, ##__VA_ARGS__)#else#define LOGE(format, ...)  printf(LOG_TAG format "\n", ##__VA_ARGS__)#define LOGI(format, ...)  printf(LOG_TAG format "\n", ##__VA_ARGS__)#endifJNIEXPORT jstring JNICALL Java_com_onzhou_ffmpeg_hello_FFmpegHello_urlprotocolinfo  (JNIEnv * env, jobject obj){    char info[40000]={0};av_register_all();struct URLProtocol *pup = NULL;//inputstruct URLProtocol **p_temp = &pup;avio_enum_protocols((void **)p_temp, 0);while ((*p_temp) != NULL){sprintf(info, "%s[in ][%10s]\n", info, avio_enum_protocols((void **)p_temp, 0));}pup = NULL;//outputavio_enum_protocols((void **)p_temp, 1);while ((*p_temp) != NULL){sprintf(info, "%s[out][%10s]\n", info, avio_enum_protocols((void **)p_temp, 1));}LOGE("%s", info);return (*env)->NewStringUTF(env, info);}JNIEXPORT jstring JNICALL Java_com_onzhou_ffmpeg_hello_FFmpegHello_avformatinfo  (JNIEnv * env, jobject obj){    char info[40000] = { 0 };av_register_all();AVInputFormat *if_temp = av_iformat_next(NULL);AVOutputFormat *of_temp = av_oformat_next(NULL);//inputwhile(if_temp!=NULL){sprintf(info, "%s[in ][%10s]\n", info, if_temp->name);if_temp=if_temp->next;}//outputwhile (of_temp != NULL){sprintf(info, "%s[out][%10s]\n", info, of_temp->name);of_temp = of_temp->next;}LOGE("%s", info);return (*env)->NewStringUTF(env, info);}JNIEXPORT jstring JNICALL Java_com_onzhou_ffmpeg_hello_FFmpegHello_avcodecinfo  (JNIEnv * env, jobject obj){    char info[40000] = { 0 };av_register_all();AVCodec *c_temp = av_codec_next(NULL);while(c_temp!=NULL){if (c_temp->decode!=NULL){sprintf(info, "%s[dec]", info);}else{sprintf(info, "%s[enc]", info);}switch (c_temp->type){case AVMEDIA_TYPE_VIDEO:sprintf(info, "%s[video]", info);break;case AVMEDIA_TYPE_AUDIO:sprintf(info, "%s[audio]", info);break;default:sprintf(info, "%s[other]", info);break;}sprintf(info, "%s[%10s]\n", info, c_temp->name);c_temp=c_temp->next;}LOGE("%s", info);return (*env)->NewStringUTF(env, info);}JNIEXPORT jstring JNICALL Java_com_onzhou_ffmpeg_hello_FFmpegHello_avfilterinfo  (JNIEnv * env, jobject obj){    char info[40000] = { 0 };avfilter_register_all();AVFilter *f_temp = (AVFilter *)avfilter_next(NULL);while (f_temp != NULL){sprintf(info, "%s[%10s]\n", info, f_temp->name);}LOGE("%s", info);return (*env)->NewStringUTF(env, info);}JNIEXPORT jstring JNICALL Java_com_onzhou_ffmpeg_hello_FFmpegHello_configurationinfo  (JNIEnv * env, jobject obj){    char info[10000] = { 0 };av_register_all();sprintf(info, "%s\n"avcodec_configuration());LOGE("%s", info);return (*env)->NewStringUTF(env, info);}
  • 编译打包运行,输出如下信息:

android-studio使用cmake编译ffmpeg实践_第4张图片

项目地址:
https://github.com/byhook/ffmpeg4android

参考:
https://blog.csdn.net/leixiaohua1020/article/details/47008825

更多相关文章

  1. cordova与android的版本对应和安装
  2. 关于Android 版本向下兼容
  3. Ubuntu 虚拟机android平台搭建总结
  4. android平台搭建详情
  5. Android中图片压缩分析(下)
  6. Android图片转换

随机推荐

  1. Android中Message机制的灵活应用(一)
  2. Android四大核心——Activity
  3. Android(安卓)Studio在线调试Android(安
  4. libevent 在 Android(安卓)上的一个改进
  5. Android中Message机制的灵活应用
  6. Android:改变 Toolbar 的文字和溢出图标颜
  7. Android(安卓)GUI系统学习1:Gralloc
  8. Android获取已安装应用信息(图标,名称,版本
  9. Android(安卓)启动Activity面流程(Android
  10. Android(安卓)API 中文 (55) ―― ListAdap