dql2016 发表于 2021-12-6 19:14

【米尔MYD-YA15XC-T评测】+ 使用ffmpeg音视频处理软件处理多媒体文件(上)

<div class='showpostmsg'><p><span style="font-size:20px;">在多媒体音视频处理应用中一个常见的需求就是给视频或者图像叠加水印文字、图片logo等。以下是ffmpeg的介绍:</span></p>

<p>FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。<br />
FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的&quot;FF&quot;代表&quot;Fast Forward&quot;。 &nbsp;FFmpeg编码库可以使用GPU加速。</p>

<p>FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了领先的音/视频编码库libavcodec等。<br />
libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构<br />
和读取音视频帧等功能;<br />
libavcodec:用于各种类型声音/图像编解码;<br />
libavutil:包含一些公共的工具函数;<br />
libswscale:用于视频场景比例缩放、色彩映射转换;<br />
libpostproc:用于后期效果处理;<br />
ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等;<br />
ffsever:一个 HTTP 多媒体即时广播串流服务器;<br />
ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;</p>

<p>&nbsp;</p>

<p><span style="font-size:20px;">本次就打算使用ffmpeg进行中英文特殊字符水印、图片水印的叠加测试,首先在电脑端实现功能,然后交叉编译移植到米尔MYD-YA15XC-T平台,顺便定性对比下电脑和米尔MYD-YA15XC-T的多媒体处理性能。</span></p>

<p><span style="font-size:20px;">在编译ffmpeg前需要先编译字体处理软件freetype,这里使用了freetype-2.10.2版本。</span></p>

<p><span style="font-size:20px;">编译命令如下:</span></p>

<pre>
<code class="language-bash">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</code></pre>

<p></p>

<p><span style="font-size:20px;">然后编译ffmpeg,指定freetype库和头文件路径:</span></p>

<pre>
<code class="language-bash">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</code></pre>

<p></p>

<p>项目文件夹内容如下:</p>

<pre>
<code class="language-bash">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
</code></pre>

<p>测试项目使用CMake构建,CMakeLists.txt内容如下:</p>

<pre>
<code class="language-bash">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)
</code></pre>

<p><span style="font-size:20px;">main.cpp是测试代码,直接使用system函数调用ffmpeg即可,需要注意的是特殊符号需要转义:</span></p>

<pre>
<code class="language-cpp">    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());</code></pre>

<p>&nbsp;</p>

<pre>
<code class="language-cpp">      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);</code></pre>

<p>&nbsp;</p>

<p><span style="font-size:20px;">toolchain.cmake内容:</span></p>

<pre>
<code class="language-bash">set(CMAKE_CXX_COMPILER g++)
set(CMAKE_C_COMPILER gcc)</code></pre>

<p><span style="font-size:20px;">进入build目录,打开终端执行以下命令进行编译:</span></p>

<pre>
<code class="language-bash">cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake ..
make</code></pre>

<p><span style="font-size:20px;">可以看到图片上叠加了预期的水印内容,处理时间183毫秒:</span><br />
<span style="font-size:20px;">下一步就是眼睛就如何正确交叉编译ffmpeg到米尔MYD-YA15XC-T平台了,周六晚上折腾了半天,虽然编译出了命令行工具个库,但是放到米尔MYD-YA15XC-T里面无法运行,总是提示命令找不到,还得仔细研究下。</span></p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

annysky2012 发表于 2021-12-7 08:34

<p>感谢分享</p>

soso 发表于 2021-12-7 10:54

<p>好的,需要支持可以随时联系管理员哈</p>

freebsder 发表于 2021-12-8 11:28

<p>和楼主学习一下Linux音视频处理。</p>
页: [1]
查看完整版本: 【米尔MYD-YA15XC-T评测】+ 使用ffmpeg音视频处理软件处理多媒体文件(上)