← Alla tillägg

Inbyggt tillägg · Flaggskepp

KlugMedia

com.klug.media

INGEN APM BEHÖVS. Ladda ner och njut. Det blir inte enklare än så.

Kamera, tvåvägsröst och ekoreducering i hårdvara i en enda inbyggd session, med publicering och mottagning av H.264 och Opus via standard-RTMP.

iOSAndroidmacOS I produktion Från €99 / år · Köp

Översikt

AIR har för närvarande ingen uppdaterad implementation för medieströmning i realtid. KlugMedia lägger till den som ett inbyggt tillägg. Kamera, mikrofon, kodare och ekoreducering körs tillsammans i en enda inbyggd session, och ActionScript skickar bara kommandon och tar emot status.

Video publiceras och tas emot som H.264, röst som Opus, båda via standard-RTMP. Mottagen video ritas inbyggt ovanpå AIR-scenen, så att den förblir skarp och mjuk även på äldre enheter.

KlugMedia används dagligen i våra appar, vårt proof of concept, på App Store, Google Play och Mac.

Funktioner

  • Fristående: ett ANE, inget kärnbibliotek eller beroende-ANE:er att lägga till
  • Kameraupptagning och H.264-publicering i en enda inbyggd session
  • Inbyggd H.264-mottagning och -visning med korrekt bildformat, med beskärning till fyllning och rotation
  • Tvåvägsröst med Opus och ekoreducering i hårdvara, båda sidor kan prata samtidigt
  • Inbyggd kameraförhandsvisning, kameraväxling, ficklampa och zoom
  • Ögonblicksbilder tagna direkt från kamerabilden
  • MP4-inspelning av livesändningar på Klugs streamingserver, bild och ljud
  • Automatisk anpassning av bitrate på svaga nätverk
  • Adaptiv röstbuffert som klarar Wi-Fi-hack och går tillbaka till låg fördröjning på egen hand
  • På Mac: växla mellan den inbyggda kameran och USB-kameror på ungefär en sekund
  • Standard-RTMP, så det fungerar med vanliga medieservrar

Streamingserver

KlugMedia levereras med matchande serverprogramvara, utvecklad tillsammans med tillägget och anpassad för AIR-appar: hantering av strömmar, tillförlitliga återanslutningar, vidarebefordran av tvåvägsröst, MP4-inspelning och livevisning i en webbläsare.

Servern beskrivs på översiktssidan: Streamingserver.

Plattformar som stöds

iOS arm64
Android arm64 · armv7
macOS Apple silicon · Intel
iPad-appar på Mac Apple silicon · macOS 26 och 27

iPad-appar på Mac

På Mac med Apple silicon kan iOS-bygget av en AIR-app köras som en iPad-app. KlugMedia stöder det här läget med kamera, livevideo och tvåvägsröst, inklusive den inbyggda FaceTime-kameran och externa USB-kameror. En enda build fungerar för iPhone, iPad och Mac.

Redo för iOS 27 och macOS 27

KlugMedia är testat på iOS 27, iPadOS 27 och macOS 27, på iPhone, iPad, MacBook och Mac mini, och fortfarande på iOS 17. Höjdpunkter i den här versionen:

  • Härdad mottagningsväg: att stoppa och starta om en livesändning är säkert när som helst, även med den timing som iOS 27 har
  • Stabil kameraförhandsvisning på macOS 27 för iPad-appar på Mac, medan kameran startar, stoppar eller växlar
  • Rätt orientering på varje Mac: inbyggda kameror och USB-kameror står upprätt i förhandsvisningen och hos mottagaren, på macOS 26 och 27
  • Snabb kameraväxling på Mac mellan FaceTime-kameran och USB-kameror, på ungefär en sekund
  • Tydlig röst på bärbart Wi-Fi: en adaptiv buffert absorberar de korta Wi-Fi-skurar som är typiska för MacBook och krymper tillbaka när nätverket är lugnt

Kom igång

Lägg till tillägget i din applikationsbeskrivning (application descriptor):

app.xml
<extensions>
    <extensionID>com.klug.media</extensionID>
</extensions>

Begär kamera- och mikrofonbehörighet före första starten. Tillägget äger därefter upptagningen: öppna inte en AIR-Camera eller -Microphone samtidigt.

Kodexempel

Fem kompletta flöden, hämtade från det API som körs i våra appar varje dag. Varje anrop returnerar direkt; resultat kommer som StatusEvents. Fullständig dokumentation →

1 · Publicera en kameraström
Station.as
import com.klug.petcam.camera.CameraStreamANE;
import flash.events.StatusEvent;

var media:CameraStreamANE = CameraStreamANE.instance;
media.addEventListener( StatusEvent.STATUS, onMedia );

if ( media.isSupported )
{
    // camera, H.264 encoder and RTMP in one native session
    media.startPublish( "rtmp://your.server:1935/live", "station-1",
                        640, 480,     // size
                        12, 800,      // fps, kbps
                        2,            // keyframe every 2 s: fast start at the viewer
                        CameraStreamANE.CAMERA_BACK );
}

function onMedia( e:StatusEvent ):void
{
    if ( e.code != CameraStreamANE.STATUS_EVENT ) return;
    if ( e.level == "connected" )             showLive();
    else if ( e.level.indexOf( "failed:" ) == 0 )  retryLater( e.level.substr( 7 ) );
    else if ( e.level.indexOf( "authError:" ) == 0 ) askForLogin();
}
2 · Ta emot och följ layouten
Viewer.as
// the video is decoded natively and drawn in a view above the stage (pixels)
media.startReceive( "rtmp://your.server:1935/live", "station-1",
                    0, 80, stage.stageWidth, stage.stageHeight - 160,
                    0, CameraStreamANE.RECEIVE_FIT );   // or RECEIVE_CROPFILL

media.addEventListener( StatusEvent.STATUS, function( e:StatusEvent ):void {
    if ( e.code == "receiveStatus" && e.level == "firstFrame" ) hideSpinner();
});

// rotation, a folding phone, fullscreen: move the native view with the stage
stage.addEventListener( Event.RESIZE, function( e:Event ):void {
    media.setReceiveFrame( 0, 80, stage.stageWidth, stage.stageHeight - 160 );
});
3 · Tvåvägsröst med ekoreducering
Voice.as
import com.klug.petcam.audioecho.*;

var voice:OpusVoiceBridge = new OpusVoiceBridge( new NativeOpusCodec(), 48000, 1, 960 );
var link:Red5OpusTransport;

var nc:NetConnection = new NetConnection();
nc.addEventListener( NetStatusEvent.NET_STATUS, function( e:NetStatusEvent ):void {
    if ( e.info.code == "NetConnection.Connect.Success" ) startVoice();
});
nc.connect( "rtmp://your.server:1935/live" );

function startVoice():void
{
    link = new Red5OpusTransport( nc );
    link.addEventListener( OpusPacketEvent.PACKET, function( e:OpusPacketEvent ):void {
        voice.playRemoteOpus( e.packet );            // decode and play the other side
    });
    link.start( "voice_me", "voice_other" );     // my stream, the other side's stream

    voice.setVoiceProcessing( true );             // hardware echo cancellation
    EchoCancellationANE.instance.setDuck( false ); // both sides may talk at once
    voice.start();
    addEventListener( Event.ENTER_FRAME, sendVoice );
}

function sendVoice( e:Event ):void
{
    var packet:ByteArray;
    while ( ( packet = voice.readLocalOpus() ) != null )   // every finished 20 ms frame
        link.sendPacket( packet );
}
Rösspaketen skickas som datameddelanden på ett eget par strömmar. Klugs streamingserver vidarebefordrar dem direkt; andra RTMP-servrar måste vidarebefordra NetStream.send till prenumeranterna.
4 · Förhandsvisning, kameraväxling, ficklampa, zoom, ögonblicksbild
Controls.as
media.showPreview( 20, 100, 320, 240, CameraStreamANE.CAMERA_FRONT );   // aiming preview

media.switchCamera();               // front / back, or built-in / USB camera on the Mac
if ( media.hasTorch ) media.setTorch( true );
media.setCameraZoom( 4 );           // 0..8 = 1.0x..2.0x, the stream is zoomed too
media.setVideoBitrate( 500 );       // change the bitrate while live

media.addEventListener( StatusEvent.STATUS, function( e:StatusEvent ):void {
    if ( e.code == "snapshotStatus" && e.level.indexOf( "saved:" ) == 0 )
        showPhoto( e.level.substr( 6 ) );                // absolute path of the JPEG
});
media.captureSnapshot( 640, 480 );

media.hidePreview();   // native views sit above the stage: hide them before dialogs
5 · Rent stopp och omstart
Session.as
function stopAll():void
{
    removeEventListener( Event.ENTER_FRAME, sendVoice );
    voice.stop();
    link.stop();
    media.stopReceive();
    media.stopPublish();    // always stop before publishing the same name again
}

// safe at any moment, also while a stream is still connecting
stopAll();
media.startPublish( "rtmp://your.server:1935/live", "station-1" );

API-översikt

isSupportedTrue där den inbyggda mediasessionen är tillgänglig.
startPublish(…)Startar kameran och publicerar H.264 via RTMP: storlek, fps, bitrate, nyckelbildsintervall, kamera, valfri RTMP-inloggning.
stopPublish()Stoppar publiceringen; kameran frigörs om inte förhandsvisningen fortfarande visas.
startReceive(…)Spelar upp en fjärrström inbyggt i en rektangel på scenen: anpassa till bildformat eller beskär till fyllning med rotation (utsträckning på Android).
setReceiveFrame(x, y, w, h)Flyttar och ändrar storlek på den inbyggda videon, för rotation, vikbara telefoner och helskärm.
stopReceive()Stoppar uppspelningen och tar bort den inbyggda vyn.
showPreview(…) / hidePreview()Inbyggd kameraförhandsvisning över scenen, ensam eller vid sidan av en pågående livepublicering.
switchCamera()Växlar till nästa kamera under streaming: fram- och baksida på iPhone och iPad, inbyggda och USB-kameror på Mac.
setTorch(on) / hasTorchKameralampa under streaming, och om enheten har någon.
setCameraZoom(step)Verklig kamerazoom på iOS och Android, 0..8 för 1,0x till 2,0x; strömmen zoomas också.
setVideoBitrate(kbps)Ändrar kodarens bitrate under pågående sändning.
captureSnapshot(w, h)Sparar en JPEG från den levande kamerabilden.
isiOSAppOnMacTrue när iOS-bygget körs som en iPad-app på en Mac med Apple silicon.
OpusVoiceBridgeTvåvägsröst: start, stopp, ekoreducering, högtalare, förstärkning, uppspelningsbuffert.
Red5OpusTransportFör Opus-paketen över din RTMP-anslutning på två dedikerade strömmar.

Statushändelser

cameraStatusconnecting · connected · disconnected · failed:<reason> · authError:<reason> · newBitrate:<rate> · authSuccess (Android)
receiveStatusplaying · firstFrame · disconnected · streamEnded och failed:<reason> (iOS, macOS)
snapshotStatussaved:<path> · failed:<reason>

Köp KlugMedia

En årslicens för en AIR-applikation, med alla uppdateringar i 12 månader. Efter betalning får du tillägget, ActionScript-biblioteket och dokumentationen via e-post, vanligtvis inom en arbetsdag. Licens och villkor

Enkel
€99 / år
  • Licens för en AIR-applikation
  • Alla uppdateringar i 12 månader
  • Ingen support
Köp Enkel
Standard
€349 / år
  • Licens för en AIR-applikation
  • Alla uppdateringar i 12 månader
  • Svar via e-post inom 7 dagar
Köp Standard
Prioritet
€699 / år
  • Licens för en AIR-applikation
  • Alla uppdateringar i 12 månader
  • Svar via e-post inom 48 timmar
Köp Prioritet
Skatter beräknas i kassan av Link (Stripe). Du anger application ID för din AIR-app under köpet.

Krav

AIR SDK51.x (HARMAN)
iOSiOS 17 eller senare
AndroidAndroid 6.0 (API 23) eller senare
macOSmacOS 11 eller senare
iPad-appar på MacApple silicon, macOS 26 eller senare
BehörigheterKamera och mikrofon
ServerValfri RTMP-server; den matchande Klug-streamingservern rekommenderas