Este artículo te hace descubrir que FFmpeg es tan interesante

Prefacio

De hecho, FFmpeg es familiar para todos El conocido ijkplayer es un reproductor de código abierto de Bilibili y también está basado en FFmpeg. Pero FFmpeg no es solo la función de reproducción y recorte de audio y video, sino también cosas más interesantes, como el empalme de video Para un desarrollador de Android, pensar en FFmpeg c / c ++ no puede escapar. Descargue la biblioteca oficial, compílela en diferentes plataformas y luego intégrela en el proyecto a través de jni. Esto dejó perplejos a muchos desarrolladores al principio. Un problema es cómo compilar esto. Cómo integrar los archivos compilados en el proyecto. Esto se explicará en detalle en mi próximo artículo, aquí solo les contaré lo interesante.
Habiendo dicho esto, debo decir que todas las empresas importantes están trabajando ahora en un lenguaje y marco de desarrollo front-end unificado, lo que hace que los desarrolladores tengan grandes cabezas de TMD. De hecho, no solo están haciendo algunas páginas de interfaz de usuario, sino que las están renderizando en de diferentes formas. Si realmente desea hacer algunas funciones personalizadas, aún no puede dejar el original.

Antes de comenzar, he preparado el entorno de instalación y varios materiales de video para que todos puedan comenzar con FFmpeg. Los materiales se colocan en su propio grupo: 832218493 (debe recogerlo)
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Unión de pantalla de video Android FFmpeg

A través del título, es posible que aún no entiendas lo que significa. Subiré algunas capturas de pantalla de la App que hice. Por cierto, pon algunas imágenes dinámicas y es posible que conozcas la función general. De hecho, después de leerlo, es posible que sientas que ya existen aplicaciones en el mercado que logran este efecto, pero como un león de asedio de Android, debes saber cómo lo hizo. Es fácil hacer este efecto en ios. Hay API nativas, pero el Android en apuros solo se puede implementar a través de C / C ++, lo cual es difícil de hacer de forma nativa.

Esta aplicación probablemente tenga las siguientes funciones (actualmente no es de código abierto, dirección del proyecto)

Unión de pantalla de video (principal)
Recorte de ancho y alto de
video Recorte de duración de
video Agregar borde de video y modificar color de borde
Agregar portada de
video
Agregar imagen de fondo de video
Agregar marca de agua de video Agregar música de fondo

A continuación se muestran las imágenes de dos videos hechos por la aplicación para convertir a gif
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Esta aplicación ya tiene la siguiente página, pero aún no es de código abierto y hay muchas cosas por cambiar. La función se realiza. Pero todavía hay muchas optimizaciones en la página, por lo que FFmpeg es realmente impresionante. A continuación, le enseñaré cómo implementar esta función usted mismo. Echemos un vistazo al video producido. Parece que cierto sonido no tiene esta función.
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Cómo lograr este efecto

En este número, solo le enseño cómo implementar un empalme de pantalla de video a través de comandos de shell. Primero date cuenta de las funciones más básicas. Luego, expanda de acuerdo con las funciones actuales. En cuanto a la compilación de la biblioteca FFmpeg, no puedo terminarla por un tiempo. La configuración de parámetros también es muy problemática, especialmente hay muchas plataformas diferentes. Aquí te mostraré cómo lograrlo de la manera más sencilla

primer paso

Dado que la función debe realizarse, el primer paso es, por supuesto, encontrar la herramienta correspondiente. La podemos encontrar a través del sitio web oficial de FFmpeg. La biblioteca estática correspondiente a su plataforma, no la descargue mal, no descargue el binario estático incorrecto, descárguelo como archivo fuente. Debido a que el funcionario ha compilado la biblioteca estática para nosotros, simplemente puede ir directamente a través del script de shell.
Biblioteca del sitio web oficial de FFmpeg
Abra el enlace, seleccioné mac os aquí, puede ver que la biblioteca estática se proporciona debajo. Podemos descargarlo directamente. Tanto Ubuntu como Windows tienen bibliotecas listas para usar. Puedes descargarlo.
Inserte la descripción de la imagen aquí

Descarga esta cosa. Mi lado es de unos 71M. Es bastante grande, porque el interior oficial ha compilado la mayoría de las funciones básicas para nosotros. Es tan grande, pero si lo compilamos nosotros mismos, será mucho más pequeño. De acuerdo, solo inhabilita las cosas que no necesitas
Inserte la descripción de la imagen aquí

Segundo paso

Por supuesto, abra nuestra terminal, Windows directamente gana + R, luego cmd está bien, luego cd a la ruta del archivo de la biblioteca estática ffmpeg que descargamos, ejecute el comando, si no es un accidente, debería ver la siguiente página en este momento

./ffmpeg

Copie el código si aparece algo, significa que su ffmpeg ya está bien en este momento
Inserte la descripción de la imagen aquí

Si los permisos son insuficientes, acceda a la ruta de su biblioteca estática para ejecutar esto. Agregue sudo y luego otorgue 777 permisos en el modo de cambio

chmod +x  ffmpeg
chmod 777 ffmpeg

Copiar código En este momento, el entorno ffmpeg está listo. Entonces todo está listo y solo debe viento del este.

tercer paso

Empalme de video, luego cómo empalmar video, no se preocupe que ffmpeg ya ha hecho el paquete correspondiente por nosotros. Siempre que comprenda los comandos correspondientes, puede completar la función de empalme de video más básica. De hecho, ffmpeg es más que eso, su función es demasiado poderosa.

Echemos un vistazo a algunos comandos simples para ver la información del archivo de video

./ffmpeg -i input.mp4

Copia el código En este momento podemos ver la información específica del video en fps, ancho y alto, calidad del video, etc.
Inserte la descripción de la imagen aquí

El comando -i es el parámetro de entrada. A continuación, veremos directamente cómo combinar un video con comandos. Por ejemplo, la chica que combinó los dos videos de arriba, simplemente podemos sintetizarlo a través de la computadora.

./ffmpeg -i input2.mp4  -i input2.mp4  -filter_complex [0][1]vstack -y output.mp4 

Si el código se copia correctamente, debería ser la siguiente página
Inserte la descripción de la imagen aquí

Este archivo MP4 es un archivo en el mismo directorio de nivel. Puede cambiarlo a su propio nombre de archivo. ¿En cuanto a filter_complex? Solo estoy hablando en la lengua vernácula aquí, es equivalente a la función en nuestro java, le da la entrada en el cuerpo de este método y le da la salida correspondiente.
Puedes ver la introducción en el sitio web oficial de vstack. Apilar videos de entrada verticalmente. Significa videos de empalme vertical. De manera similar, si quieres ser horizontal, solo necesitas cambiar vstack a hstack. ¿No es simple, poderoso y ¿Lo
más importante ? La operación básica de algunos videos la puedo hacer yo mismo a través de la línea de comandos. Para ps, Photoshop, mi línea de comandos está bien. Jajajajajajajaja
Acabo de hacer el efecto de video, capturas de pantalla para que todos las vean
Inserte la descripción de la imagen aquí

Compilar FFmpeg para la plataforma Android

Puede haber muchas bibliotecas para compilar la plataforma Android en Internet. De todos modos, si buscas, debe haber lo que necesitas. Aquí principalmente te enseño a usar bibliotecas estáticas en lugar de bibliotecas dinámicas, por lo que ahorrarás mucho problemas, varias bibliotecas de modo Pegue y copie de un lado a otro, escriba cmakelist corpus, configure gradle, puede llevar mucho tiempo para aquellos que nunca han jugado FFmpeg, aquí les mostraré otra forma de jugar

Biblioteca dinámica

La biblioteca dinámica es en realidad la biblioteca compilada, enlace a nuestro proyecto y luego cargue la biblioteca y opere las cosas en c a través de jni. Aquí hay un breve resumen, luego sé lo que se necesita, luego nos conectamos El siguiente paso es compilar esta biblioteca. Puedes ver en Internet que hay muchas compiladas por FFmpeg. Necesitas ponerlas en nuestro proyecto una por una. Luego agregue cosas a cmakelist. Aquí te enseño a compilar estas bibliotecas en un so, lo que puede ahorrarte muchos problemas

Si todas las preparaciones anteriores están bien, puede ejecutar el comando de script aquí y abrir el paquete comprimido FFmpeg que descargamos, puede ver la estructura del directorio, principalmente usamos configure binary para compilar. Se puede ver en la imagen de abajo.

Inserte la descripción de la imagen aquí

Pongo el guión aquí, parte del código escrito arriba, todo mi github colocado en el (siguiendo el nombre del script que se llama build_ffmpeg_android.sh, se puede encontrar en la dirección escrita por encima de mí en), voy a escribir algunas notas sobre el mismo
puede Vea que hay un módulo en el código a continuación (principalmente habilite y deshabilite la biblioteca interna, compilamos la biblioteca necesaria en ella, por supuesto que no la necesitamos)
GENERAL (la función principal es establecer algunos parámetros y agregar bibliotecas adicionales) Y LIB_TYPE (esta es la configuración para compilar la biblioteca estática o la biblioteca dinámica compartida o estática)

function build
{
    
    
  pushd ffmpeg
  ./configure                           \
  --logfile=config.log                  \
  --target-os=android                   \
  --prefix=$PREFIX         \
  ${
    
    MODULE}                             \
  ${
    
    GENERAL}                            \
  ${
    
    LIB_TYPE}                           \
  --sysroot=$PLATFORM                   \
  --extra-cflags="-fPIE -fPIC -std=c11" \
  --extra-ldflags="$flags $shared_flag" \

  # essencial for dynamic library
  sed -i -E "s/^(#define HAVE_SYSCTL).*/\1 0/" config.h

  make clean
  make -j$NUM_OF_CORE
  make install

  popd
}

build

Este es el parámetro de GENERAL

GENERAL="                                             \
  --extra-libs="-lgcc"                                \
  --arch=${ARCH}                                      \
  --cc=$PREBUILT/bin/${BIN_PREFIX}-gcc        \
  --cross-prefix=$PREBUILT/bin/${BIN_PREFIX}- \
  --nm=$PREBUILT/bin/${BIN_PREFIX}-nm         \
  --extra-cflags="-I$X264_INCLUDE"    \
  --extra-ldflags="-L$X264_LIB"       \
"

Esto es solo una parte del parámetro del módulo y la inhabilitación utilizada se puede habilitar; de lo contrario, la biblioteca compilada es muy grande. Entonces nuestra apk será correspondientemente grande, puede descargar el archivo original de github

MODULE="                 \
  --enable-jni           \
  --enable-pic           \
  --enable-gpl           \
  --enable-zlib          \
  --enable-yasm          \
  --enable-small         \
  --enable-pthreads      \
  --enable-mediacodec    \
   --enable-libx264      \
  --enable-cross-compile \
  --disable-doc          \
  --disable-ffplay       \
  --disable-ffprobe      \
  --disable-network      \
  --enable-neon
  --disable-linux-perf   \
--enable-encoder=libx264 \
--enable-encoder=aac \
--enable-encoder=mpeg4 \
--enable-encoder=mjpeg \
--enable-encoder=png \
--disable-muxers \

Biblioteca estática

Algunos juicios están escritos en el script aquí. Cuando podemos ejecutar el script, podemos agregar un campo para compilar la biblioteca estática que necesitamos. El nombre de mi script aquí es build_ffmpeg_android.sh, así que simplemente siga el comando a continuación.

./build_ffmpeg_andori.sh static

Si desea compilar una biblioteca dinámica, simplemente cambie estática a compartida.
La computadora actual debe compilarse muy rápidamente, y el siguiente directorio debe verse después de una ejecución exitosa, por lo que se ha compilado
Inserte la descripción de la imagen aquí

Ha salido la biblioteca estática
, sintetice la biblioteca compilada en una biblioteca so

Simplemente agregue el siguiente código al script de compilación.

$TOOLCHAIN/bin/${
    
    BIN_PREFIX}-ld \
      -rpath-link=$PLATFORM/usr/lib \
      -L$PLATFORM/usr/lib \
      -L$PREFIX/lib \
      -L$X264_LIB \
      -soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \
      $PREFIX/libffmpeg.so \
      $PREFIX/lib/libavcodec.a \
      $PREFIX/lib/libavfilter.a \
      $PREFIX/lib/libavformat.a \
      $PREFIX/lib/libavutil.a \
      $PREFIX/lib/libswresample.a \
      $PREFIX/lib/libswscale.a \
      $X264_ALIB/libx264.a \
      -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
      $TOOLCHAIN/lib/gcc/${
    
    BIN_PREFIX}/4.9.x/libgcc.a

En el script anterior, podemos ver que es equivalente a vincular estas bibliotecas con libffmpeg.so por encima de nosotros.
Si tiene éxito, puede ver esta biblioteca en Android en el directorio ffmpeg

Puedes ver que libffmpeg.so ha salido
Inserte la descripción de la imagen aquí

Compilar la biblioteca Lib264

Rol
¿Por qué esta biblioteca, si tiene los pasos anteriores, y tiene que ejecutar Android en la parte superior de la máquina, descubrirá que los archivos de video codificados tienen una calidad significativamente baja, no debería decir mal, de todos modos, ciertamente no los suyos? Resultado satisfactorio. Habiendo dicho tanto, todos deberían conocer el papel de esta biblioteca para mejorar la calidad de la codificación. ¿Por qué la biblioteca de PC que descargué en el sitio web oficial tiene buena calidad? Eso es porque han compilado esta biblioteca y la han habilitado. Entonces, lo que tenemos que hacer aquí es descargar el código fuente oficial de Lib264, compilar la plataforma Android y luego poner esta biblioteca en FFmpeg.
Compilar Lib264

Compilar esta biblioteca es relativamente sencillo. No hay tantos parámetros y códigos. El nombre del script en github se llama (build_x264_andorid.sh) y puedes descargarlo y usarlo

Si desea compilar diferentes versiones, también puede pasar el sufijo compartido o estático.

LIB_TYPE=${
    
    1-static}
echo '@@@#####'${
    
    LIB_TYPE}
function build
{
    
    
  pushd x264

  # remove suffix of libx264.so
  sed -in 's/so\.\$API/so/g' configure
  ./configure                                           \
  --prefix=./android/$ABI                               \
  --enable-$LIB_TYPE                                    \
  --enable-pic                                          \
  --host=$BIN_PREFIX                                  \
  --cross-prefix=${
    
    PREBUILT}/bin/${
    
    BIN_PREFIX}- \
  --extra-cflags="-fPIC -fPIE -std=c11"                 \
  --sysroot=$PLATFORM

  sed -i 's/-f -s/-f/g' ./Makefile

  make clean
  make -j$NUM_OF_CORE
  make install
  tree android
  popd
}

build

printf "$success" "x264"
./build_x264_android.sh shared

La ejecución exitosa debería poder ver que el siguiente directorio está en el directorio x264 / android /, por lo que se ha compilado
Inserte la descripción de la imagen aquí

Síntesis de FFmpeg Lib264

Las bibliotecas para cada plataforma se han compilado anteriormente, entonces, ¿cómo sintetizamos estas dos bibliotecas juntas? Los estudiantes cuidadosos ya lo han visto. Cuando publiqué el script anterior, ya publiqué el código, que es cuando compilamos When the script build_ffmpeg_android. se introduce pescado, es el campo GENERAL

Eche un vistazo a los siguientes campos. Cflags y ldflags han compilado el x264 que compilamos antes.

X264_INCLUDE=../x264/android/$ABI/include
X264_LIB=../x264/android/$ABI/lib
X264_ALIB=../x264

GENERAL="                                             \
  --extra-libs="-lgcc"                                \
  --arch=${ARCH}                                      \
  --cc=$PREBUILT/bin/${BIN_PREFIX}-gcc        \
  --cross-prefix=$PREBUILT/bin/${BIN_PREFIX}- \
  --nm=$PREBUILT/bin/${BIN_PREFIX}-nm         \
  --extra-cflags="-I$X264_INCLUDE"    \
  --extra-ldflags="-L$X264_LIB"       \
"

Compilar diferentes bibliotecas ARCH (armeabi-v7a arm64-v8a ...)

Esto es relativamente simple, ahora que una plataforma ha tenido éxito, las otras se pueden cambiar para
compilar la plataforma. Puede modificar algunos parámetros en nuestro script,

He hecho algunos juicios aquí. Antes de compilar el script, modifique el siguiente ARCH en nuestro directorio common.sh y luego ejecute build_ffmpeg_android.sh.

#ARCH=arm
ARCH=aarch64
[[ $ARCH = "arm" ]] && \
    {
    
     BIN_PREFIX=arm-linux-androideabi; ABI=armeabi-v7a; } ||     {
    
     BIN_PREFIX=aarch64-linux-android; ABI=arm64-v8a; }

NDK=~/Downloads/android-ndk-r14b
PLATFORM=$NDK/platforms/android-21/arch-arm64
PREBUILT=$NDK/toolchains/${
    
    BIN_PREFIX}-4.9/prebuilt/linux-x86_64
TOOLCHAIN=$NDK/toolchains/${
    
    BIN_PREFIX}-4.9/prebuilt/linux-x86_64
NUM_OF_CORE=$(nproc)
success="${BLACKB}${YELLOWF}build %s success${RESET}\n"

Lo anterior es el script common.sh. Simplemente modifique el parámetro de arco anterior. Si desea mutar el brazo, recuerde eliminar el 64 después del parámetro PLATFORM.
Cierre
Puede que haya algo poco claro en lo anterior. Puede hacer preguntas en el mensaje o mensaje privado. Si hay algún problema con lo anterior, puede hablar conmigo activamente. Lo corregiré en el artículo.
Para continuar ... La próxima vez les traeré algunos contenidos sobre la App. Por ejemplo, empalmar pantalla, agregar logo, agregar música de fondo, cortar pantalla de video ... Si quieres saber, también puedes mencionarlo en el mensaje. Haré investigaciones relacionadas,

Supongo que te gusta

Origin blog.csdn.net/lingshengxueyuan/article/details/111874723
Recomendado
Clasificación