WOWZA à IOS – Comment diffuser en direct

Jusqu'à présent, j'ai presque développé un Flash Air pour iOS App et j'ai été fait à 50%. J'ai tout le streaming en direct pour travailler avec RED5 Media Server, mais est arrivé à un Dead End quand j'ai trouvé que la camera iPhone affichait 90 degrés de sorte que le stream envoyé et enregistré sur le server RED5 a également été enregistré à 90 degrés. Je lis beaucoup d'articles en ligne même sur Stack Overflow que c'est un Bug connu. Je ne sais pas quand cela sera corrigé. J'ai également essayé des extensions ANE Air Native qui fonctionneraient avec la rotation de la camera dans mon application Air, il s'agissait de DiaDraw et de StarlingCamera ANE, mais je n'ai trouvé aucun didacticiel d'information en ligne.

Flash Adobe Air pour le code IOS qui se connecte au server RED5 et montre que l'appareil photo de l'iPhone est à 90 degrés:

import flash.display.DisplayObject; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.ActivityEvent; import flash.events.MouseEvent; import flash.media.Camera; import flash.media.Video; import flash.events.NetStatusEvent; import flash.net.NetStream; import flash.net.NetConnection; var nc:NetConnection; var cam:Camera; var vid:Video; var nsOut:NetStream; var nsIn:NetStream; // support autoOrients stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; cam = Camera.getCamera(); cam.setMode(320, 300, 25); cam.setQuality(0,100); if (!cam) { txt.text ="No camera is installed."; } else { nc = new NetConnection(); nc.connect("rtmp://192.168.1.5/RED5Hugt"); nc.addEventListener(NetStatusEvent.NET_STATUS,getStream); nc.client = this; //connectCamera(); } function getStream(e:NetStatusEvent):void { connectCamera(); nsIn = new NetStream(nc); nsOut = new NetStream(nc); vid.attachNetStream(nsIn); nsIn.play("tester"); nsOut=new NetStream(nc); netOut.attachAudio(mic); nsOut.attachCamera(cam); nsOut.publish("tester", "live"); // add click event to record button // add event for stage video render state } function connectCamera():void { vid = new Video(); vid.width = cam.width; vid.height = cam.height; vid.x = 0; vid.y = 0; vid.attachCamera(cam); addChild(vid); //stage.addEventListener(MouseEvent.CLICK, clickHandler); } function clickHandler(e:MouseEvent):void { return; switch (cam.width) { case 160: cam.setMode(320, 240, 10); break; case 320: cam.setMode(640, 480, 5); break; default: cam.setMode(160, 120, 15); break; } removeChild(vid); connectCamera(); } 

Code du server RED5:

 package com; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Collection; import java.util.Hashtable; import org.red5.server.adapter.ApplicationAdapter; import org.red5.server.adapter.MultiThreadedApplicationAdapter; import org.red5.server.api.IClient; import org.red5.server.api.IConnection; import org.red5.server.api.Red5; import org.red5.server.api.scope.IScope; import org.red5.server.api.service.IPendingServiceCall; import org.red5.server.api.service.IPendingServiceCallback; import org.red5.server.api.service.IServiceCapableConnection; import org.red5.server.api.service.IServiceHandlerProvider; import org.red5.server.api.stream.IBroadcastStream; import org.red5.server.api.stream.IServerStream; import org.red5.server.api.stream.support.SimplePlayItem; import org.red5.server.api.stream.support.StreamUtils; import org.red5.server.stream.ClientBroadcastStream; import org.red5.server.stream.RecordingListener; import static java.lang.System.*; public class Application extends MultiThreadedApplicationAdapter{ //private static final Log log = LogFactory.getLog( Application.class ); private IBroadcastStream serverStream; @Override public boolean appStart(IScope scope) { if(!super.appStart(scope)) { return false; } else { super.appStart(scope); return true; } } @Override public void appStop(IScope scope) { } //User connecting/disconnecting to/from application @Override public boolean appConnect(IConnection connection, Object[] parameters) { super.appConnect(connection, parameters); //connection.getClient().setAtsortingbute("userName", parameters[0]); return true; } @Override public void appDisconnect(IConnection connection) { super.appDisconnect(connection); } //User joining/leaving scope @Override public boolean appJoin(IClient client, IScope scope) { super.appJoin(client, scope); return true; } @Override public void appLeave(IClient client, IScope scope) { super.appLeave(client,scope); } public boolean connect(IConnection conn, IScope scope, Object[] params) { super.connect(conn, scope, params); return true; } } 

Alors j'ai décidé de streamer nativement, et j'ai utilisé les librairies Media et CommLib dans objective-c et j'ai trouvé ce code, j'ai collé cela sur Pastebin car il y avait trop de code à éditer quand coller ici:

C'est le CLIENT RTMP qui se connecte avec succès à l'adaptateur d'application Java RED5 fonctionnant sur un autre PC.

http://pastebin.com/0KQvTL0b

Lors de l'exécution de RTMP CLIENT à l'aide de Xcode, l'application diffusait en direct mais toutes les quelques secondes l'audio se brisait et je ne trouvais rien qui puisse résoudre ce problème, peut-être que je devais modifier du code mais j'ai trouvé ce code RTMP CLIENT en ligne. modifié le nom du stream et l'URL RTMP pour pointer vers mon application sur le server RED5.

Pourquoi l'audio continue-t-elle de se brouiller? Alors maintenant, j'ai envie d'essayer WOWZA Media Server.

Jusqu'à présent, j'ai téléchargé le Wowza Media Server puis installé Eclipse. Une fois qu'Eclipse a été installé, j'ai ensuite installé l'IDE Wowza que j'ai installé dans Eclipse, mais assurez-vous d'installer le Wowza Media Server avant d'installer l'IDE Wowza.

J'ai ensuite trouvé du code en ligne qui serait le server fonctionnant sur le server Wowza, le nouveau server Wowza est lancé dans le browser, j'ai essayé de l'exécuter dans le terminal mais je n'ai pas pu l'exécuter car il disait: "Impossible d'exécuter l'opération "dans le terminal.

C'est le code que j'ai utilisé pour le server:

 package com; import com.wowza.wms.application.*; import com.wowza.wms.amf.*; import com.wowza.wms.client.*; import com.wowza.wms.module.*; import com.wowza.wms.request.*; import com.wowza.wms.stream.*; import com.wowza.wms.rtp.model.*; import com.wowza.wms.httpstreamer.model.*; import com.wowza.wms.httpstreamer.cupertinostreaming.httpstreamer.*; import com.wowza.wms.httpstreamer.smoothstreaming.httpstreamer.*; public class RED5Hugt extends ModuleBase { public void doSomething(IClient client, RequestFunction function, AMFDataList params) { getLogger().info("doSomething"); sendResult(client, params, "Hello Wowza"); } public void onAppStart(IApplicationInstance appInstance) { Ssortingng fullname = appInstance.getApplication().getName() + "/" + appInstance.getName(); getLogger().info("onAppStart: " + fullname); } public void onAppStop(IApplicationInstance appInstance) { Ssortingng fullname = appInstance.getApplication().getName() + "/" + appInstance.getName(); getLogger().info("onAppStop: " + fullname); } public void onConnect(IClient client, RequestFunction function, AMFDataList params) { getLogger().info("onConnect: " + client.getClientId()); } public void onConnectAccept(IClient client) { getLogger().info("onConnectAccept: " + client.getClientId()); } public void onConnectReject(IClient client) { getLogger().info("onConnectReject: " + client.getClientId()); } public void onDisconnect(IClient client) { getLogger().info("onDisconnect: " + client.getClientId()); } public void onStreamCreate(IMediaStream stream) { getLogger().info("onStreamCreate: " + stream.getSrc()); } public void onStreamDestroy(IMediaStream stream) { getLogger().info("onStreamDestroy: " + stream.getSrc()); } } 

Alors maintenant, je lance le projet Xcode RTMP CLIENT et trouve que le CLIENT RTMP se connecte mais je ne reçois pas de stream en direct. Je voulais juste requestr où je dois changer mon code afin de faire fonctionner la diffusion en direct?

Aussi avec mon expérience en utilisant Adobe Air pour IOS et en utilisant RED5, Devrais-je prendre ce dernier itinéraire parce que je ne suis pas sûr. J'ai beaucoup étudié et vraiment je veux find le moyen sans frais de savoir comment diffuser de l'appareil photo IPhone. J'ai essayé Adobe pour IOS à RED5 Server et ai trouvé le Bug connu et j'ai essayé Native à RED5 et j'ai trouvé le Audio Glitch alors Wowza est-il le meilleur pari?

METTRE À JOUR

Je reçois une sortie dans la console Xcode que le stream n'a pas pu être trouvé, voici la sortie:

 2014-07-30 13:33:06.246 RTMPStreamComeback[340:4003] $$$$$$ <MPIMediaStreamEvent> stateChangedEvent: sender = MediaStreamPlayer, 4 = NetStream.Play.StreamNotFound 

J'ai mis le nom UpStream "testeur" et le nom DownStream "testeur"

Mettre à jour

Le streaming fonctionne maintenant J'ai trouvé ce tutoriel en ligne et j'ai trouvé que j'avais besoin d'inclure le file Application.xml et de configurer le file. Voici le tutoriel:

 https://www.youtube.com/watch?v=XoojcVfdHWg 

Mais encore une fois, tout comme le RED5, l'audio semble pépin, mais le stream ne se décompose jamais en dehors de l'audio.

Comment puis-je réparer cela?

C'est la trace de Xcode:

  2014-07-30 15:19:48.296 RTMPStreamComeback[397:60b] connectControl: host = rtmp://192.168.1.4:1935/RED5Hugt 2014-07-30 15:19:49.325 RTMPStreamComeback[397:60b] Video encoding is initialized: bit_rate = 272000, rc_max_rate = 0, rc_min_rate = 0, qmin=2, qmax=31, qcompress=0.500000 2014-07-30 15:19:49.334 RTMPStreamComeback[397:60b] AudioCodec: codecID = 86050, codecType = 42, bitRate = 16000, _sampleBytes = 4 encoder supports the sample formats: flt, audio codec best options: sample_rate = 44100 2014-07-30 15:19:49.340 RTMPStreamComeback[397:60b] audio codec context: codec_type = 1, sample_fmt = flt, bit_rate = 16000, sample_rate = 16000, channels = 1, frame_bits = 4, channel_layout = 0, frame_size = 0, buffer_size = 256 2014-07-30 15:19:49.344 RTMPStreamComeback[397:60b] initVideoCapture -> preset AVCaptureSessionPresetLow is supported, orientation = 3 2014-07-30 15:19:49.414 RTMPStreamComeback[397:60b] BroadcastStreamClient STREAM ----> name: tester, type: 2, [socket retainCount] = 3 2014-07-30 15:19:49.789 RTMPStreamComeback[397:60b] $$$$$$ <MPIMediaStreamEvent> stateChangedEvent: sender = BroadcastStreamClient, 1 = RTMP.Client.isConnected 2014-07-30 15:19:49.831 RTMPStreamComeback[397:3f03] $$$$$$ <MPIMediaStreamEvent> stateChangedEvent: sender = BroadcastStreamClient, 2 = RTMP.Client.Stream.isCreated 2014-07-30 15:19:50.585 RTMPStreamComeback[397:3f03] $$$$$$ <MPIMediaStreamEvent> stateChangedEvent: sender = BroadcastStreamClient, 3 = NetStream.Publish.Start [flv @ 0x1883d000] Error, Invalid timestamp=0, last=0 [flv @ 0x1883d000] Error, Invalid timestamp=0, last=0 [flv @ 0x1883d000] Error, Invalid timestamp=0, last=0 2014-07-30 15:20:01.677 RTMPStreamComeback[397:60b] publishControl: stream = slavav 2014-07-30 15:20:01.680 RTMPStreamComeback[397:60b] NellyMoserDecoder -> audio codec context: codec_type = 1, sample_fmt = flt, bit_rate = 16000, sample_rate = 16000, channels = 1, frame_bits = 4, channel_layout = 0, frame_size = 0 2014-07-30 15:20:01.681 RTMPStreamComeback[397:60b] Set Player's Framework -> 'AudioUnit' 2014-07-30 15:20:01.685 RTMPStreamComeback[397:60b] VideoStream decoding is initialized: context->pix_fmt = 0, width = 0, height = 0 2014-07-30 15:20:01.689 RTMPStreamComeback[397:60b] $$$$$$ <MPIMediaStreamEvent> stateChangedEvent: sender = MediaStreamPlayer, 1 = RTMP.Client.isConnected 2014-07-30 15:20:01.712 RTMPStreamComeback[397:3f03] $$$$$$ <MPIMediaStreamEvent> stateChangedEvent: sender = MediaStreamPlayer, 2 = RTMP.Client.Stream.isCreated 2014-07-30 15:20:01.758 RTMPStreamComeback[397:3f03] $$$$$$ <MPIMediaStreamEvent> stateChangedEvent: sender = MediaStreamPlayer, 3 = NetStream.Play.Start [flv @ 0x1808c600] Bad picture start code [flv @ 0x1808c600] header damaged 2014-07-30 15:20:01.764 RTMPStreamComeback[397:3f03] VideoStream -> decodeFrame: (ERROR) got_packet = 0, processed_size = -1 [swscaler @ 0x2e38000] No accelerated colorspace conversion found from yuv420p to bgra. 2014-07-30 15:20:01.775 RTMPStreamComeback[397:7a03] MPAudioUnitEngine -> nextFrame: < NO PCM - WHITE NOISE > timestamp = 11192, dropWhiteNoise = 0 2014-07-30 15:20:01.799 RTMPStreamComeback[397:7a03] MPAudioUnitEngine -> nextFrame: < NO PCM - WHITE NOISE > timestamp = 11215, dropWhiteNoise = 0 2014-07-30 15:20:01.821 RTMPStreamComeback[397:7a03] MPAudioUnitEngine -> nextFrame: < NO PCM - WHITE NOISE > timestamp = 11238, dropWhiteNoise = 0 2014-07-30 15:20:01.845 RTMPStreamComeback[397:7a03] MPAudioUnitEngine -> nextFrame: < NO PCM - WHITE NOISE > timestamp = 11261, dropWhiteNoise = 0 2014-07-30 15:20:01.867 RTMPStreamComeback[397:7a03] MPAudioUnitEngine -> nextFrame: < NO PCM - WHITE NOISE > timestamp = 11284, dropWhiteNoise = 0 [flv @ 0x1808c600] Bad picture start code [flv @ 0x1808c600] header damaged 2014-07-30 15:20:01.888 RTMPStreamComeback[397:3f03] VideoStream -> decodeFrame: (ERROR) got_packet = 0, processed_size = -1 2014-07-30 15:23:31.088 RTMPStreamComeback[397:3f03] MPAudioUnitEngine -> dropPcm: *** DROPPED = 320, dropWhiteNoise = 8600, pcm.remaining = 16036 2014-07-30 15:23:31.090 RTMPStreamComeback[397:3f03] MPAudioUnitEngine -> dropPcm: *** DROPPED = 1024, dropWhiteNoise = 7576, pcm.remaining = 16036 2014-07-30 15:23:31.093 RTMPStreamComeback[397:3f03] MPAudioUnitEngine -> dropPcm: *** DROPPED = 2048, dropWhiteNoise = 5528, pcm.remaining = 16036 2014-07-30 15:23:31.164 RTMPStreamComeback[397:3f03] MPAudioUnitEngine -> dropPcm: *** DROPPED = 640, dropWhiteNoise = 4888, pcm.remaining = 16056 2014-07-30 15:23:31.219 RTMPStreamComeback[397:3f03] MPAudioUnitEngine -> dropPcm: *** DROPPED = 128, dropWhiteNoise = 4760, pcm.remaining = 16028 2014-07-30 15:23:31.298 RTMPStreamComeback[397:3f03] MPAudioUnitEngine -> dropPcm: *** DROPPED = 192, dropWhiteNoise = 4568, pcm.remaining = 16036 2014-07-30 15:23:31.604 RTMPStreamComeback[397:3f03] MPAudioUnitEngine -> dropPcm: *** DROPPED = 128, dropWhiteNoise = 4440, pcm.remaining = 16048 2014-07-30 15:23:31.740 RTMPStreamComeback[397:3f03] MPAudioUnitEngine -> dropPcm: *** DROPPED = 320, dropWhiteNoise = 4120, pcm.remaining = 16024 2014-07-30 15:23:32.296 RTMPStreamComeback[397:3f03] MPAudioUnitEngine -> dropPcm: *** DROPPED = 192, dropWhiteNoise = 3928, pcm.remaining = 16008 2014-07-30 15:24:47.575 RTMPStreamComeback[397:3f03] MPAudioUnitEngine -> dropPcm: *** DROPPED = 64, dropWhiteNoise = 3864, pcm.remaining = 16000 

Ce sont les parameters par défaut pour le format audio et video: Les parameters de diffusion en continu par défaut sont indiqués ci-dessous:

 Audio: codec - Nelly Mozer 16KHz, mono bitrate - 128000 Video: codec - H.263 (Sorenson) bitrate - 200000 resolution - 192x144px fps = 25 intra frame - 10 

AUSSI SUGGÈRE:

 Currently the library does not provide an instrument to control the stream quality. This is planned for a future release. 

Donc, je ne pense pas que cela est possible de changer le format de stream audio