音视频实践学习

  • 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版本

新建工程ffmpeg-single-hello

  • 配置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目录
其他的单个库例子则都是依赖这个库

  • 新建类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);}
  • 编译打包运行,输出如下信息:

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

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

更多相关文章

  1. Android编译详解之lunch命令
  2. Android(安卓)NDK编程入门
  3. Android(安卓)NDK 知识系列(一)
  4. 为Android加入busybox工具
  5. Use logCat in android native
  6. Ubuntu 虚拟机android平台搭建总结
  7. 为Android加入busybox工具
  8. android平台搭建详情
  9. Android(安卓)之ndk开发

随机推荐

  1. Activity都掌握了?来看看你还有多少漏洞!
  2. android动画 开发者选项中动画时长原理分
  3. android安卓APP获取手机设备信息和手机号
  4. android AlarmManager闹钟设置多次只响应
  5. Android平台一日游开发经典教学视频
  6. AndroidStudio运行项目出现This version
  7. Android(安卓)Fragment基本介绍和用法
  8. Android(安卓)操作系统的内存回收机制(转
  9. [Android] ContentProvider和Uri详解
  10. linux ubuntu环境下 android jdk sdk ecl