Advertisement
Guest User

Untitled

a guest
Jul 29th, 2014
653
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //
  2. //  ViewController.m
  3. //  RTMPStreamComeback
  4. //
  5. //  Created by Vyacheslav Vdovichenko on 11/13/12.
  6. //  Copyright (c) 2012 The Midnight Coders, Inc. All rights reserved.
  7. //
  8.  
  9. #import "ViewController.h"
  10. #import "AppDelegate.h"
  11. #import "DEBUG.h"
  12. #import "MemoryTicker.h"
  13. #import "BroadcastStreamClient.h"
  14. #import "MediaStreamPlayer.h"
  15. #import "VideoPlayer.h"
  16.  
  17.  
  18. //static NSString *host = @"rtmp://10.0.1.33:1935/live";
  19. //static NSString *host = @"rtmp://192.168.2.63:1935/live";
  20. //static NSString *host = @"rtmp://192.168.2.101:1935/live";
  21. static NSString *host = @"rtmp://192.168.1.5/RED5Hugt";
  22. //static NSString *host = @"rtmp://192.168.2.101:1935/live";
  23. //static NSString *host = @"rtmp://80.74.155.7/live";
  24. //static NSString *host = @"rtmp://mediaone.entrago.com:1935/videochat";
  25. //static NSString *host = @"rtmp://wz.glauco.it:1935/videochat";
  26.  
  27. //static NSString *stream = @"outgoingaudio_c11";
  28. //static NSString *stream = @"myStream";
  29. static NSString *stream = @"slavav";
  30.  
  31. // cross stream mode
  32. //static BOOL isCrossStreams = NO;
  33. static BOOL isCrossStreams = YES;
  34.  
  35.  
  36. @interface ViewController () <MPIMediaStreamEvent> {
  37.    
  38.     MemoryTicker            *memoryTicker;
  39.     FramesPlayer            *screen;
  40.    
  41.     RTMPClient              *socket;
  42.     BroadcastStreamClient   *upstream;
  43.     MediaStreamPlayer       *player;
  44.    
  45.     int                     upstreamCross;
  46.     int                     downstreamCross;
  47.    
  48.     UIActivityIndicatorView *netActivity;
  49. }
  50.  
  51. -(void)sizeMemory:(NSNumber *)memory;
  52. -(void)setDisconnect;
  53. @end
  54.  
  55.  
  56. @implementation ViewController
  57.  
  58. #pragma mark -
  59. #pragma mark  View lifecycle
  60.  
  61. -(void)viewDidLoad {
  62.    
  63.     //[DebLog setIsActive:YES];
  64.    
  65.     [super viewDidLoad];
  66.    
  67.     memoryTicker = [[MemoryTicker alloc] initWithResponder:self andMethod:@selector(sizeMemory:)];
  68.     memoryTicker.asNumber = YES;
  69.  
  70.     socket = nil;
  71.     upstream = nil;
  72.     player = nil;
  73.    
  74.     echoCancellationOn;
  75.    
  76.     upstreamCross = isCrossStreams ? ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad ? 2 : 1) : 0;
  77.     downstreamCross = isCrossStreams ? ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad ? 1 : 2) : 0;
  78.    
  79.     // Create and add the activity indicator
  80.     netActivity = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
  81.     netActivity.center = CGPointMake(160.0f, 200.0f);
  82.     [self.view addSubview:netActivity];
  83. }
  84.  
  85. -(void)didReceiveMemoryWarning {
  86.     [super didReceiveMemoryWarning];
  87.     // Dispose of any resources that can be recreated.
  88. }
  89.  
  90. -(NSUInteger)supportedInterfaceOrientations {
  91.     return UIInterfaceOrientationMaskPortrait;
  92. }
  93.  
  94. #pragma mark -
  95. #pragma mark Private Methods
  96.  
  97. // MEMORY
  98.  
  99. -(void)sizeMemory:(NSNumber *)memory {
  100.     memoryLabel.text = [NSString stringWithFormat:@"%d", [memory intValue]];
  101. }
  102.  
  103. // ALERT
  104.  
  105. -(void)showAlert:(NSString *)message {
  106.     dispatch_async(dispatch_get_main_queue(), ^(void) {
  107.         UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Receive" message:message delegate:self
  108.                                            cancelButtonTitle:@"Ok" otherButtonTitles:nil];
  109.         [av show];
  110.     });
  111. }
  112.  
  113. -(void)doConnect {
  114.    
  115.     NSString *name = [NSString stringWithFormat:@"%@%d", stream, upstreamCross];
  116.    
  117.     if (!socket) {
  118.         socket = [[RTMPClient alloc] init:host];
  119.         if (!socket) {
  120.             [self showAlert:@"Socket has not be created"];
  121.             return;
  122.         }
  123.        
  124.         [socket spawnSocketThread];
  125.     }
  126.    
  127.     upstream = [[BroadcastStreamClient alloc] initWithClient:socket resolution:RESOLUTION_LOW];
  128.     //upstream = [[BroadcastStreamClient alloc] initOnlyAudioWithClient:socket];
  129.     //upstream = [[BroadcastStreamClient alloc] initOnlyVideoWithClient:socket resolution:RESOLUTION_LOW];
  130.    
  131.     //[upstream setVideoBitrate:12000];
  132.     //[upstream setAudioBitrate:4000];
  133.    
  134.     upstream.delegate = self;
  135.     [upstream stream:@"tester" publishType:PUBLISH_LIVE];
  136.        
  137.     [netActivity startAnimating];
  138.    
  139.     btnConnect.title = @"Disconnect";
  140.     streamView.hidden = NO;
  141.  
  142. }
  143.  
  144. -(void)doPlay {
  145.    
  146.     NSString *name = [NSString stringWithFormat:@"%@%d", stream, downstreamCross];
  147.    
  148.     screen = [[FramesPlayer alloc] initWithView:streamView];
  149.     screen.orientation = UIImageOrientationRight;
  150.    
  151.     player = [[MediaStreamPlayer alloc] initWithClient:socket];
  152.     player.delegate = self;
  153.     player.player = screen;
  154.     [player stream:@"tester"];
  155.    
  156.     btnPublish.title = @"Pause";
  157.     btnToggle.enabled = YES;
  158. }
  159.  
  160. -(void)doDisconnect {
  161.     [player disconnect];
  162.     [upstream disconnect];
  163. }
  164.  
  165. -(void)setDisconnect {
  166.    
  167.     screen = nil;
  168.     player = nil;
  169.    
  170.     [upstream teardownPreviewLayer];
  171.     upstream = nil;
  172.    
  173.     [socket disconnect];
  174.     socket = nil;
  175.    
  176.     [netActivity stopAnimating];
  177.    
  178.     btnConnect.title = @"Connect";
  179.     btnToggle.enabled = NO;
  180.     btnPublish.title = @"Start";
  181.     btnPublish.enabled = NO;
  182.    
  183.     streamView.hidden = YES;
  184. }
  185.  
  186. -(void)sendMetadata {
  187.    
  188.     NSString *camera = upstream.isUsingFrontFacingCamera ? @"FRONT" : @"BACK";
  189.     NSDate *date = [NSDate date];
  190.     NSDictionary *meta = [NSDictionary dictionaryWithObjectsAndKeys:camera, @"camera", [date description], @"date", nil];
  191.     [upstream sendMetadata:meta event:@"changedCamera:"];
  192. }
  193.  
  194. #pragma mark -
  195. #pragma mark Public Methods
  196.  
  197. // ACTIONS
  198.  
  199. -(IBAction)connectControl:(id)sender {
  200.    
  201.     NSLog(@"connectControl: host = %@", host);
  202.    
  203.     (streamView.hidden) ? [self doConnect] : [self doDisconnect];
  204. }
  205.  
  206. -(IBAction)publishControl:(id)sender {
  207.    
  208.     NSLog(@"publishControl: stream = %@", stream);
  209.    
  210.     if (isCrossStreams)
  211.         player ? ((player.state != STREAM_PLAYING ? [player start] : [player pause])) : [self doPlay];
  212.     else
  213.         (upstream.state != STREAM_PLAYING) ? [upstream start] : [upstream pause];
  214. }
  215.  
  216. -(IBAction)camerasToggle:(id)sender {
  217.    
  218.     NSLog(@"camerasToggle:");
  219.    
  220.     if (upstream.state != STREAM_PLAYING)
  221.         return;
  222.    
  223.     [upstream switchCameras];
  224.    
  225.     [self sendMetadata];
  226. }
  227.  
  228. #pragma mark -
  229. #pragma mark MPIMediaStreamEvent Methods
  230.  
  231. -(void)stateChanged:(id)sender state:(MPMediaStreamState)state description:(NSString *)description {
  232.    
  233.     NSLog(@" $$$$$$ <MPIMediaStreamEvent> stateChangedEvent: sender = %@, %d = %@", [sender class], (int)state, description);
  234.    
  235.     if (sender == upstream) {
  236.        
  237.         switch (state) {
  238.                
  239.             case CONN_DISCONNECTED: {
  240.                
  241.                 [self setDisconnect];
  242.                  
  243.                 break;
  244.             }
  245.                
  246.             case CONN_CONNECTED: {
  247.                
  248.                 if (![description isEqualToString:MP_RTMP_CLIENT_IS_CONNECTED])
  249.                     break;
  250.  
  251.                 [upstream start];
  252.                
  253.                 btnPublish.enabled = YES;
  254.                
  255.                 break;
  256.             }
  257.                
  258.             case STREAM_PAUSED: {
  259.                
  260.                 if (player)
  261.                     [player pause];
  262.                
  263.                 btnPublish.title = @"Start";
  264.                 btnToggle.enabled = NO;
  265.                
  266.                 break;
  267.             }
  268.                
  269.             case STREAM_PLAYING: {
  270.                
  271.                 [self sendMetadata];
  272.                
  273.                 if (!isCrossStreams)
  274.                     [self doPlay];
  275.                
  276.                 break;
  277.             }
  278.                
  279.             default:
  280.                 break;
  281.         }
  282.     }
  283.    
  284.     if (sender == player) {
  285.        
  286.         switch (state) {
  287.                
  288.             case STREAM_CREATED: {
  289.                
  290.                 [netActivity stopAnimating];
  291.                
  292.                 [player start];
  293.                
  294.                 streamView.hidden = NO;
  295.                
  296.                 break;
  297.             }
  298.                
  299.             default:
  300.                 break;
  301.         }
  302.     }
  303. }
  304.  
  305. -(void)connectFailed:(id)sender code:(int)code description:(NSString *)description {
  306.    
  307.     NSLog(@" $$$$$$ <MPIMediaStreamEvent> connectFailedEvent: sender = %@, %d = %@\n", [sender class], code, description);
  308.    
  309.     if (!upstream)
  310.         return;
  311.    
  312.     [self setDisconnect];
  313.    
  314.     [self showAlert:(code == -1) ?
  315.      @"Unable to connect to the server. Make sure the hostname/IP address and port number are valid" :
  316.      [NSString stringWithFormat:@"connectFailedEvent: %@", description]];
  317. }
  318.  
  319. -(void)metadataReceived:(id)sender event:(NSString *)event metadata:(NSDictionary *)metadata {
  320.     NSLog(@" $$$$$$ <MPIMediaStreamEvent> dataReceived: sender = %@, EVENT: %@, METADATA = %@", [sender class], event, metadata);
  321. }
  322.  
  323. /*/// Send metadata for each video frame
  324.  -(void)pixelBufferShouldBePublished:(CVPixelBufferRef)pixelBuffer timestamp:(int)timestamp {
  325.      
  326.      //[upstream sendMetadata:@{@"videoTimestamp":[NSNumber numberWithInt:timestamp]} event:@"videoFrameOptions:"];
  327.      
  328.      //
  329.      CVPixelBufferRef frameBuffer = pixelBuffer;
  330.      
  331.      // Get the base address of the pixel buffer.
  332.      uint8_t *baseAddress = CVPixelBufferGetBaseAddress(frameBuffer);
  333.      // Get the data size for contiguous planes of the pixel buffer.
  334.      size_t bufferSize = CVPixelBufferGetDataSize(frameBuffer);
  335.      // Get the pixel buffer width and height.
  336.      size_t width = CVPixelBufferGetWidth(frameBuffer);
  337.      size_t height = CVPixelBufferGetHeight(frameBuffer);
  338.      
  339.      [upstream sendMetadata:@{@"videoTimestamp":[NSNumber numberWithInt:timestamp], @"bufferSize":[NSNumber numberWithInt:bufferSize], @"width":[NSNumber numberWithInt:width], @"height":[NSNumber numberWithInt:height]} event:@"videoFrameOptions:"];
  340.      //
  341.  }
  342. /*/
  343.  
  344. @end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement