Comandos comunes de desarrollo de audio y video Qt 11-ffmpeg

I. Introducción

La mayoría de las herramientas de conversión de formato, como las fábricas de formato, utilizan ffmpeg para procesar. Los archivos ejecutables como ffmpeg.exe, ffplay.exe, ffprobe.exe, etc. generados después de la compilación de ffmpeg en realidad encapsulan muchas funciones asombrosas. ffprobe es una herramienta para ver la información del encabezado de archivos multimedia, ffplay es una herramienta para reproducir archivos multimedia, especialmente ffmpeg.exe, una poderosa herramienta de conversión de archivos multimedia que puede convertir cualquier archivo multimedia y también puede usar su propio AudioFilter y VideoFliter para procesar y editar. Por ejemplo, algunas de las siguientes funciones.

  1. Enumere los formatos admitidos: ffmpeg -formats
  2. Corte un trozo de archivo multimedia: ffmpeg -i input.mp4 -ss 00: 00: 50.0 -codec copy -t 20 output.mp4
  3. Extraiga archivos de audio en un archivo de video: ffmpeg -i input.mp4 -vn -acodec copy output.m4a
  4. El video está silenciado, es decir, solo se conserva el video: ffmpeg -i input.mp4 -an -vcodec copy output.mp4
  5. Extraiga el flujo de video del archivo MP4 y expórtelo como datos H264 sin procesar: ffmpeg -i output.mp4 -an -vcodec copy -bsf: v h264_mp4toannexb output.h264
  6. Use datos de audio AAC y video H264 para generar archivos MP4: ffmpeg -i test.aac -i test.h264 -acodec copy -bsf: a aac_adtstoasc -vcodec copy -f mp4 output.mp4
  7. Conversión de formato de audio: ffmpeg -i input.wav -acodec libfdk_aac output.aac
  8. Convierta un archivo MP4 en una animación GIF: ffmpeg -i input.mp4 -vf scale = 100: -1 -t 5 -r 10 image.gif

Dado que estas herramientas son tan impresionantes, ¿puede considerar crear una función para llamar directamente a estos archivos ejecutables para su procesamiento? Por supuesto, QProcess está en escena, puede llamar directamente al programa ejecutable o ejecutar directamente el comando, y luego puede interceptar la salida e imprimir información, y leerla en forma de canalización. Esto es muy intuitivo. Puede imprimir cuando el archivo ejecutable es llamado para su ejecución. Se emite toda la información.

2. Características

  1. Reproducción multiproceso en tiempo real de flujo de video + video local + cámara USB, etc.
  2. Admite windows + linux + mac, admite ffmpeg3 y ffmpeg4, admite 32 bits y 64 bits.
  3. Imágenes de pantalla multiproceso, no atascadas en la interfaz principal.
  4. Vuelva a conectar la cámara web automáticamente.
  5. Puede establecer el tamaño del borde, el desplazamiento y el color del borde.
  6. Puede establecer si desea dibujar etiquetas OSD, es decir, etiquetar texto o imágenes y posiciones de etiquetas.
  7. Se pueden configurar dos posiciones y estilos de OSD.
  8. Puede establecer si guardar en archivo y nombre de archivo.
  9. Puede arrastrar el archivo directamente al control ffmpegwidget para reproducirlo.
  10. Admite transmisiones de video comunes como h265 video stream + rtmp.
  11. Puede pausar y reanudar la reproducción.
  12. Admite el almacenamiento de archivos de video individuales y el almacenamiento de tiempo de archivos de video.
  13. Personalice la barra flotante superior, envíe una notificación de señal de clic y establezca si desea habilitarla.
  14. Puede establecer el relleno de estiramiento de la pantalla o el relleno de igual proporción.
  15. Puede configurar la decodificación para que tenga prioridad de velocidad, prioridad de calidad y procesamiento de ecualización.
  16. Puede tomar capturas de pantalla (imágenes originales) y capturas de pantalla de videos.
  17. El almacenamiento de archivos de video admite archivos MP4 y de flujo desnudo.
  18. Admite decodificación rígida como qsv, dxva2, d3d11va, etc.
  19. Admite OpenGL para extraer datos de video, uso de CPU muy bajo.
  20. Soporta Linux embebido, solo compilación cruzada.

Tres, representaciones

Inserte la descripción de la imagen aquí

Cuatro sitios relacionados

  1. Sitio nacional: https://gitee.com/feiyangqingyun/QWidgetDemo
  2. Sitio internacional: https://github.com/feiyangqingyun/QWidgetDemo
  3. Página de inicio personal: https://blog.csdn.net/feiyangqingyun
  4. Página de inicio de Zhihu: https://www.zhihu.com/people/feiyangqingyun/
  5. Dirección de experiencia: https://blog.csdn.net/feiyangqingyun/article/details/97565652

Cinco, el código central

FFmpegTool::FFmpegTool(QObject *parent) : QObject(parent)
{
    //绑定信号槽
    connect(&process, SIGNAL(started()), this, SIGNAL(started()));
    connect(&process, SIGNAL(finished(int)), this, SIGNAL(finished()));
    connect(&process, SIGNAL(readyReadStandardOutput()), this, SLOT(readData()));
    process.setProcessChannelMode(QProcess::MergedChannels);
}

void FFmpegTool::readData()
{
    QString data = process.readAllStandardOutput();
    emit receiveData(data);
}

void FFmpegTool::start(const QString &command)
{
    process.start(command);
}

void FFmpegTool::start(const QString &program, const QStringList &arguments)
{
    process.start(program, arguments);
}

void FFmpegTool::getMediaInfo(const QString &mediaFile, bool json)
{
    //ffprobe -print_format json -show_streams d:/out.mp4
    //不同平台可执行文件路径改成自己的
    QString jsonArg = "-print_format json -show_streams";
    QString binFile = qApp->applicationDirPath() + "/ffprobe.exe";
    QString cmd = QString("%1 %2 %3").arg(binFile).arg(json ? jsonArg : "").arg(mediaFile);
    start(cmd);
}

void FFmpegTool::h264ToMp4ByCmd(const QString &h264File, const QString &aacFile, const QString &mp4File)
{
    if (!QFile(h264File).exists() || mp4File.isEmpty()) {
        return;
    }

    //具体参数可以参考 https://www.cnblogs.com/renhui/p/9223969.html
    //ffmpeg.exe -y -i d:/1.aac -i d:/1.mp4 -map 0:0 -map 1:0 d:/out.mp4
    //-y参数表示默认yes覆盖文件
    //不同平台可执行文件路径改成自己的
    QString binFile = qApp->applicationDirPath() + "/ffmpeg.exe";

    //下面两种方法都可以,怎么方便怎么来
#if 0
    QString cmd = QString("%1 -y -i %2 -i %3 -map 0:0 -map 1:0 %4").arg(binFile).arg(h264File).arg(aacFile).arg(mp4File);
    start(cmd);
#else
    QStringList args;
    args << "-y";
    args << "-i" << h264File;

    //如果存在音频文件则添加
    if (QFile(aacFile).exists()) {
        args << "-i" << aacFile;
    }

    //args << "-map" << "0:0";
    //args << "-map" << "1:0";
    args << mp4File;
    start(binFile, args);
#endif
}

Supongo que te gusta

Origin blog.csdn.net/feiyangqingyun/article/details/108036865
Recomendado
Clasificación