Usando FFMPEG en Android

1. JNI

Primero cree un proyecto de Android que admita C++:

Archivo->Nuevo->Nuevo proyecto->Teléfono y tableta->C++ nativo ->Luego seleccione la versión de C++ Si no conoce las versiones de C++, puede elegir Toolchain Default. Haga clic en Finalizado. Termina de crear.

Una vez completada la creación, cambiamos la vista de Android a proyecto. En comparación con los proyectos ordinarios de Android, aquí hay dos carpetas más. Uno es el directorio .cxx debajo del directorio de la aplicación. Uno es el directorio src/main/cpp. La carpeta .cxx es un archivo temporal durante nuestro proceso de compilación c. Mire el directorio cpp nuevamente, hay dos archivos aquí, uno es CMakeLists.txt. Este archivo es donde necesitamos escribir todos los archivos de la biblioteca de C++ que necesitamos poner en el proyecto. El archivo native-lib.cpp es un método de tránsito para que C++ y JAVA se llamen entre sí. Toda una sensación de JS Bridge en Android multiplataforma. Podemos ver el método de ejemplo creado para nosotros en el sistema:

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_wfffmpeg_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

Aquí hay un ejemplo creado automáticamente por el sistema. Solo necesitamos seguir esto para escribir nuestros propios archivos. Tenga en cuenta el formato del nombre del método aquí:

Java_com_example_wfffmpeg_MainActivity_stringFromJNI

Es decir, stringFromJNI de MainActivity en el paquete java.com.example.wfffmpeg. En pocas palabras, es localizar un archivo a través de las reglas de nomenclatura. Debido a que el nombre del método no puede aparecer con un punto, el nombre del método usa un guión bajo _ para reemplazar el . en el nombre del paquete.

Luego, echemos un vistazo a cómo comunicarse con este método en MainActivity.java:

package com.example.wfffmpeg;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Example of a call to a native method
        TextView tv = findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();
}

Mire este archivo, esta es una actividad normal. En el área estática estática, use System.loadLibrary("native-lib") para importar el archivo de biblioteca nativie-lib, que es el archivo puente que escribimos anteriormente. Es decir, se introduce cuando se acaba de iniciar la Actividad. Luego viene la declaración del método. Tenga en cuenta que la declaración aquí tiene un prefijo native. La declaración completa es public native String stringFromJNI(); y en esta actividad podemos usar este método para llamar directamente a stringFromJNI();

Ahora. Hemos visto cómo usar JNI. Así que echemos un vistazo a FFMPEG como una biblioteca de C++, ¿cómo lo usamos en Android?

1. En el artículo anterior, compilamos FFMPEG y generamos algunos archivos de biblioteca. Ahora necesitamos copiar estos archivos de biblioteca en el proyecto. Primero, copiamos todas las carpetas de inclusión en la carpeta libs.

Hay varias carpetas debajo de la carpeta de inclusión:

1. codificación/descodificación libavcodec

2.dispositivo dedicado de biblioteca de multiplexación/desmultiplexación libavdevice (dispositivo de lectura)

3. mapa de la biblioteca de edición basada en marcos de libavfilter (más efectos especiales)

Biblioteca de multiplexación/desmultiplexación de E/S 4.libavformat

5. biblioteca de utilidad común libavutil

6. biblioteca de posprocesamiento libpostproc

7. libswresample remuestreo de audio, conversión de formato y mezcla

8. biblioteca de escalado y conversión de color libswscale (estiramiento de imagen, conversión de formato de píxel)

A continuación, en la carpeta libs, cree una nueva carpeta armeabi . entonces pon

libavcodec-57.so, libavdevice-57.so, libavfilter-6.so, libavformat-57.so, libavutil-55.so, libpostproc-54.so, libswresample-2.so, libswscale-4.so

Estos 8 archivos se copian en la carpeta armeabi, y el directorio de estructura de archivos del proyecto copiado es:

2. En el párrafo anterior, hablamos sobre el archivo CMakeLists.txt. Es para escribir el archivo de la biblioteca C++ del que depende nuestro proyecto. Entonces necesitamos escribir información relevante en este archivo:

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.4.1)
include_directories(libs/include)
set(DIR ../../../../libs)

project("wfffmpeg")


add_library(avcodec-57
        SHARED
        IMPORTED)
set_target_properties(avcodec-57
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/armeabi/libavcodec-57.so)

add_library(avdevice-57
        SHARED
        IMPORTED)
set_target_properties(avdevice-57
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/armeabi/libavdevice-57.so)

add_library(avformat-57
        SHARED
        IMPORTED)
set_target_properties(avformat-57
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/armeabi/libavformat-57.so)

add_library(avutil-55
        SHARED
        IMPORTED)
set_target_properties(avutil-55
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/armeabi/libavutil-55.so)

add_library(postproc-54
        SHARED
        IMPORTED)
set_target_properties(postproc-54
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/armeabi/libpostproc-54.so)

add_library(swresample-2
        SHARED
        IMPORTED)
set_target_properties(swresample-2
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/armeabi/libswresample-2.so)

add_library(swscale-4
        SHARED
        IMPORTED)
set_target_properties(swscale-4
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/armeabi/libswscale-4.so)

add_library(avfilter-6
        SHARED
        IMPORTED)
set_target_properties(avfilter-6
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/armeabi/libavfilter-6.so)

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             native-lib.cpp )

# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.
        native-lib
        avfilter-6
        avcodec-57
        avdevice-57
        avformat-57
        avutil-55
        postproc-54
        swresample-2
        swscale-4
        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})

3. Modifique el archivo build.gradle de la aplicación

Agregue al archivo defaultConfig:

defaultConfig{
      /...
  externalNativeBuild {
              cmake {
                  cppFlags "-frtti -fexceptions"
              }
        }
   ndk {
              //选择要添加的对应cpu类型的.so库。
              abiFilters 'armeabi-v7a'
              // 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
        }
}

4. compilar

Construir -> limpiar proyecto -> Actualizar proyectos C++ vinculados

A continuación, conecte el teléfono móvil, ejecútelo durante un rato e intente si se puede llamar a esta función. Si hay algún problema, puedes revisar los siguientes aspectos:

1. Compruebe si la configuración del código en CMakeLists.txt es correcta.

2. Verifique si la biblioteca so en CMakeLists.txt es consistente.

3. Compruebe si falta target_link_libraries() en CMakeLists.txt

4. Verifique si la configuración en el archivo build.gradle es correcta.

5. Intente cambiar la versión del SDK en Estructura del proyecto.

Aprenderemos las funciones específicas de FFMPEG más adelante.

¡Buena suerte a todos mis colegas!

 

Supongo que te gusta

Origin blog.csdn.net/howlaa/article/details/112824965#comments_23883841
Recomendado
Clasificación