我有一个客户端,可以从客户端后端和api流式传输视频。
在客户端后端,视频流有时会通过移动网络故障,而api永远不会发生这种情况。
(。net core v2.0) 这是我在客户端后端上的文件流(现已替换为v2.1):
[HttpGet("ConvertedVideo/{path}")]
public FileStreamResult ConvertedVideo(string path)
{
return FileStreamResult(_fileManager.ConvertedStream(path), "video/mp4");
}
我还在Program.cs
中启用了范围处理
AppContext.SetSwitch("Switch.Microsoft.AspNetCore.Mvc.EnableRangeProcessing", true);
更新到(.net core v2.1)后仍然存在相同的问题:
[HttpGet("ConvertedVideo/{path}")]
public FileStreamResult ConvertedVideo(string path)
{
var stream = _fileManager.ConvertedStream(path);
return File(stream, "video/mp4", path, true);
}
这两种方法都能正常工作,此方法返回成功206,然后根据视频的大小进行几次后续调用(1-3)。
当使用移动网络时,这两种方法都无法在我的手机上使用,通过wifi没问题。
以下是请求标头(为清楚起见,省略了其他标头):
Accept: */*
Accept-Encoding: identity;q=1, *;q=0
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Connection: keep-alive
Range: bytes=0-
这是响应标题:
Accept-Ranges: none
Cache-Control: no-cache
Connection: close
Content-Length: 1247369
Content-Range: bytes 0-1247368/1247369
Content-Type: video/mp4
Date: Sun, 22 Jul 2018 16:27:13 GMT
Pragma: no-cache
Server: Kestrel
X-Powered-By: ASP.NET
这是控制台中的错误:
GET http://example.com/ConvertedVideo/video.mp4 206 (Partial Content)
在“网络”标签中:
net::ERR_CONTENT_LENGTH_MISMATCH
我不明白为什么它不能在移动网络上工作?是因为部分内容而破坏了吗?
编辑:在客户端上流传输视频之前,使用ffmpeg
包装器MediaToolKit
将其转换为较低质量的视频。我怀疑这可能是问题的一部分,但是为什么它可以在wifi上而不是在移动网络上工作?将相同的视频发送到api并从那里流式传输后,可以在wifi和移动设备上正常工作。
api和客户端都托管在IIS共享托管平台上。
PS:这是一个动态创建的html5-video
容器,该src
也是动态生成的,并装有vuejs,我怀疑这可能是原因,但我不明白为什么会这样可以在wifi上工作,但不能在移动网络上工作。
修改:
将客户端项目更新为2.1,仍然是相同的问题。
在iPhone上不会发生此问题。 可以。它可以在Iphone上运行,而不是不起作用。
可在客户端上运行的Api视频流:
[HttpGet("matchvid/{id}/{path}")]
public FileStreamResult Get(string id, string path)
{
return new FileStreamResult(_fileManager.VideoStream(id, path), "video/mp4");
}
这是我读取文件的方式(更改为Path.Combine(type, name)
不能解决问题。):
private FileStream VideoStream(string type, string name)
{
var fileStream = new FileStream($"{type}/{name}",
FileMode.Open,
FileAccess.Read);
return fileStream;
}
我尝试过的其他事情
Accept-Ranges: "bytes"
。编辑:在Firefox移动浏览器上测试的问题:
第一个请求/响应与失败的请求/响应相同。 (起作用的流不以Accept-Ranges开头:“无”)
但是随后FF发出了第二个请求/响应(Chrome中没有这种情况)。
请求:
Accept: video/webm,video/ogg,video/*;q…q=0.7,audio/*;q=0.6,*/*;q=0.5
Accept-Language: en-GB,en;q=0.5
Connection: keep-alive
Range: bytes=8904-
响应:
Accept-Ranges: bytes
Connection: keep-alive
Content-Disposition: attachment; filename=received_…received_1416546955092120.mp4
Content-Length: 1330243
Content-Range: bytes 8904-1339146/1339147
Content-Type: video/mp4
这是随后出现的错误({src
期望video/mp4
,文件流返回video/mp4
,文件是mp4
格式。)< / p>
Media resource <url> could not be decoded.
All candidate resources failed to load. Media load paused.
Media resource <url> could not be decoded, error: Error Code:(0x806e0006) Details: static MP4Metadata::ResultAndByteBuffer mozilla::MP4Metadata::Metadata(mozilla::ByteStream *): Cannot parse metadata
所以现在我遇到了编码错误或部分内容错误。