javaCV learning -1- entorno para crear y probar varias imágenes para sintetizar un video mp4

Recientemente, me enseñé a procesar audio y video en lenguaje Java.

Cuando estaba estudiando, encontré un fragmento de código en Internet y probé varias imágenes para sintetizar un video mp4.

El código es:

import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.ffmpeg.global.avutil;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.FrameRecorder;
import org.bytedeco.javacv.Java2DFrameConverter;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.Map;

/**
 * Description:
 *
 * @author 诸葛小猿
 * @date 2020-10-24
 */
public class Test {
    
    

    public static void main(String[] args) throws Exception {
    
    
        //合成的MP4
        String mp4SavePath = "C:\\Users\\WuXiaoLong\\Desktop\\img\\img.mp4";
        //图片地址 这里面放了22张图片
        String img = "C:\\Users\\WuXiaoLong\\Desktop\\img";
        int width = 1600;
        int height = 900;
        //读取所有图片
        File file = new File(img);
        File[] files = file.listFiles();
        Map<Integer, File> imgMap = new HashMap<Integer, File>();
        int num = 0;
        for (File imgFile : files) {
    
    
            imgMap.put(num, imgFile);
            num++;
        }
        createMp4(mp4SavePath, imgMap, width, height);
    }

    private static void createMp4(String mp4SavePath, Map<Integer, File> imgMap, int width, int height) throws FrameRecorder.Exception {
    
    
        //视频宽高最好是按照常见的视频的宽高  16:9  或者 9:16
        FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(mp4SavePath, width, height);
        //设置视频编码层模式
        recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
        //设置视频为25帧每秒
        recorder.setFrameRate(25);
        //设置视频图像数据格式
        recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
        recorder.setFormat("mp4");
        try {
    
    
            recorder.start();
            Java2DFrameConverter converter = new Java2DFrameConverter();
            //录制一个22秒的视频
            for (int i = 0; i < 22; i++) {
    
    
                BufferedImage read = ImageIO.read(imgMap.get(i));
                //一秒是25帧 所以要记录25次
                for (int j = 0; j < 25; j++) {
    
    
                    recorder.record(converter.getFrame(read));
                }
            }
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            //最后一定要结束并释放资源
            recorder.stop();
            recorder.release();
        }
    }

}

Según la introducción del blog, todo tipo de operaciones de Sao son siempre impracticables. Leí algunos blogs seguidos, todos por un fragmento de código, para un paquete jar, una prueba es todo tipo de reinversiones.

Aquellos que aprenden javaVC saben que hay muy pocos materiales relacionados con javaVC en Internet, y muchos blogueros no están haciendo procesamiento de visión por computadora de manera profesional.Los blogs escritos son muy simples o copian un fragmento de código, que no tiene muchas referencias.

Esto me recuerda una frase: la mejor dirección de aprendizaje es el repositorio oficial de git y no hay nadie.

Entonces eche un vistazo al git oficial: https://github.com/bytedeco/javacv

De acuerdo con la guía oficial, simplemente introduzca la dependencia de maven.

  <dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv-platform</artifactId>
    <version>1.5.4</version>
  </dependency>

En la prueba real, fue muy abofeteado:

Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class org.bytedeco.ffmpeg.global.avutil
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:348)
	at org.bytedeco.javacpp.Loader.load(Loader.java:1190)
	at org.bytedeco.javacpp.Loader.load(Loader.java:1123)
	at org.bytedeco.ffmpeg.avformat.Write_packet_Pointer_BytePointer_int.<clinit>(Write_packet_Pointer_BytePointer_int.java:21)
	at org.bytedeco.javacv.FFmpegFrameRecorder.<clinit>(FFmpegFrameRecorder.java:329)
	at com.wuxl.Image2Mp4.createMp4(Image2Mp4.java:48)
	at com.wuxl.Image2Mp4.main(Image2Mp4.java:43)

La clave es que abrí este ffmpeg.jar para ver que org.bytedeco.ffmpeg.global.avutilexiste. cabeza grande.

Supongo que se debe a que: este paquete jar es demasiado grande para descargarlo por completo, así que eliminé el archivo jar de org.bytedeco en el almacén local de maven y me preparé para descargarlo nuevamente.

almacén bytedeco

Abra este directorio mientras descarga y siga mirándolo, buen chico, tantos paquetes jar dependientes. Al mismo tiempo, preste atención a la velocidad de descarga de IDEA.

imagen-20201024151036734

Después de aproximadamente media hora, la descarga se detuvo. No hay mensaje de error en el código. Así que me apresuré a ejecutarlo de nuevo, el resultado sigue siendo 'No se pudo inicializar la clase org.bytedeco.ffmpeg.global.avutil'. lo que el F. . . . .

Estoy atascado y no puedo continuar. ¿Qué debo hacer? ¿La guía oficial no es lo suficientemente buena? ? ? Olvídalo, es tan difícil, no lo hagas. Encendió un cigarrillo en silencio.

Se siente incómodo si no lo logras, y esto renuncia al espíritu de exploración que no cumple con las expectativas del programador. . . Después de fumar un cigarrillo, continúe.

Aunque todavía se informa del error, sigo creyendo que todavía hay algún problema con el entorno javaCV. Así que fui a github para encontrar respuestas.

imagen-20201024152322682

Al ver que hay un zip compilado en github, decidí usar el jar en el paquete zip para importarlo directamente al proyecto en lugar de usar las coordenadas de Maven.

imagen-20201024152354773

Así que descargué el paquete zip 755M, luego lo descomprimí, eliminé las coordenadas originales de Maven e importé manualmente todos los paquetes jar en el paquete zip:

imagen-20201024152806324

Ver 6 arriba, significa que la importación está completa.

Ejecútelo de nuevo, el resultado. . . . Hahahahahahaha, tuvo éxito. ¡Oye! ! ! !

Déjame mostrarte el resultado del mp4 sintetizado por la imagen, el color del video no es muy bueno, y en ocasiones haré afinaciones relacionadas.

javaCV combina imágenes en video

Lo anterior es para importar todos los paquetes jar en el paquete zip. De hecho, no los necesita todos. Puede seleccionar algunos paquetes para importar de acuerdo con la plataforma de desarrollo específica (windows / linux / mac) y el número de sistemas operativos (32/64).

Finalmente, cuando vi un blog en Internet, sentí que estaba bien. Comparte parte del contenido:

Hay muchos tutoriales sobre la construcción del entorno javacv en Internet, y luego todos son similares y pequeños. Primero le enseñará a construir el entorno opencv y luego le dará un ejemplo para probar si su propio entorno opencv se construyó correctamente. Hablando de esto, quiero maldecir a esos profesores que necesitan construir un entorno opencv en la computadora, ¿no saben que después de la versión javacv0.8, no hay necesidad de construir un entorno opencv? Si lo sabe, cambie el contenido del blog lo antes posible. No demore el tiempo de los desarrolladores de Java, ¿de acuerdo? Leí tu tutorial, pero me tomó dos días construir un entorno opencv ...

Si tiene alguna pregunta, preste atención a la cuenta oficial.

Terminado, ¡llámalo un día!

[ Difusión de conocimientos, valor compartido ], gracias amigos por su atención y apoyo, soy [ Zhuge Xiaoyuan ], un trabajador migrante de Internet que lucha en sus dudas.

Supongo que te gusta

Origin blog.csdn.net/wuxiaolongah/article/details/109260947
Recomendado
Clasificación