一个简短的背景故事,我正在用 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 来设置video
HTML 元素。我了解移动设备上的 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 地址、主机名和文件名)