CRIWARE Unity Plugin Manual  Last Updated: 2024-07-12
带字幕视频
在Sofdec中可使用带有字幕的视频。
您可以将字幕数据嵌入视频文件中,并在运行时读取。

创建带字幕数据的视频

使用 Sofdec2 Encoding Wizard 进行编码时,可以通过指定字幕文件来创建带有字幕的视频数据。

  • 在“指定字幕素材”页面上,指定字幕信息文件。
  • 字幕信息可以注册至0到15的任意字幕通道中,最多可以嵌入16种类型的字幕。
  • 嵌入字幕数据的字符代码取決于指定的字幕文件的字符代码。
    详细信息请参照Sofdec工具用户手册。

字幕数据的获取

通过在播放时获取字幕数据,可以显示与视频同步的字幕。
使用字幕数据需要进行以下处理。

  • 指定要获取的字幕数据的通道
  • 从字幕数据指针获取字符串
指定获取字幕的通道
使用 CriMana.Player.SetSubtitleChannel(int) 指定字幕通道。
如果未指定通道,则将无法获得字幕。
/* 在初始化时获取CriMana.Player并指定通道 */
player = GetComponent<CriManaMovieMaterial>().player;
player.SetSubtitleChannel(0);
从字幕数据指针获取字符串
从 CriMana.Player.subtitleBuffer 获取字符串。
获取字幕数据时,需要根据在Sofdec工具中输入的字幕文件的字符代码将其转换为字符串。
注意
显示指针的字符串可能不包含null终止。注意必须始终使用通过指针指定缓冲区大小的API。
  • 对于UTF-8或ASCII
可以使用 System.Runtime.InteropServices.Marshal.PtrToStringAnsi 将其转换为 System.String 。
/* 获取字幕 */
IntPtr buffer = player.subtitleBuffer;
string subtitle = Marshal.PtrToStringAnsi(buffer, player.subtitleSize);
  • 对于UTF-16
可以使用 System.Runtime.InteropServices.Marshal.PtrToStringUni 将其转换为 System.String 。
/* 获取字幕 */
IntPtr buffer = player.subtitleBuffer;
string subtitle = Marshal.PtrToStringUni(buffer, player.subtitleSize);
  • 其他
字幕数据可以作为byte[]获取,并通过使用 System.Text.Encoding 类转换为 System.String 。
System.Text.Encoding 类的相关信息请参照以下URL。
https://docs.microsoft.com/en-us/dotnet/api/system.text.encoding
IntPtr buffer = player.subtitleBuffer;
/* 创建byte数组并复制字幕缓冲内容 */
var array = new byte[player.subtitleSize];
Marshal.Copy(buffer, array, 0, player.subtitleSize);
/* 创建Shift-JIS编码并将字节数组转换为字符串 */
var encoding = Encoding.GetEncoding("shift_jis");
string subtitle = encoding.GetString(array);