IOSクライアント(ASP.NET WEB API 2で開発されたサーバー)のストリーミングビデオに関する問題

ヴィオレッタ

ビデオのストリーミングに問題があります。ASP.NET Web API 2でサーバーを開発し、次の2つの方法を実装しました。

最初の方法:

if (Request.Headers.Range != null)
    {
        try
        {
            var httpResponce = Request.CreateResponse();
            httpResponce.Content =
                new PushStreamContent((Action<Stream, HttpContent, TransportContext>) WriteContentToStream);

            return httpResponce;
        }
        catch (Exception ex)
        {
            return new HttpResponseMessage(HttpStatusCode.InternalServerError);
        }
    }
    else
    {
        return new HttpResponseMessage(HttpStatusCode.RequestedRangeNotSatisfiable);
    }

/*method for streaming*/

private async void WriteContentToStream(Stream outputStream, HttpContent content, TransportContext transportContext)
{
    string relativeFilePath = "~/App_Data/Videos/4.mp4";
    try
    {
        var filePath = System.Web.Hosting.HostingEnvironment.MapPath(relativeFilePath);

        int bufferSize = 1000;
        byte[] buffer = new byte[bufferSize];
        using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            int totalSize = (int)fileStream.Length;
            while (totalSize > 0)
            {
                int count = totalSize > bufferSize ? bufferSize : totalSize;
                int sizeOfReadedBuffer = fileStream.Read(buffer, 0, count);
                await outputStream.WriteAsync(buffer, 0, sizeOfReadedBuffer);
                totalSize -= sizeOfReadedBuffer;
            }
        }
    }
    catch (HttpException ex)
    {
        if (ex.ErrorCode == -2147023667)  
        {
            return;
        }
    }
    finally
    {
        outputStream.Close();
    }
}

2)2番目の方法:

public HttpResponseMessage Test()
{
    if (Request.Headers.Range != null)
    {
        try 
        {
            string relativeFilePath = "~/App_Data/Videos/4.mp4";
            var filePath = System.Web.Hosting.HostingEnvironment.MapPath(relativeFilePath);
            HttpResponseMessage partialResponse = Request.CreateResponse(HttpStatusCode.PartialContent);
            partialResponse.Headers.AcceptRanges.Add("bytes");
            var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
            partialResponse.Content = new ByteRangeStreamContent(stream, Request.Headers.Range, new MediaTypeHeaderValue("video/mp4")); 
            return partialResponse;
        }
        catch (Exception)
        {
            return new HttpResponseMessage(HttpStatusCode.InternalServerError);
        }
    }   
    else
    {
        return new HttpResponseMessage(HttpStatusCode.RequestedRangeNotSatisfiable);    
    }
}

これらの方法はどちらもWebクライアントとAndroidクライアントで機能しましたが、iOSクライアントはビデオを表示しません。

その問題は、ビデオのコーデック(ただし、Appleを推奨するコーデックを使用)またはhttpヘッダーにある可能性があると思います。

アレックスライン

私はこれを解決しましたが、それはContent-Lengthヘッダーに(iOSが考えていた)無効な値があったためです。

私の解決策は上記の方法#2に基づいていました...これが実際に機能した私のコードの重要な部分です。

if (!file.Exists) {
    response.StatusCode = HttpStatusCode.NotFound;
    response.ReasonPhrase = "Deleted";
} else {
    var range = Request.Headers.Range?.Ranges?.FirstOrDefault();
    if (range == null) {
        using (var stream = new MemoryStream()) {
            using (var video = file.OpenRead()) await video.CopyToAsync(stream);
            response.Content = new ByteArrayContent(stream.ToArray());
        }
        response.Content.Headers.ContentType = new MediaTypeHeaderValue("video/mp4");
        response.Content.Headers.ContentLength = file.Length;
    } else {
        var stream = new MemoryStream();
        using (var video = file.OpenRead()) await video.CopyToAsync(stream);
        response.Content = new ByteRangeStreamContent(
            stream,
            new RangeHeaderValue(range.From, range.To),
            new MediaTypeHeaderValue("video/mp4")
        );
        //  response.Content.Headers.ContentLength = file.Length;
        // this is what makes iOS work
        response.Content.Headers.ContentLength = (range.To.HasValue ? range.To.Value + 1 : file.Length) - (range.From ?? 0);
    }
    response.StatusCode = HttpStatusCode.OK;
}

範囲を処理するときは、おそらくHTTP 206(部分コンテンツ)ステータスにする必要がありますが、解決策を考え出す前に、ほぼ2日間これに取り組んでいました。

私がまだ完全に追跡していない唯一の問題は、時々、Application_EndRequestこれらのいくつかに対して発火しないということです。エンドポイントから送信された応答をログに記録することはできますが、iOSがどこかで接続を切断し、内部でタイムアウトするまで要求がハングするようなものです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Asp.net Web API 2WebクライアントとWebサーバー開発の分離

分類Dev

AzureSignalRサービス| Asp.Net Web Api | コンソールクライアント

分類Dev

ASP.NET CORE Web APIでクライアントIPアドレスを取得する際に問題が発生しましたか?

分類Dev

Asp.netWebアプリケーションとAsp.netWeb API2の間のセッションの共有(Asp.net Web API2は、1つの構成にアクセスするAsp.net Webアプリでホストされます)

分類Dev

asp.net core 1.0 Web APIのスタートアップサービスでバックグラウンドタスクを作成するにはどうすればよいですか?

分類Dev

log4javascriptを使用してクライアント側のログをサーバー(Asp.net Web API)に送信できません

分類Dev

ASP.NET Web APIサイトの仮想ディレクトリにアクセスできますが、コントローラーアクションはHTTP503を返します

分類Dev

Asp Net Web API 2.1はクライアントIPアドレスを取得します

分類Dev

.netコアWebアプリケーションプロジェクトを使用して、AzureでタイプAPIアプリのアプリサービスを開発およびデプロイします

分類Dev

ASP.NET Web API 2は、継承された属性ルートアクションをオーバーライドし、複数のアクションが見つかりました

分類Dev

ASP.NET Web API(.NET Core 3.1)でのエンドポイントルーティングの問題

分類Dev

ASP.net Web API:リクエストごとにコントローラーが作成されるのはなぜですか?

分類Dev

ASP.NET Web Api2ルーティングの問題

分類Dev

ASP.NET Web APIサービス(ASP.NET 4.6)の外部APIエンドポイントの保護

分類Dev

ASP.NET Core Web APIクライアントは、IdentityServerインスタンスで使用される自己署名証明書を信頼しません

分類Dev

ASP.NET WEB APIサーバーに保存されている認証トークンに関する情報はどこにありますか?

分類Dev

.NET 2.0アプリケーションによって生成されたWSDLからJDKツールwsimportを使用してJava SOAP Webサービスクライアントを生成する際の問題

分類Dev

ASP.NET Core App Service Web APIは、AADベアラートークンとクライアント証明書認証の両方をどのようにサポートできますか?

分類Dev

ASP.NET Web-apiコア:クライアント接続の問題を処理し、競合を見つける

分類Dev

ASP.NET Web APIは、マップされたコントローラーではなく物理ディレクトリを提供しようとします

分類Dev

インストールされた ASP.NET Web API 用の Unity ブートストラップ - 「AccountController」タイプのコントローラーを作成しようとしたときにエラーが発生しました

分類Dev

ASP.NET Webアプリでサーバーとクライアント間で通信するにはどうすればよいですか?

分類Dev

Windows認証を使用した有効なCORSASP.NET Web API2アプリケーションでのプリフライトリクエスト

分類Dev

ASP.NET Web / APIアプリでCookieとJWTトークンの両方を使用する

分類Dev

WebクライアントからAPIサーバーへのクロスオリジンリクエスト

分類Dev

ASP.NET Core 2.1Webクライアントのベアラトークンを格納する場所

分類Dev

ASP.NET Web API 2とOwinを使用したトークンベースの認証により、401が不正にスローされます

分類Dev

「Windowsデスクトップクラスライブラリ」テンプレートを使用して、複数のASP.NET Webアプリケーションで使用されるクラスライブラリを作成できますか?

分類Dev

インストーラーがASP.NETのWebサーバーにある場合は、アプリケーションをクライアントにインストールします

Related 関連記事

  1. 1

    Asp.net Web API 2WebクライアントとWebサーバー開発の分離

  2. 2

    AzureSignalRサービス| Asp.Net Web Api | コンソールクライアント

  3. 3

    ASP.NET CORE Web APIでクライアントIPアドレスを取得する際に問題が発生しましたか?

  4. 4

    Asp.netWebアプリケーションとAsp.netWeb API2の間のセッションの共有(Asp.net Web API2は、1つの構成にアクセスするAsp.net Webアプリでホストされます)

  5. 5

    asp.net core 1.0 Web APIのスタートアップサービスでバックグラウンドタスクを作成するにはどうすればよいですか?

  6. 6

    log4javascriptを使用してクライアント側のログをサーバー(Asp.net Web API)に送信できません

  7. 7

    ASP.NET Web APIサイトの仮想ディレクトリにアクセスできますが、コントローラーアクションはHTTP503を返します

  8. 8

    Asp Net Web API 2.1はクライアントIPアドレスを取得します

  9. 9

    .netコアWebアプリケーションプロジェクトを使用して、AzureでタイプAPIアプリのアプリサービスを開発およびデプロイします

  10. 10

    ASP.NET Web API 2は、継承された属性ルートアクションをオーバーライドし、複数のアクションが見つかりました

  11. 11

    ASP.NET Web API(.NET Core 3.1)でのエンドポイントルーティングの問題

  12. 12

    ASP.net Web API:リクエストごとにコントローラーが作成されるのはなぜですか?

  13. 13

    ASP.NET Web Api2ルーティングの問題

  14. 14

    ASP.NET Web APIサービス(ASP.NET 4.6)の外部APIエンドポイントの保護

  15. 15

    ASP.NET Core Web APIクライアントは、IdentityServerインスタンスで使用される自己署名証明書を信頼しません

  16. 16

    ASP.NET WEB APIサーバーに保存されている認証トークンに関する情報はどこにありますか?

  17. 17

    .NET 2.0アプリケーションによって生成されたWSDLからJDKツールwsimportを使用してJava SOAP Webサービスクライアントを生成する際の問題

  18. 18

    ASP.NET Core App Service Web APIは、AADベアラートークンとクライアント証明書認証の両方をどのようにサポートできますか?

  19. 19

    ASP.NET Web-apiコア:クライアント接続の問題を処理し、競合を見つける

  20. 20

    ASP.NET Web APIは、マップされたコントローラーではなく物理ディレクトリを提供しようとします

  21. 21

    インストールされた ASP.NET Web API 用の Unity ブートストラップ - 「AccountController」タイプのコントローラーを作成しようとしたときにエラーが発生しました

  22. 22

    ASP.NET Webアプリでサーバーとクライアント間で通信するにはどうすればよいですか?

  23. 23

    Windows認証を使用した有効なCORSASP.NET Web API2アプリケーションでのプリフライトリクエスト

  24. 24

    ASP.NET Web / APIアプリでCookieとJWTトークンの両方を使用する

  25. 25

    WebクライアントからAPIサーバーへのクロスオリジンリクエスト

  26. 26

    ASP.NET Core 2.1Webクライアントのベアラトークンを格納する場所

  27. 27

    ASP.NET Web API 2とOwinを使用したトークンベースの認証により、401が不正にスローされます

  28. 28

    「Windowsデスクトップクラスライブラリ」テンプレートを使用して、複数のASP.NET Webアプリケーションで使用されるクラスライブラリを作成できますか?

  29. 29

    インストーラーがASP.NETのWebサーバーにある場合は、アプリケーションをクライアントにインストールします

ホットタグ

アーカイブ