首页 > 解决方案 > .Net Core 206 移动网络上的部分内容错误

问题描述

我有一个客户端,它从客户端后端和一个 api 流式传输视频。

在客户端后端,视频流有时会在移动网络上发生故障,而 api 永远不会发生这种情况。

(.net core v2.0)这是我在客户端后端的文件流(现在替换为 v2.1):

[HttpGet("ConvertedVideo/{path}")]
public FileStreamResult ConvertedVideo(string path)
{
    return FileStreamResult(_fileManager.ConvertedStream(path), "video/mp4");
}

我还在我的Program.cswith 中启用了范围处理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

我不明白为什么它不能在移动网络上运行?是因为它是部分内容而破坏吗?

编辑:在客户端上流式传输视频之前,使用ffmpegwrapper:将其转换为较低质量MediaToolKit。我怀疑这可能是问题的一部分,但为什么它可以在 wifi 而不是移动网络上工作?在将相同的视频发送到 api 并从那里流式传输之后,在 wifi 和移动设备上都可以正常工作。

api 和客户端都托管在 IIS 共享托管平台上。

PS:它是一个动态创建的html5-video容器,src也是动态生成的,并且加载了 vuejs,我怀疑这可能是原因,但我不明白为什么它可以在 wifi 上工作,而不是在移动网络上工作。

编辑:

将客户端项目更新到 2.1,仍然是同样的问题。

在 iPhone 上不会出现此问题。 确实如此。它在 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;
}

我尝试过的其他事情

编辑:Firefox 移动浏览器上的测试问题:

第一个请求/响应与失败的请求/响应相同。(工作的流不以 Accept-Ranges: "none" 开头)

但随后 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格式。)

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

所以现在我有一个编码错误或部分内容错误。

标签: asp.net-core.net-corehttp-headershtml5-videofilestream

解决方案


推荐阅读