video - 如何显示来自 m3u8 URL 的 HLS 视频流的隐藏式字幕格式

标签 video ffmpeg video-streaming tvos closed-captions

我正在开发一个 Roku 和 TVOS 应用程序,它将播放 HLS 视频(VOD 和直播)以及 MP4。根据Roku docs两者都支持 EIA-608,并且应该也适用于 TVOS。

我的问题是,给定 m3u8 的 URL,我如何知道每个流中使用的隐藏式字幕的特定格式(EIA-608、WebVTT 等)?

m3u8 的主要内容(注意第一个流说没有 CC,但它确实有):

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=380000,RESOLUTION=400x228,CODECS="avc1.66.30, mp4a.40.2",CLOSED-CAPTIONS=NONE
http://d.com/i/video/2426832/2426832_,350,640,1000,2000,.mp4.csmil/index_0_av.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=750000,RESOLUTION=640x360,CODECS="avc1.77.30, mp4a.40.2",CLOSED-CAPTIONS=NONE
http://d.com/i/video/2426832/2426832_,350,640,1000,2000,.mp4.csmil/index_1_av.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1044000,RESOLUTION=1280x720,CODECS="avc1.64001f, mp4a.40.2",CLOSED-CAPTIONS=NONE
http://d.com/i/video/2426832/2426832_,350,640,1000,2000,.mp4.csmil/index_2_av.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2127000,RESOLUTION=1280x720,CODECS="avc1.64001f, mp4a.40.2",CLOSED-CAPTIONS=NONE
http://d.com/i/video/2426832/2426832_,350,640,1000,2000,.mp4.csmil/index_3_av.m3u8

第一个流的内容 m3u8

#EXTM3U
#EXT-X-TARGETDURATION:4
#EXT-X-ALLOW-CACHE:YES
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:4.000,
http://d.com/i/video/2426832/2426832_,350,640,1000,2000,.mp4.csmil/segment1_0_av.ts
...

我可以使用 ffprobe -hide_banner 来显示第一个节目的流有隐藏式字幕。例如:

Duration: 00:02:36.76, start: 0.100511, bitrate: 0 kb/s
  Program 0
    Metadata:
      variant_bitrate : 380000
    Stream #0:0: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p, 400x228 [SAR 1:1 DAR 100:57], Closed Captions, 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Metadata:
      variant_bitrate : 380000
    Stream #0:1: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, mono, fltp, 48 kb/s
    Metadata:
      variant_bitrate : 380000

但是,如您所见,Program 0 > Stream 0 只是说它具有隐藏式字幕 - 它没有列出正在使用的隐藏式字幕技术的类型/规范。

如何显示隐藏式字幕的格式?

最佳答案

WebVTT 是所谓的“边车”或“带外”格式。这意味着字幕位于您必须下载的单独文件中。你可以在 m3u8 中看到这个文件的 URL。这里的字幕是视频流本身的一部分。这种情况下唯一支持的格式是 EIA-608。 ffmpeg 对 608 的支持非常有限。我知道处理 608 的最好工具是 libcaption (完全公开,我写的)。我最近添加了一个 ts2srt 示例程序。公平警告它仍然有点贝塔主义。

关于video - 如何显示来自 m3u8 URL 的 HLS 视频流的隐藏式字幕格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40982432/

相关文章:

video - 如何在使用 ffmpeg libavformat 将 VP8 RTP 流复用到 webm 时从 RTP 时间戳设置 AVPacket 的 pts 和 dts?

google-chrome - headless chrome 捕获屏幕视频或动画

java - 使用 ffmpeg 从 Red5 转换音频

c++ - Qt OpenCV 网络摄像头流打开和关闭

html - CSS 列中的视频排列不正确

javascript - 使用JavaScript在视频播放结束前几秒钟运行一个函数

ios - 带有 BT.709 矩阵的 H.264 编码视频是否包含任何 Gamma 调整?

ffmpeg - 如何创建 WebM 视频文件?

unix - curl | tar - gzip : stdin: not in gzip format

ffmpeg - 当多个循环输入缓冲区中的任何一个溢出时如何使ffmpeg失败