在ffmpeg.c中使用包含opencv的so庫

新建一個引用opencv的so工程

新建的測試工程,僅僅是通過輸入一個圖像路徑,顯示出來

use_opencv.h文件如下

#ifndef __HEADER_H__
#define __HEADER_H__

#ifdef __IMPORT_FUNC__
extern "C" {
void test_opencv(char* img_path);
}
#else
void test_opencv(char* img_path);
#endif

#endif

use_opencv.cpp文件如下

#include <iostream>
using namespace std;
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/types_c.h>
using namespace cv;//使用命名空間

#define __IMPORT_FUNC__
#include "use_opencv.h"


void test_opencv(char* img_path)
{
	cout << "hello opencv2222." << endl;

	Mat img = imread(img_path, 0); // 讀取圖片 這裏文件地址寫成你想打開的文件的地址或者放在執行目錄裏就不用寫路徑直接使用文件名字
	imshow("load image",img);//在窗口中打開圖片
	waitKey(100000);//等待時間,這裏等待時間最好別填零,要不打開的窗口秒退
}

int main()
{
	char *img_path = "/home/zeng/ffmpeg/ffmpeg-4.2.2/1.jpg";
	test_opencv(img_path);

	return 0;
}

生成.so庫中的測試例子

用下面的命令先生成測試二進制文件

g++ use_opencv.cpp -o use_opencv -I/usr/local/include/ -I/usr/lcoal/include/opencv -I/usr/local/include/opencv2 -L/usr/local/lib/ -lopencv_imgproc -lopencv_highgui -lopencv_core -lopencv_imgcodecs

運行這個二進制文件,如果成功,在繼續

在這裏插入圖片描述

生成.so庫

再用如下的命令生成一個.so庫

g++ use_opencv.cpp -shared -o libuse_opencv.so -O0 -fPIC -g3 -Wall -I/usr/local/include/ -I/usr/lcoal/include/opencv -I/usr/local/include/opencv2 -L/usr/local/lib/ -lopencv_imgproc -lopencv_highgui -lopencv_core -lopencv_imgcodecs

這就是生成的.so庫

在這裏插入圖片描述

用nm命令查看是否導出了函數

用如下命令查看.so庫是否導出了對應的函數test_opencv

nm -D libuse_opencv.so |grep test_opencv

可以看到對應的函數已經導出,前面是T的

在這裏插入圖片描述

在測試工程.c文件中引入這個.so庫

新建一個項目,在main函數中調用這個.so庫中的test_opencv函數

test_ffmpeg.c代碼如下

#include <stdio.h>
#include <stdlib.h>

#include "use_opencv.h"

int main(void) {
	puts("!!!Hello World2!!!"); /* prints !!!Hello World!!! */

	char *img_path = "/home/zeng/ffmpeg/ffmpeg-4.2.2/1.jpg";
	test_opencv(img_path);

	return EXIT_SUCCESS;
}

準備工作

拷貝use_opencv.h到/usr/local/include中

sudo cp use_opencv.h /usr/local/include/

拷貝libuse_opencv.so到/usr/local/lib中

sudo cp libuse_opencv.so /usr/local/lib/

在這裏插入圖片描述

編譯測試

使用如下命令,編譯test_ffmpeg.c,得到二進制文件test_ffmpeg

gcc test_ffmpeg.c -o test_ffmpeg -I/usr/local/include/ -L/usr/local/lib/ -luse_opencv

執行這個測試用的二進制文件,也可以看到效果

在這裏插入圖片描述

在ffmpeg.c中引入這個so庫

準備工作

打開ffmpeg.c,加入使用的部分代碼

在這裏插入圖片描述

修改fftools下的Makefile,加入如下兩行

$$(OBJS-$(1)): CFLAGS  += -I/usr/local/include
$(1)$(PROGSSUF)_g$(EXESUF): FF_EXTRALIBS += -luse_opencv

在這裏插入圖片描述

測試使用

對ffmpeg項目進行配置,生成ffmpeg.c

./configure --enable-gpl --enable-nonfree --enable-pthreads --extra-cflags=-g --extra-cflags=-O0 --extra-libs=-lstdc++ --extra-cxxflags=-g --extra-cxxflags=-O0 --extra-cxxflags=-fpermissive --enable-debug=3 --disable-optimizations --disable-stripping --enable-libx264 --disable-doc --disable-htmlpages --disable-ffplay --disable-ffprobe

生成ffmpeg之後,使用如下命令調用ffmpeg

ffmpeg -i input.mp4 -vcodec h264 -max_muxing_queue_size 1024 out.mp4

可以看到結果如下,說明.so庫已經可以使用

在這裏插入圖片描述

用ldd查看一下生成的ffmpeg也可以看到依賴了對應的so庫

在這裏插入圖片描述

參考鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章