Как вызывать функцию FFmpeg main() из Qt

Как можно вызывать функцию из \fftols\ffmpeg.c c параметрами

> ffmpeg {1} {2} -i {3} {4} {5}, где:

{1} — глобальные параметры
{2} — параметры входного файла
{3} — входящий URL
{4} — параметры выходного файла
{5} — исходящий URL

В QtCreator?

Я скачал .zip архив FFmpeg: https://github.com/FFmpeg/FFmpeg

И поместил данный архив в корень своего тестового проекта на QT где лежит .pro файл, который хочу запустить на android

Переименовал в файле \fftols\ffmpeg.c функцию int main(int argc, char **argv) на int ffmpeg_main(int argc, char **argv) дабы не возникали ошибки с вызовом этой функции

По началу ругалось на отсутствие файла avconfig.h

Добавил её собственноручно взяв образец из интернета

/* Generated by ffmpeg configure */
#ifndef AVUTIL_AVCONFIG_H
#define AVUTIL_AVCONFIG_H
#define AV_HAVE_BIGENDIAN 0
#define AV_HAVE_FAST_UNALIGNED 0
#endif /* AVUTIL_AVCONFIG_H */

В самом .pro файле добавил:

INCLUDEPATH += $$PWD/FFmpeg

После этого данный код собрался в Qt для android arm64-v8a c компилятором Android Clang

#include "mainwindow.h"
#include <QApplication>

extern "C"
{
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavutil/opt.h"
#include "libswscale/swscale.h"
#include "libavfilter/avfilter.h"
#include "libavutil/log.h"
#include "libavutil/imgutils.h"
}

// Extermal Functions Declaration
extern "C"
{
// помните, мы переименовали main() функцию в ffmpeg.c в ffmpeg_main() вот здесь она и декларируется
int ffmpeg_main(int argc, char **argv);
}


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    //ffmpeg();
    w.show();
    return a.exec();
}

Но когда я хочу взывать функцию ffmpeg_main()

void ffmpeg()
{
    int argc = 5;
            
    char* argv[5] = { "ffmpeg", "-i", "//storage//extSdCard//DCIM//Camera//video.mp4", "-an", "//storage//extSdCard//DCIM//Camera//video_no_audio.mp4"};

    // вызов этой функции с такими аргументами это то же самое, как если бы вы запустили в консоли программу ffmpeg.exe с такими параметрами:
    // > ffmpeg.exe -i "storage/extSdCard/DCIM/Camera/video.mp4" -an "storage/extSdCard/DCIM/Camera/video_no_audio.mp4"
    // параметр -an говорит ffmpeg удалить аудио подток из файла, короче убрать звук и сохранить новый файл в video_no_audio.mp4
    ffmpeg_main(argc, argv);
} 

Возникает ошибка undefined reference to "ffmpeg_main"

Я много раз натыкался, что нужно перед использованием собирать FFmpeg. В моём случае я так понимаю в файлы .so для android. Но не понимаю зачем, если все исходники .c/.h файлов есть и можно их подключить в проект? Можно ли как-то без предварительной конфигурации FFmpeg обойтись и просто вызвать функцию ffmpeg_main() в Qt?


Ответы (0 шт):