发射器基础
发射器基础
基本结构
一个发射器模块可以定义多个插件。每个插件可以在播放首选项中作为视频播放和/或音频播放的选项出现。由于用于音频的发射器驱动时钟,因此只能使用一个发射器进行音频播放。可以同时选择多个发射器进行视频播放。
当激活时,可以创建单个插件的多个实例。创建实例以显示剪辑或序列。硬件访问通过 ActivateDeactivate 进行管理。只有激活的实例才能访问硬件。
视频格式
在 QueryVideoMode 期间指定您希望接收的视频格式。为了简化您的插件,请尽可能具体,并允许主机提前异步执行转换。还支持打包和压缩格式。如果指定了多种格式,将在渲染时选择最接近的格式。如果您的发射器可以从 GPU 帧中受益,请告诉我们。
当发送 QueryVideoMode 时,发射器通过传递 tmInstance 指针来了解剪辑/序列的视频属性。因此,例如,如果发射器实例被构造为支持 1920x1080 时间线,它可以向主机应用程序报告相同的大小,这样它就不必处理任何缩放。例如,如果它确实处理缩放,并且它被构造为处理 1440x1080 时间线,它可以报告 1440x1080 并自行处理缩放。通过这种方式,您可以根据时间线选择单个固定大小。
当视频帧被推送到发射器时,像素格式等属性可能会根据源素材逐段更改。其他属性(如大小)可能会根据当前的分辨率比例更改,这在擦洗和停止时可能有所不同。
分辨率比例
在 Premiere Pro 的源监视器和节目监视器中,用户可以为播放和暂停模式选择独立的分辨率。例如,通常将播放分辨率设置为一半,暂停分辨率设置为全分辨率。
如果输出卡具有硬件缩放器,传输插件可以声明支持分辨率比例。例如,对于 1920x1080 实例,它不仅可以声明支持 1920x1080,还可以声明支持 960x540、480x270 等。这将允许渲染器在渲染分辨率比例后跳过重新缩放到全分辨率的步骤。然而,如果插件仅声明支持全分辨率,渲染器将在将视频推送到发射器之前将其重新缩放到全分辨率。
音频格式
在 QueryAudioMode 期间,发射器将被告知实例有多少个通道。发射器应根据其支持的内容更改该值,然后确保其提供的缓冲区与之匹配。尽管 Premiere Pro 可以支持 32 个音频通道,但发射器最多只能支持 16 个音频通道。
从 CS6 开始,序列目前将始终在 CreateInstance 中报告音频可用,即使为空。发射器在没有音频的情况下被调用的一个例子是来自 RED 设置对话框的视频输出,该对话框仅包含视频。
发射器应仅在 inAudioActive 作为 true 传递给 ActivateDeactivate 时调用 GetNextAudioBuffer。
帧率
对于帧率,视频将以时间线的速率推送给您。之所以选择这种方式,是因为转换策略的多样性,包括下拉、帧重复等。
丢帧
如果主机无法跟上渲染速度,它将通过 PushVideo 发送重复帧。如果您收到无法及时发送到硬件的帧,请使用 tmPlaybackClock 中的 inDroppedFrame 回调通知主机。在 Premiere Pro 中,用户可以打开丢帧指示器,查看由于主机无法跟上或硬件无法跟上而丢帧的总数。
应用程序 UI 和硬件输出之间的同步
自然,主机发送帧以在输出上显示的时间与实际显示的时间之间存在一些延迟。使用 tmVideoMode.outLatency 指定延迟。例如,如果发射器指定了 5 帧的延迟,当用户开始播放时,主机将在发送 StartPlaybackClock 之前向发射器发送 5 帧视频。这允许发射器提前将帧发送到硬件输出,以便硬件输出与主机应用程序 UI 中的监视器同步。
当用户在时间线中擦洗时,尽可能快地将视频帧发送到输出。主机应用程序 UI 不会等待硬件输出跟上,目前从 6.0.1 开始可能会有明显的延迟。为了尽可能减少擦洗延迟,在擦洗或停止时,发射器应取消任何挂起的帧以立即显示新帧。
狗耳朵
打开狗耳朵以查看发送到发射器的帧的统计信息。这对于查看像素格式等信息非常有用。
隐藏字幕
用户通过序列菜单中的菜单项将此字幕数据附加到序列。在节目监视器中,弹出菜单中的隐藏字幕显示选项使用户可以控制显示。硬件应始终传输任何隐藏字幕数据,用户可以通过硬件监视器的屏幕显示菜单选择要查看的字幕轨道。隐藏字幕数据可通过新的 字幕套件 访问。将此数据用于硬件输出。
从其他插件驱动发射器
发射器可以由 Premiere Pro 界面的许多区域驱动。目前,它们被调用来显示节目监视器和源监视器中的帧。但其他类型的插件可以使用 传输调用套件 将帧推送到发射器。例如,具有模态设置对话框的效果或字幕器可以将帧推送到输出。
入口函数
此入口函数将在加载时调用一次,在卸载时调用一次。
tmResult (*tmEntryFunc)( csSDK_int32 inInterfaceVersion, prBool inLoadModule, piSuitesPtr piSuites, tmModule* outModule)
tmModule 是一个函数指针结构,由发射器实现。