2016-06-15 3 views
-2

サーバマシン上のm3u8ファイルをダウンロードして再生したい。私は次のコードを使用して、m3u8ファイルを読み込んでWebサーバーに送信しています。 ブラウザはファイルの内容をダウンロードする代わりに表示しています。 それでは、ダウンロード方法を教えてください。m3u8ファイルとしてデータをエクスポートするにはどうすればよいですか?

if ((exportHandle = fopen(v3FileName, "a+")) != NULL) { 
    long end = 0, start = 0, pos = 0; 
    char* m3u8FileDataBuff = NULL; 
    fseek(exportHandle, 0, SEEK_END); 
    end = ftell(exportHandle); 
    fseek(exportHandle, 0, SEEK_SET); 
    start = ftell(exportHandle); 
    pos = end - start; 
    m3u8FileDataBuff = (char *) malloc(pos); 
    end = 0; 
    start = 0; 
    fread(m3u8FileDataBuff, 1, pos, exportHandle); 
    pClienCommunication->writeBuffer(m3u8FileDataBuff, pos); 
    free(m3u8FileDataBuff); 
    fclose(exportHandle); 
} 

答えて

0

レスポンスのMIMEタイプが「text/plain」のようにnilであるため、クライアントのWebブラウザがコンテンツを表示しています。 m3u8ファイルのMIMEタイプ(application/x-mpegURLまたはvnd.apple.mpegURL)を示すようにhttp応答ヘッダーを適切に設定します。

あなたが提供したコードは、レスポンスヘッダーのまわりに何も設定していないようです。

pClienCommunication->の利用可能なAPIを確認してください。または、その元の場所に、応答ヘッダーを調整するオプションを教えてください。

これを回避するには、レスポンスを提供するWebサーバーに設定されたルール、特定のURLのMIMEタイプを設定するルール、または応答コンテンツに基づいて設定することもできます(ただし、Webサーバー通常はC++部分で作成されている間にレスポンスを調整する方がコストがかかります)。


なぜ、コード自体がCのようなものであり、そのすべての問題を抱えている場合、このタグ付きC++です。最近のC++では、ファイルラッパークラスのデストラクタで行われるため、 "fclose(..)"のようなことはしません。freadなどで例外が発生した場合にfcloseがスキップされる危険性はありません。 。

だから、現代​​のC++では、これらのものは、多少のようになります。

{ 
    SomeFileClass exportFile(v3FileName, "a+"); 
    if (exportFile.isOK()) { 
     SomeFileContentBuffer data = exportFile.read(); 
     pClienCommunication->writeBuffer(data.asCharPtr(), data.size()); 
    } 
} 

ですから、特定のヘルパークラスのデストラクタがそれを処理するよう(任意のファイルハンドルを解放、またはメモリをバッファリングすることを忘れないことができます)。

関連する問題