快速背景故事,我正在使用Raspberry Pi构建一个婴儿监视器,并使用Node.JS编写Web前端。我有一些旧手机,我打算留在家里,所以婴儿监视器可以分散。到目前为止,整个系统的大部分都在工作,除了iPhone上的HLS视频组件。
HLS视频部分可在我的桌面上使用Linux / Chomimum和我的Android / Chrome手机。我也可以通过Chrome在HOOK上使用HLS视频在MacBook(10.13.3)上运行。但是,我真正的问题是我无法让HLS视频在任何 iOS移动设备 上工作,特别是iOS版本10.3.3和11.2.5。
我在客户端使用HLS.js来设置./picam --hlsdir /run/shm/picam/hls --vflip --autoex --alsadev "hw:1,0" --vfr --avcprofile baseline --avclevel 3.1
HTML元素。我知道移动设备上的iOS不支持媒体源扩展(MSE),这将解释为什么HLS.js不能在我的iPhone上运行。然而," native"移动设备上的HLS支持似乎仍然不支持媒体文件的格式。
我正在使用此picam代码(来自iizukanao)从Pi的相机创建m3u8播放列表和相应的.ts文件。我怀疑m3u8文件没有移动iOS客户端想要的格式。我手动搞砸了m3u8文件,但我没有看到任何积极的影响。我用:
运行picam模块#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
示例m3u8文件:
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
我认为我有基于此Apple FAQ的正确编解码器和ffprobe的输出:
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;
}
}
我使用nginx和此站点配置提供实际的HLS文件:
print(item[OBJECTNAME])
有没有人对我的iPhone为什么认为视频格式不受支持有任何想法?
如果有帮助,我的全部代码都在Github上:(暂不判断我的代码,它还在进行中)
(我用" RPI&#34替换了各种IP地址,主机名和文件名;)