Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何从iOS应用程序使用实时流协议(RTSP)连接到媒体服务器?_Iphone_Ios_Video Streaming_Rtsp - Fatal编程技术网

Iphone 如何从iOS应用程序使用实时流协议(RTSP)连接到媒体服务器?

Iphone 如何从iOS应用程序使用实时流协议(RTSP)连接到媒体服务器?,iphone,ios,video-streaming,rtsp,Iphone,Ios,Video Streaming,Rtsp,我不熟悉iOS编程,也不熟悉iPhone应用程序,可以捕获视频并通过媒体服务器实时传输。我从中获得了一个示例代码。 但这段代码使iPhone成为RTSP服务器,媒体服务器必须从iPhone中提取流。尽管目前的设置运行良好,但我希望iPhone将实时流推送到媒体服务器,因为我相信服务器不会试图从所有iPhone用户那里获取实时流。连接应该是另一种方式,以使其工作(纠正我,如果我错了)。 请告诉我做这件事的正确方法。还请告诉我,苹果公司提供了哪些框架或内置功能,可用于将实时流发送到服务器,使iPho

我不熟悉iOS编程,也不熟悉iPhone应用程序,可以捕获视频并通过媒体服务器实时传输。我从中获得了一个示例代码。 但这段代码使iPhone成为RTSP服务器,媒体服务器必须从iPhone中提取流。尽管目前的设置运行良好,但我希望iPhone将实时流推送到媒体服务器,因为我相信服务器不会试图从所有iPhone用户那里获取实时流。连接应该是另一种方式,以使其工作(纠正我,如果我错了)。 请告诉我做这件事的正确方法。还请告诉我,苹果公司提供了哪些框架或内置功能,可用于将实时流发送到服务器,使iPhone作为客户端工作并启动连接

请检查代码:

头文件

#import <Foundation/Foundation.h>
#import "RTSPServer.h"

@interface RTSPClientConnection : NSObject


+ (RTSPClientConnection*) createWithSocket:(CFSocketNativeHandle) s server:(RTSPServer*) server;

- (void) onVideoData:(NSArray*) data time:(double) pts;
- (void) shutdown;

@end
#import "RTSPClientConnection.h"
#import "RTSPMessage.h"
#import "NALUnit.h"
#import "arpa/inet.h"

void tonet_short(uint8_t* p, unsigned short s)
{
//Code
}
void tonet_long(uint8_t* p, unsigned long l)
{
//Code
}

static const char* Base64Mapping = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static const int max_packet_size = 1200;

NSString* encodeLong(unsigned long val, int nPad)
{
//Code
}

NSString* encodeToBase64(NSData* data)
{
//Code
}

enum ServerState
{
ServerIdle,
Setup,
Playing,
};

@interface RTSPClientConnection ()
{
CFSocketRef _s;
RTSPServer* _server;
CFRunLoopSourceRef _rls;

CFDataRef _addrRTP;
CFSocketRef _sRTP;
CFDataRef _addrRTCP;
CFSocketRef _sRTCP;
NSString* _session;
ServerState _state;
long _packets;
long _bytesSent;
long _ssrc;
BOOL _bFirst;

// time mapping using NTP
uint64_t _ntpBase;
uint64_t _rtpBase;
double _ptsBase;

// RTCP stats
long _packetsReported;
long _bytesReported;
NSDate* _sentRTCP;

// reader reports
CFSocketRef _recvRTCP;
CFRunLoopSourceRef _rlsRTCP;
}

- (RTSPClientConnection*) initWithSocket:(CFSocketNativeHandle) s Server:(RTSPServer*) server;
- (void) onSocketData:(CFDataRef)data;
- (void) onRTCP:(CFDataRef) data;

@end

static void onSocket (
           CFSocketRef s,
           CFSocketCallBackType callbackType,
           CFDataRef address,
           const void *data,
           void *info
           )
{
    RTSPClientConnection* conn = (__bridge RTSPClientConnection*)info;
    switch (callbackType)
    {
    case kCFSocketDataCallBack:
        [conn onSocketData:(CFDataRef) data];
        break;

    default:
        NSLog(@"unexpected socket event");
        break;
    }

}

static void onRTCP(CFSocketRef s,
               CFSocketCallBackType callbackType,
               CFDataRef address,
               const void *data,
               void *info
               )
{
    RTSPClientConnection* conn = (__bridge RTSPClientConnection*)info;
    switch (callbackType)
    {
    case kCFSocketDataCallBack:
        [conn onRTCP:(CFDataRef) data];
        break;

    default:
        NSLog(@"unexpected socket event");
        break;
    }
}

@implementation RTSPClientConnection

+ (RTSPClientConnection*) createWithSocket:(CFSocketNativeHandle) s server:(RTSPServer*) server
{
RTSPClientConnection* conn = [RTSPClientConnection alloc];
if ([conn initWithSocket:s Server:server] != nil)
{
    return conn;
}
return nil;
}

- (RTSPClientConnection*) initWithSocket:(CFSocketNativeHandle)s Server:(RTSPServer *)server
{
_state = ServerIdle;
_server = server;
CFSocketContext info;
memset(&info, 0, sizeof(info));
info.info = (void*)CFBridgingRetain(self);

_s = CFSocketCreateWithNative(nil, s, kCFSocketDataCallBack, onSocket, &info);

_rls = CFSocketCreateRunLoopSource(nil, _s, 0);
CFRunLoopAddSource(CFRunLoopGetMain(), _rls, kCFRunLoopCommonModes);

return self;
}

- (void) onSocketData:(CFDataRef)data
{
    //Code
}

- (NSString*) makeSDP
{
    //Code
}

- (void) onVideoData:(NSArray*) data time:(double) pts
{
    //Code
}

- (void) writeHeader:(uint8_t*) packet marker:(BOOL) bMarker time:(double) pts
{
    //Code
}

- (void) sendPacket:(uint8_t*) packet length:(int) cBytes
{
    //Code
}

- (void) onRTCP:(CFDataRef) data
{
// NSLog(@"RTCP recv");
}

- (void) tearDown
{
    // Code
}

- (void) shutdown
{
[self tearDown];
@synchronized(self)
{
    CFSocketInvalidate(_s);
    _s = nil;
}
}
@end

谢谢。

过去4个月我一直在做这件事,没有简单的方法。 您必须编写自己的RTCP协议


编辑:我听说过RTPDump,但我从未尝试过

您在这方面有过成功吗。我将尝试同样的方法,并且可以使用一些指针。我制作了一个功能性的实时流媒体库,连接到Wowza流媒体引擎,所以是的,这是可能的。是的,这就是我试图做的。我正在尝试创建与wowza应用程序的远程套接字连接。这是最好的路线还是你想出了更好的方法?我还不走运。