4

一个简短的背景故事,我正在用 Raspberry Pi 构建一个婴儿监视器,并用 Node.JS 编写一个 Web 前端。我有几部旧手机,我打算把它们放在家里,这样婴儿监视器就可以散落一地。到目前为止,整个系统的大部分工作,除了 iPhone 上的 HLS 视频组件。

HLS 视频部分可以在我的桌面上使用 Linux/Chromium 和我的 Android/Chrome 手机。我还可以让 HLS 视频在带有 Chrome 的 MacBook (10.13.3) 上运行。但是,我真正的问题是我无法让 HLS 视频在任何iOS 移动设备上运行,特别是 iOS 版本 10.3.3 和 11.2.5。

我在客户端使用 HLS.js 来设置videoHTML 元素。我了解移动设备上的 iOS 不支持媒体源扩展 (MSE),这将解释为什么 HLS.js 不能在我的 iPhone 上运行。但是,移动设备上的“本机”HLS 支持似乎仍然不支持媒体文件的格式。

我正在使用这个picam代码(来自 iizukanao)从 Pi 的相机创建 m3u8 播放列表和相应的 .ts 文件。我怀疑 m3u8 文件没有移动 iOS 客户端想要的格式。我手动弄乱了 m3u8 文件,但没有看到任何积极的影响。我运行 picam 模块:

./picam --hlsdir /run/shm/picam/hls --vflip --autoex --alsadev "hw:1,0" --vfr --avcprofile baseline --avclevel 3.1

示例 m3u8 文件:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:1
#EXT-X-MEDIA-SEQUENCE:341
#EXT-X-ALLOW-CACHE:NO
#EXTINF:1.07678,
340.ts
#EXTINF:0.31413,
341.ts
#EXT-X-ENDLIST

我认为我有基于此Apple FAQ和 ffprobe 输出的正确编解码器:

ffprobe https://RPI/hls/index.m3u8
[https @ 0x9667c0] No trailing CRLF found in HTTP header.
[tls @ 0x966980] The TLS connection was non-properly terminated.
[https @ 0x11a67e0] No trailing CRLF found in HTTP header.
Input #0, hls,applehttp, from 'https://RPI/hls/index.m3u8':
  Duration: N/A, start: 301.014111, bitrate: N/A
  Program 0 
    Metadata:
      variant_bitrate : 0
    Stream #0:0: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p, 1280x720, 15.83 tbr, 90k tbn, 180k tbc
    Stream #0:1: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz,     mono, fltp, 43 kb/s

我使用 nginx 和此站点配置提供实际的 HLS 文件:

server {
    listen 8443 ssl;

    ssl_certificate     RPI.crt;
    ssl_certificate_key RPI.key;
    ssl_password_file   RPI.pass;

    server_name RPI;

    location /hls {
        add_header 'Accept-Ranges' 'bytes';
        add_header 'Access-Control-Allow-Origin' '*' always;
        add_header 'Access-Control-Expose-Headers' 'Content-Length';
        add_header 'Cache-Control' 'no-cache';
        if ($request_method = 'OPTIONS') {
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Max-Age' 1728000;
            add_header 'Content-Length' 0;
            add_header 'Content-Type' 'text/plain charset=UTF-8';
            return 204;
        }
        types {
            application/vnd.apple.mpegurl m3u8;
            video/mp2t ts;
        }
        root /run/shm/picam;
    }
}

有没有人知道为什么我的 iPhone 认为视频格式不受支持?

如果有帮助,我的全部代码都在 Github 上:(暂时不要评判我的代码,它仍在进行中)

(我已经用“RPI”替换了各种 IP 地址、主机名和文件名)

4

0 回答 0