问题描述
我们正在努力设置服务器以在Android上使用react-native-video
流式传输视频。所有要流传输的文件均为.MP4
格式,并且大小与50-100 MB
不同。我无法提供用于复制或共享任何MP4
文件的URL。我已经尝试过Android播放器和Exoplayer,但在我们讲话时并没有寻找视频。
对于小型视频,似乎没有问题,因为服务器从播放器收到带有以下标头的HTTP请求:
{
"name":"test.mp4","User-Agent":"stagefright/1.2 (Linux;Android 10)","Connection":"close","X-Forwarded-Proto":"https","X-Forwarded-For":**********,"Host":**********,"Accept-Encoding":"gzip","ssl_session_id":**********,}
我们将提供test.mp4
文件。在这种情况下,即使我们在服务器端遇到以下错误,因为react-native-video
再次发送相同的相同HTTP请求,但一切都在客户端起作用(视频正常播放)。 为什么发送多个请求?
Failed to handle request.: java.io.IOException: Broken pipe
....
Failed to send error response: java.lang.IllegalStateException: UT010019: Response already commited
对于两个相同的请求,我们返回一个响应,其中文件内容为正文,200 STATUS OK
和以下标头:
{
"Server": "nginx","Date": <date>,"Content-Length": <length in bytes>,"Connection": "keep-alive","Expires": 0,"Cache-Control": "no-cache,no-store,max-age=0,must-revalidate","Pragma": "no-cache","Content-Disposition": "attachment; filename="test.mp4",}
react-native-video
希望使用哪种标题?
当文件变大(〜{100 MB
)时,情况会改变。 react-native-video
在某个时候开始发送range requests。 何时?但是,第一个请求没有Range
标头参数,与之前的参数相同。与往常一样,我们发送相同的响应并产生相同的错误。但是,从那里开始,播放器开始发送与上述请求类似的重复范围请求,但带有Range
标头参数,如下所示:
{
...,"Range":"bytes=1752325-"
}
以下所有请求都遵循相同的模式:bytes=<start-bytes>-
,这意味着从某个值到结束都请求字节。每次新请求时,值<start-bytes>
都会增加(有时会有多次具有相同值的请求)。 为什么它一遍又一遍地请求相同的字节,而不要求特定的范围?
我们的服务器支持范围请求,因此会以有效的文件数据进行响应,
206 STATUS PARTIAL CONTENT
和带有以下附加内容的相同标题(例如,值):
{
....,"Content-Range": "bytes 0-11546/115461173"
}
react-native-video
期望什么类型的响应?
对于这些范围请求,服务器也会产生上述错误,并且视频经常在客户端冻结几分钟。一段时间后,视频开始正常播放,并且服务器端未出现错误。
我有几个困惑的问题以粗体标出。同样,我也找不到任何文档来描述与播放器的通信方式,以及它发送和期望什么样的请求。
是否有任何描述协议的文档,或者您在这里可能暗示我做错了什么?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)