在多媒体音视频处理应用中一个常见的需求就是给视频或者图像叠加水印文字、图片logo等。以下是ffmpeg的介绍:
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。
FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。 [1] FFmpeg编码库可以使用GPU加速。
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了领先的音/视频编码库libavcodec等。
libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构
和读取音视频帧等功能;
libavcodec:用于各种类型声音/图像编解码;
libavutil:包含一些公共的工具函数;
libswscale:用于视频场景比例缩放、色彩映射转换;
libpostproc:用于后期效果处理;
ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等;
ffsever:一个 HTTP 多媒体即时广播串流服务器;
ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;
本次就打算使用ffmpeg进行中英文特殊字符水印、图片水印的叠加测试,首先在电脑端实现功能,然后交叉编译移植到米尔MYD-YA15XC-T平台,顺便定性对比下电脑和米尔MYD-YA15XC-T的多媒体处理性能。
在编译ffmpeg前需要先编译字体处理软件freetype,这里使用了freetype-2.10.2版本。
编译命令如下:
make clean
./configure --prefix=/opt/nrjd/nrjd-olms-0201/apps/aaa/comm/pc/freetype --with-zlib=no --with-png=no --enable-static=no
make -j12
make install
make clean
然后编译ffmpeg,指定freetype库和头文件路径:
make clean
./configure --enable-shared --disable-static --target-os=linux --enable-libx264 --enable-gpl --enable-libfreetype --enable-filter=drawtext --extra-cflags="-I/home/qldeng/ffmpeg_watermark_test/ffmpeg_test_pc/comm/pc/freetype/include/freetype2" --extra-ldflags="-L/home/qldeng/ffmpeg_watermark_test/ffmpeg_test_pc/comm/pc/freetype/lib" --prefix=/home/qldeng/ffmpeg_watermark_test/ffmpeg_test_pc/comm/pc/ffmpeg
make -j12
make install
make clean
项目文件夹内容如下:
qldeng@ubuntu:~/ffmpeg_watermark_test/ffmpeg_test_pc$ tree -L 2
.
├── build
├── CMakeLists.txt
├── comm
│ ├── ffmpeg-4.4
│ ├── freetype-2.10.2
│ └── pc
├── in.jpg
├── logo.png
├── main.cpp
├── out.jpg
├── readme.txt
├── SourceHanSansCN-Bold.ttf
├── toolchain.cmake
└── 捕获.PNG
5 directories, 9 files
测试项目使用CMake构建,CMakeLists.txt内容如下:
cmake_minimum_required(VERSION 3.17)
#输出可执行文件的文件名
set(ARTIFACT_NAME myapp)
project(${ARTIFACT_NAME})
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_C_STANDARD 99)
set(MYLIBS_PATH /opt/nrjd/nrjd-olms-0201/apps/ffmpeg_test_pc/comm/pc)
set(INC_DIR
${PROJECT_SOURCE_DIR}
${MYLIBS_PATH}/freetype/include/freetype2
${MYLIBS_PATH}/ffmpeg/include
)
set(LINK_DIR
${MYLIBS_PATH}/freetype/lib
${MYLIBS_PATH}/ffmpeg/lib
)
include_directories(${INC_DIR})
link_directories(${LINK_DIR})
aux_source_directory(${PROJECT_SOURCE_DIR} SOURCE_FILES)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR})
link_libraries(
freetype
avcodec
avdevice
avfilter
avformat
avutil
postproc
swresample
swscale
)
add_executable(${ARTIFACT_NAME} ${SOURCE_FILES})
target_link_libraries(${ARTIFACT_NAME}
freetype
avcodec
avdevice
avfilter
avformat
avutil
postproc
swresample
swscale
pthread)
main.cpp是测试代码,直接使用system函数调用ffmpeg即可,需要注意的是特殊符号需要转义:
cmd = "ffmpeg -loglevel quiet -i " + string(dest_path) + " -vf drawtext=\"fontcolor=white:fontfile=SourceHanSansCN-Bold.ttf:fontsize=40:x=w-tw-th/2:y=h-th-th::alpha=0.65:box=1:boxcolor=0x000000:text='" + string(s5) + "\" -y " + string(dest_path);
system(cmd.c_str());
float battery_voltage = 12.345;
float battery_current = 0.678;
float device_temperature = 37.2;
s1 = "日期\\:" + string(str) + "\"";
memset(str, 0, sizeof(str));
sprintf(str, "处理器\\:%0.1f\℃ 电源\\:%0.1fV %0.2fA CSQ\\:%d%%", device_temperature, battery_voltage,battery_current,64);
s2 = string(str);
toolchain.cmake内容:
set(CMAKE_CXX_COMPILER g++)
set(CMAKE_C_COMPILER gcc)
进入build目录,打开终端执行以下命令进行编译:
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake ..
make
可以看到图片上叠加了预期的水印内容,处理时间183毫秒:
下一步就是眼睛就如何正确交叉编译ffmpeg到米尔MYD-YA15XC-T平台了,周六晚上折腾了半天,虽然编译出了命令行工具个库,但是放到米尔MYD-YA15XC-T里面无法运行,总是提示命令找不到,还得仔细研究下。