云端录制生成的录制文件包括 M3U8 索引文件、TS/WebM 切片文件和 MP4 文件。如果要对录制文件进行进一步处理,如合并单流录制获得的文件,转换合流录制文件格式,或与其他数据流文件同步回放,你需要了解录制文件的命名规则、文件格式以及切片规则。
单流转码录制生成的录制文件的命名规则如下:
<sid>_<cname>__uid_s_<uid>__uid_e_<type>.m3u8
<sid>_<cname>__uid_s_<uid>__uid_e_<type>_utc.ts
<sid>_<cname>__uid_s_<uid>__uid_e_<type>_utc.webm
<sid>_<cname>__uid_s_<uid>__uid_e_<index>.mp4
上述文件名中各字段含义如下:
<sid>
:录制 ID<cname>
:频道名<uid>
:用户 ID<type>
: 文件类型,audio
或 video
<utc>
:该切片文件开始录制时的 UTC 时间,时区为 UTC+0,由年、月、日、小时、分钟、秒和毫秒组成。例如,utc
等于 20190611073246073
,表示该切片文件的开始时间为 UTC 2019 年 6 月 11 日 7 点 32 分 46 秒 73 毫秒。<index>
:MP4 文件的索引数,0
表示生成的第一个 MP4 文件。录制服务会在当前 MP4 文件时长超过约 2 小时或大小超过 2 GB 左右时创建一个新的 MP4 文件。示例文件名 sid713476478245_cnameagora__uid_s_123__uid_e_video_20190920125142485.ts
中,sid713476478245
为录制 ID,cnameagora
为频道名,123
为用户 ID,录制时间为 2019 年 9 月 20 日 12 点 51 分 42 秒 485 毫秒。
单流音频不转码录制生成的录制文件的命名规则如下:
<sid>_<cname>__uid_s_<uid>__uid_e_<type>.m3u8
<sid>_<cname>__uid_s_<uid>__uid_e_<type>_utc.ts
上述文件名中各字段含义如下:
<sid>
:录制 ID<cname>
:频道名<uid>
:用户 ID<type>
: 文件类型为 audio
<utc>
:该切片文件开始录制时的 UTC 时间,时区为 UTC+0,由年、月、日、小时、分钟、秒和毫秒组成。例如,utc
等于 20190611073246073
,表示该切片文件的开始时间为 UTC 2019 年 6 月 11 日 7 点 32 分 46 秒 73 毫秒。单流音频不转码录制+ 延时混音生成的录制文件的命名规则如下:
<sid>_<cname>__uid_s_<uid>__uid_e_<type>.m3u8
<sid>_<cname>__uid_s_<uid>__uid_e_<type>_utc.ts
<sid>_<cname>_<index>.mp3/m4a/aac
上述文件名中各字段含义如下:
<sid>
:录制 ID<cname>
:频道名<uid>
:用户 ID<type>
: 文件类型为 audio
<utc>
:该切片文件开始录制时的 UTC 时间,时区为 UTC+0,由年、月、日、小时、分钟、秒和毫秒组成。例如,utc
等于 20190611073246073
,表示该切片文件的开始时间为 UTC 2019 年 6 月 11 日 7 点 32 分 46 秒 73 毫秒。<index>
: 该 MP3/M4A/AAC 文件的索引数,0
表示录制生成的第一个 MP3/M4A/AAC 文件。合流模式下,云端录制生成的录制文件的命名规则如下:
<sid>_<cname>.m3u8
<sid>_<cname>_<utc>.ts
<sid>_<cname>_<index>.mp4
avFileType
设置为 ["hls","mp4"]
时,才会生成 MP4 文件。上述文件名中各字段含义如下:
<sid>
:录制 ID<cname>
:频道名<utc>
:该切片文件开始录制时的 UTC 时间,时区为 UTC+0,由年、月、日、小时、分钟、秒和毫秒组成。例如 20190611073246073
表示该切片文件的开始时间为 UTC 2019 年 6 月 11 日 7 点 32 分 46 秒 73 毫秒。<index>
: 该 MP4 文件的索引数,0
表示录制生成的第一个 MP4 文件。录制服务会在当前 MP4 文件时长超过约 2 小时或大小超过 2 GB 左右时创建一个新的 MP4 文件。页面录制模式下,云端录制生成的录制文件的命名规则如下:
<sid>_<cname>.m3u8
<sid>_<cname>_<utc>.ts
<sid>_<cname>_<index>.mp4
avFileType
中设置了 "mp4"
时,才会生成 MP4 文件。上述文件名中各字段含义如下:
<sid>
:录制 ID。<cname>
: 你在 acquire
方法中填入的 cname
值。<utc>
:该切片文件开始录制时的 UTC 时间,时区为 UTC+0,由年、月、日、小时、分钟、秒和毫秒组成。例如 20190611073246073
表示该切片文件的开始时间为 UTC 2019 年 6 月 11 日 7 点 32 分 46 秒 73 毫秒。<index>
: 该 MP4 文件的索引数,0
表示页面生成的第一个 MP4 文件。录制服务会在当前 MP4 文件时长超过约 2 小时或大小超过 2 GB 左右时创建一个新的 MP4 文件。cname
中的特殊字符在生成文件时会被替换成 "-"。特殊字符包括:"!"、 "@"、 "#"、 "$"、 "%"、 "^"、 "&"、 "*"、 "("、 ")"、 "+"、 "_"、 "."、 "="、 "["、 "]"、 "{"、 "}"、 "~"、 "|"、 "、"、 ";"、 ":"、 "?"、 "<"、 ">"。如果录制文件上传到你指定的云存储失败,云端录制会将文件通过备份云转存至你指定的云存储。为确保不覆盖最新版本,M3U8 文件名会附上后缀 _<tick>_<index>
。
tick
:与该 M3U8 文件生成时的时间相关。index
:该 M3U8 文件的索引数。0
表示第一次更新。index
越大,M3U8 文件的版本越新。以文件名 sid713476478245_cnameagora__uid_s_123__uid_e_video_22194679897_3.m3u8
为例,3
为该 M3U8 文件的索引数,表示该文件为第四次更新后的 M3U8 文件。
当云存储中存在带有
_<tick>_<index>
后缀的 M3U8 文件,你需要将index
最大的 M3U8 文件与无后缀的 M3U8 文件对比,选择内容较多的一个,作为最终使用的 M3U8 文件。
通过备份云转存的 TS/WebM 文件以及 MP4 文件的文件名不会附上该后缀。
当出现服务器断网、进程被杀时,云端录制会自动启用高可用机制,在 90 秒内切换到新的服务器,自动恢复录制服务。启用高可用机制后,会生成新的 M3U8 文件,包含录制服务恢复之后的切片文件索引信息。文件名增加 bak<n>
前缀,n
为高可用机制在该次录制中被启用的 index, 0
表示第一次启用。
以文件名 bak0_sid713476478245_cnameagora.m3u8
为例,bak0
表示该文件为本次录制中第一次启用高可用机制后生成的 M3U8 文件。
启用高可用机制后,录制生成的 TS/WebM 文件以及 MP4 文件的文件名也会增加 bak<n>
前缀。
如需将原 M3U8 文件与启用高可用机制后生成的新 M3U8 文件合并为一个 MP4 文件,你可以按照如下步骤使用 Transcoder 脚本进行文件合并(仅适用于合流录制文件):
transcoder
和 ffmpeg
所在路径。 ./ha_transcoder.exe -inputPath "<YourinputPath>" -ignoreNotExist -concatM3u8 -concatStrategy 0
参数 | 描述 | 是否必填 |
---|---|---|
-concatM3u8 |
将原 M3U8 文件与启用高可用机制后生成的新 M3U8 文件合并为一个 MP4 文件。如果不设置该参数,则原 M3U8 文件与新 M3U8 文件会分别转换为 MP4 文件。 | 否 |
-concatStrategy |
合并策略,该参数必须与 -concatM3u8 同时使用。 可设为:
|
否 |
-ignoreNotExist |
忽略丢失的 TS 文件,并使用黑帧替代。 如果不设置该参数,则任何一个 TS 文件的缺失都会导致转换失败。 | 否 |
-inputPath |
输入路径,用于指定待合并文件的绝对存储路径。 | 是 |
-outputPath |
输出路径,用于指定已合并文件的绝对存储路径。默认与输入路径相同。 | 否 |
单流模式下,录制文件大小主要与音视频源的码率和录制时长相关。例如,当音频码率为 48 Kbps,视频码率为 500 Kbps,录制文件时长为 30 分钟时,该录制文件的大小约为 (48 Kbps + 500 Kbps) * 60 s/min * 30 min = 986.4 Mbit,即 123.3 MB。
合流模式下,录制文件大小主要与转码设置中的码率和录制时长相关,如果你未进行转码设置,则使用默认值。例如,当你在 start
方法中设置 audioProfile
为 1
(音频码率 128 Kbps),设置 bitrate
(视频码率)为 800
,录制文件时长为 30 分钟时,该文件的大小约为 (128 Kbps + 800 Kbps) * 60 s/min * 30 min = 1670.4 Mbit,即 208.8 MB。
M3U8 文件包含多个切片文件的文件名及其描述符。声网云端录制产生的 M3U8 文件中用到的描述符有三种:
#EXT-X-AGORA-TRACK-EVENT:EVENT=<event>,TRACK_TYPE=<type>,TIME=<utc>
:音视频流开始或者中断后重新开始的第一个切片文件会附带这一描述符,描述流状态的变化。
EVENT
: 事件名称,目前只能为 START
,表示音视频开始或中断后重新开始TRACK_TYPE
:切片文件内容,AUDIO
或 VIDEO
TIME
: 流状态变化的时间。UTC 时间,时区为 UTC+0#EXT-X-AGORA-ROTATE:WIDTH=<width>,HEIGHT=<height>,ROTATE=<rotate>,TIME=<utc>
:视频旋转后第一个切片文件会附带这一描述符,描述视频旋转的信息。一个切片文件可能附带多个视频旋转的描述符。
WIDTH
:视频宽度HEIGHT
:视频高度ROTATE
:视频逆时针旋转的角度,只能为 0
、90
、180
或 270
TIME
:视频发生旋转的时间。UTC 时间,时区为 UTC+0。#EXTINF:<length>
:描述切片文件的时长,单位为秒。
例如:
#EXT-X-AGORA-ROTATE:WIDTH=640,HEIGHT=480,ROTATE=90,TIME=20190920125142485
#EXT-X-AGORA-TRACK-EVENT:EVENT=START,TRACK_TYPE=VIDEO,TIME=20190920125142485
#EXTINF:6.332000
sid713476478245_cnameagora__uid_s_123__uid_e_video_20190920125142485.ts
#EXTINF:<length>
后没有逗号而出现兼容性问题,你可以在 start 请求中的 recordingConfig
参数中配置参数 privateParams
,即 "recordingConfig": {"privateParams":"{\"correctEXTINF\":true}", ...}
当满足以下任一条件时,云端录制即会对视频文件进行切片:
当在 Web 端使用 VP8 编码时,云端录制不会强制切片。
当切片时长达到 15 秒,云端录制会对音频文件进行切片。
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:18
#EXT-X-DISCONTINUITY
#EXT-X-AGORA-TRACK-EVENT:EVENT=START,TRACK_TYPE=AUDIO,TIME=20190920125142289
#EXTINF:15.019000
sid713476478245_cnameagora__uid_s_123__uid_e_audio_20190920125142289.ts
#EXTINF:15.019000
sid713476478245_cnameagora__uid_s_123__uid_e_audio_20190920125157307.ts
#EXTINF:15.019000
sid713476478245_cnameagora__uid_s_123__uid_e_audio_20190920125212326.ts
#EXTINF:15.019000
sid713476478245_cnameagora__uid_s_123__uid_e_audio_20190920125227345.ts
#EXTINF:12.523000
sid713476478245_cnameagora__uid_s_123__uid_e_audio_20190920125242363.ts
#EXT-X-ENDLIST
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:34
#EXT-X-DISCONTINUITY
#EXT-X-AGORA-ROTATE:WIDTH=640,HEIGHT=480,ROTATE=0,TIME=20190920125142485
#EXT-X-AGORA-TRACK-EVENT:EVENT=START,TRACK_TYPE=VIDEO,TIME=20190920125142485
#EXTINF:6.332000
sid713476478245_cnameagora__uid_s_123__uid_e_video_20190920125142485.ts
#EXT-X-AGORA-ROTATE:WIDTH=1280,HEIGHT=720,ROTATE=0,TIME=20190920125149174
#EXT-X-DISCONTINUITY
#EXTINF:17.442000
sid713476478245_cnameagora__uid_s_123__uid_e_video_20190920125149174.ts
#EXT-X-DISCONTINUITY
#EXT-X-AGORA-ROTATE:WIDTH=640,HEIGHT=480,ROTATE=0,TIME=20190920125206616
#EXTINF:33.326000
sid713476478245_cnameagora__uid_s_123__uid_e_video_20190920125206616.ts
#EXT-X-DISCONTINUITY
#EXT-X-AGORA-ROTATE:WIDTH=1280,HEIGHT=720,ROTATE=0,TIME=20190920125239942
#EXTINF:14.815000
sid713476478245_cnameagora__uid_s_123__uid_e_video_20190920125239942.ts
#EXT-X-ENDLIST