2012-04-17 4 views
2

多くの人が試したように、HTTP経由でストリーミングするライブメディアサーバー用のソケットを使用して、成功した。誰でも私を案内したり、HTTP経由でストリーミングするライブメディアサーバーのクライアントを作成する方法を提案することができます

#define WIN32_LEAN_AND_MEAN 

#include <windows.h> 
#include <winsock2.h> 
#include <ws2tcpip.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include<conio.h> 


// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib 
#pragma comment (lib, "Ws2_32.lib") 
#pragma comment (lib, "Mswsock.lib") 
#pragma comment (lib, "AdvApi32.lib") 

//************All Declarations**********// 
#define DEFAULT_BUFLEN 512000 
#define DEFAULT_PORT "8000" 

int __cdecl main(int argc, char **argv) 
{ 
    WSADATA wsaData; 
    SOCKET ConnectSocket = INVALID_SOCKET; 
    struct addrinfo *result = NULL, 
     *ptr = NULL, 
     hints; 
    char *sendbuf = "this is a test"; 
    char recvbuf[DEFAULT_BUFLEN]; 
    int iResult; 
    int recvbuflen = DEFAULT_BUFLEN; 

    // Validate the parameters 
    if (argc != 2) { 
     printf("usage: %s server-name\n", argv[0]); 
     getch(); 
     return 1; 
    } 

    // Initialize Winsock 
    iResult = WSAStartup(MAKEWORD(2,2), &wsaData); 
    if (iResult != 0) { 
     printf("WSAStartup failed with error: %d\n", iResult); 
     getch(); 
     return 1; 
    } 

    ZeroMemory(&hints, sizeof(hints)); 
    hints.ai_family = AF_UNSPEC; 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_protocol = IPPROTO_TCP; 

    // Resolve the server address and port 
    iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result); 
    if (iResult != 0) { 
     printf("getaddrinfo failed with error: %d\n", iResult); 
     WSACleanup(); 
     getch(); 
     return 1; 
    } 

    // Attempt to connect to an address until one succeeds 
    for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) { 

     // Create a SOCKET for connecting to server 
     ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, 
      ptr->ai_protocol); 
     if (ConnectSocket == INVALID_SOCKET) { 
      printf("socket failed with error: %ld\n", WSAGetLastError()); 
      WSACleanup(); 
      getch(); 
      return 1; 
     } 

     // Connect to server. 
     iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); 
     if (iResult == SOCKET_ERROR) { 
      closesocket(ConnectSocket); 
      ConnectSocket = INVALID_SOCKET; 
      continue; 
     } 
     break; 
    } 

    freeaddrinfo(result); 

    if (ConnectSocket == INVALID_SOCKET) { 
     printf("Unable to connect to server!\n"); 
     WSACleanup(); 
     getch(); 
     return 1; 
    } 

    // Send an initial buffer 
    /*iResult = send(ConnectSocket, sendbuf, (int)strlen(sendbuf), 0); 
    if (iResult == SOCKET_ERROR) { 
     printf("send failed with error: %d\n", WSAGetLastError()); 
     closesocket(ConnectSocket); 
     WSACleanup(); 
     getch(); 
     return 1; 
    }*/ 

    printf("Bytes Sent: %ld\n", iResult); 

    // shutdown the connection since no more data will be sent 
    iResult = shutdown(ConnectSocket, SD_SEND); 
    if (iResult == SOCKET_ERROR) { 
     printf("shutdown failed with error: %d\n", WSAGetLastError()); 
     closesocket(ConnectSocket); 
     WSACleanup(); 
     getch(); 
     return 1; 
    } 

    // Receive until the peer closes the connection 
    do { 

     iResult = recv(ConnectSocket, recvbuf, DEFAULT_BUFLEN, 0); 
     if (iResult > 0) 
      printf("Bytes received: %d\n", iResult); 
     else if (iResult == 0) 
      printf("Connection closed\n"); 
     else 
      printf("recv failed with error: %d\n", WSAGetLastError()); 

    } while(iResult > 0); 


    // cleanup 
    getch(); 
    closesocket(ConnectSocket); 
    WSACleanup(); 


    return 0; 
} 

私は上記のコードを試しましたが、私が作成するサーバーでうまく動作します。問題は、http経由でライブメディアサーバーからトランスポートストリームファイルをストリーミングすることです。クライアントのコードからデータを受信しようとすると、特定のURLに接続できますが、何も受信できませんでした。

答えて

2

最も簡単な解決策は、のopenRTSPクライアントを開始点として使用することです。 RTSPスタック全体を実装するだけでなく、TCP接続を介してメディアをインターリーブすることにはほとんど変わりません。コマンドラインパラメータとして "-T"を渡すことで、openRTSPをTCP over RTSPでストリーミングするように設定できます。 openRTSPに基づいて独自のアプリケーションを作成し、必要に応じて受信したメディアサンプルを処理することができます。

に対しては、この機能をソケットレベルから実装することをお勧めします。 RTSP、RTP、RTCP、RTP over HTTPトンネリング、SDP、さまざまなRTPペイロードフォーマットを実装する必要があります。 H.264の場合上のソケット関連のコードセグメントはサーフェスに接触しません。

プロトコル交換がどのようになっているかを確認するには、wiresharkを使用してopenRTSPからRTSPサーバへのトラフィックを傍受します。 liveMediaでRTSPサーバーを見つけることもできます。

0

HTTPを介している場合は、まずHTTPリクエストを送信してから応答を解析する必要があります。 Example

サーバーが要求を待機しているため、何も受信しません。

+0

私にこの擬似コードを教えてもらえますか? – Harry

+0

擬似コードまたは上記のコードを変更してください – Harry

関連する問題