.Net Core 206移动网络上的部分内容错误

时间:2018-07-22 16:38:33

标签: asp.net-core .net-core http-headers html5-video filestream

我有一个客户端,可以从客户端后端和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

所以现在我遇到了编码错误或部分内容错误。

0 个答案:

没有答案