我的第一个Filter -- Text Overlay

本文介绍如何使用CTransInPlaceFilter开发DirectShow Filter,重点讲解了项目配置、关键函数实现及Filter注册等内容。

    指南中使用的是 CTransInPlaceFilter 作为这个Filter的基类(一般情况接收并处理数据,我们选择CTransformFilter,但是这里可以“就地”处理数据,所以我们选择了继承自他的CTransInPlaceFilter),其输入输出Pin上一般使用相同的媒体进行连接,并尽量使用同一个Sample管理器,从而避免了内部从输入Pin到输出Pin的一次内存拷贝。(但如果两端就修改Sample无法达成一致时,Input Pin 和 Output Pin 只有使用各自的Sample)

    CTransInPlaceFilter 与CTransformFilter 类似,都不需要重写输入输出Pin,他将Pin上必须实现的函数都“委托”到了Filter上,但如果我们要重写,则同时还需要重写GetPin函数。

    CTransInPlaceFilter 类最少需要重写以下两个函数。

(1) CTransformFilter::CheckInputType

(2) CTransInPlaceFilter::Transform

项目配置

  • 引用头文件目录 :"$(FrameworkSDKDir)/Samples/Multimedia/DirectShow/BaseClasses"
  • Preprocessor definition : WIN32;_DEBUG;_WINDOWS;_USRDLL;TEXTOVERLAYFILTER_EXPORTS
  • Runtime Library : Multi-threaded Debug (/MTd)
  • Additional Lib Directories : "$(FrameworkSDKDir)Samples/Multimedia/DirectShow/BaseClasses/Debug"
  • Dependency : Strmbasd.lib Msvcrtd.lib Winmm.lib
  • EntryPoint DllEntryPoint@12

首先 需要处理的是def 和 定义 DLL的入口函数.

<1> XXXX.def:

 

EXPORTS

    DllMain                 PRIVATE

    DllGetClassObject       PRIVATE

    DllCanUnloadNow         PRIVATE

    DllRegisterServer       PRIVATE

    DllUnregisterServer     PRIVATE

 

<2> 入口函数 (可以放在任意的cpp中,比如 dllmain.cpp)
//
// DllEntryPoint
//
extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);
BOOL APIENTRY DllMain(HANDLE hModule, 
                      DWORD  dwReason, 
                      LPVOID lpReserved)
{
return DllEntryPoint((HINSTANCE)(hModule), dwReason, lpReserved);
}
<3>Filter 注册信息
<a> // {63B7E7F0-9CC7-4b81-A794-007290AD12DB} 可以放入 Guids.h中, 放入接口、组件标识
DEFINE_GUID(CLSID_TextOverlayFilter,
0x63b7e7f0, 0x9cc7, 0x4b81, 0xa7, 0x94, 0x0, 0x72, 0x90, 0xad, 0x12, 0xdb);
<b> 填好用于初始化Filter 的 CFactoryTemplate。 这里为类厂指定了 FilterName, CreateInstance以及 Pin 之类的初始化信息。
        <c> 定义两个导出函数 DllRegisterServer 和 DllUnregisterServer。
<4> 编译后自动注册

        在PostBuild中写入 regsvr32 /s $(SolutionDir)$(ConfigurationName)/TextOverlayFilter.dll

代码编写部分

<5> 框架函数的实现

  • CreateInstance :创建Filter对象实例,在gTemplates 中设定,被DirectShow 类厂调用。
  • CheckInputType:完成输入Pin上的媒体类型检查。
  • Transform:调用控制类,完成字符叠加函数的调用。
  • NonDelegatingQueryInterface :暴露出 Filter 所支持的接口。
  • CompleteConnect:在输入Pin成功连接后取得媒体类型描述。《指南》代码在这里将 输入数据的格式设置给了应用逻辑控制对象。
  • StartStreaming,StopStreaming函数,可以分别调用应用逻辑控制对象的相应函数,进行初始化和反初始化。

<6> Filter属性页

Filter 的属性页就是无法显示,寻找原因中。

<think>我们被要求使用中文回答,并且遵循特定的格式要求。用户的问题是关于在FFmpeg中添加filter的教程。 根据引用,我们可以看到一些使用filter的例子,比如在引用[2]中使用了setpts和atempo滤镜,在引用[4]中使用了overlay滤镜。 我们的回答需要结构清晰,逐步解释如何添加filter。同时,我们需要在最后生成相关问题。 首先,FFmpeg中的filter可以用于处理视频和音频流。常见的filter包括缩放、裁剪、添加水印、调整速度等。 步骤: 1. 理解filter的基本语法:在FFmpeg命令中,使用`-vf`(视频滤镜)或`-filter_complex`(复杂滤镜图,用于多个输入或输出流的情况)来添加滤镜。 对于音频,使用`-af`(音频滤镜)。 2. 简单滤镜链:如果只有一个输入和一个输出,并且滤镜链是线性的,可以使用`-vf`或`-af`。 3. 复杂滤镜:当有多个输入(比如视频加水印,需要两个输入:视频和水印图片)或者需要将滤镜应用到多个流然后合并等复杂情况,使用`-filter_complex`。 举例: 引用[2]中的例子:加快视频和音频的播放速度 ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" -af "atempo=2.0" output.mp4 这里,视频速度加倍(setpts=0.5*PTS)和音频速度加倍(atempo=2.0)分别通过`-vf`和`-af`添加。 引用[4]中的例子:添加水印 ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" -c:a copy output.mp4 这里有两个输入(input.mp4和watermark.png),所以使用`-filter_complex`来指定滤镜,将水印叠加在视频上。 另外,引用[3]中提到了FFmpeg的滤镜文档,我们可以建议用户参考官方文档以获取更多滤镜。 因此,我们可以这样组织回答: 1. 介绍滤镜的基本概念和两种主要方式(简单滤镜和复杂滤镜)。 2. 分别给出简单滤镜和复杂滤镜的例子。 3. 提醒用户注意滤镜链的语法(多个滤镜可以用逗号分隔,形成滤镜链;复杂滤镜图中可以使用分号分隔多个滤镜链)。 4. 提供学习资源,如官方文档。 同时,根据要求,我们需要在最后生成相关问题。 注意:用户的问题是如何添加filter,所以我们重点放在添加方法上,而不是具体每个滤镜的用法。 最后,生成相关问题: 1. 如何查看FFmpeg支持的滤镜列表? 2. 在FFmpeg中如何同时应用多个滤镜? 3. 如何编写复杂的滤镜图? 4. 如何调整视频的亮度和对比度? 另外,根据引用,我们可以在回答中引用[2]和[4]中的例子,并标注引用。 回答结构: 标题:FFmpeg中添加滤镜的方法 内容: 一、简单滤镜的使用 视频滤镜:-vf 音频滤镜:-af 例子:引用[2]中的加速命令 二、复杂滤镜的使用 使用场景:多个输入或输出流,或者需要多个处理步骤 参数:-filter_complex 例子:引用[4]中的添加水印命令 三、注意事项 1. 多个滤镜可以用逗号连接,形成滤镜链。 2. 在复杂滤镜图中,可以使用分号分隔多个滤镜链。 3. 输入流和输出流的指定:在复杂滤镜中,通常需要使用方括号标记流(例如[0:v]表示第一个输入文件的视频流)。 4. 可以查看FFmpeg官方滤镜文档获取更多信息。 四、总结 相关问题: 生成3-5个相关问题。 注意:我们引用的内容在末尾添加引用标识,例如[^2]。</think>### FFmpeg 添加 Filter 教程 在 FFmpeg 中添加滤镜(Filter)是通过 `-vf`(视频滤镜)、`-af`(音频滤镜)或 `-filter_complex`(复杂滤镜链)参数实现的。以下是详细步骤和示例: #### 一、基础语法 1. **单一滤镜** ```bash ffmpeg -i input.mp4 -vf "filter_name=参数" output.mp4 ``` 示例:将视频缩放为 1280x720 ```bash ffmpeg -i input.mp4 -vf "scale=1280:720" output.mp4 ``` 2. **多个滤镜串联** 用逗号分隔多个滤镜,按顺序执行: ```bash ffmpeg -i input.mp4 -vf "滤镜1,滤镜2,滤镜3" output.mp4 ``` 示例:先裁剪再旋转 ```bash ffmpeg -i input.mp4 -vf "crop=640:480:0:0,transpose=1" output.mp4 ``` 3. **复杂滤镜链** 当涉及多输入流(如叠加水印)时,需用 `-filter_complex`: ```bash ffmpeg -i video.mp4 -i logo.png -filter_complex "[0:v][1:v]overlay=10:10" output.mp4 ``` 此处 `[0:v]` 表示第一个输入的视频流,`[1:v]` 是第二个输入的图像流[^4]。 --- #### 二、常用滤镜示例 1. **调整播放速度** 视频加速 2 倍,音频同步加速: ```bash ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" -af "atempo=2.0" output.mp4 ``` `setpts=0.5*PTS` 控制视频帧率,`atempo=2.0` 控制音频速度[^2]。 2. **添加水印** 将 PNG 水印叠加到视频左上角: ```bash ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" output.mp4 ``` `overlay=10:10` 表示水印位置距左 10 像素、距顶 10 像素[^4]。 3. **色彩调整** 调整亮度(`brightness`)和对比度(`contrast`): ```bash ffmpeg -i input.mp4 -vf "eq=brightness=0.1:contrast=1.5" output.mp4 ``` --- #### 三、高级技巧 1. **GPU 加速滤镜** 使用 NVIDIA CUDA 缩放视频(需支持硬件加速): ```bash ffmpeg -hwaccel cuda -i input.mp4 -vf "scale_npp=1280:720" output.mp4 ``` 2. **多路流处理** 合并两个视频并并排显示: ```bash ffmpeg -i left.mp4 -i right.mp4 -filter_complex "[0:v][1:v]hstack" output.mp4 ``` `hstack` 表示水平堆叠。 3. **查看可用滤镜** 列出所有支持的滤镜: ```bash ffmpeg -filters ``` --- #### 四、注意事项 - **引号规则**:滤镜参数含空格时需用双引号包裹(如 `"drawtext=text='Hello'"`)。 - **流选择**:复杂滤镜中通过 `[0:v]` 指定第一个输入的视频流,`[1:a]` 指定第二个输入的音频流。 - **性能优化**:添加 `-preset fast` 可提升处理速度(如 `-preset fast`)。 > 更多滤镜用法参考 [FFmpeg Filters Documentation](https://ffmpeg.org/ffmpeg-filters.html)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值