# Java Quickstart

> Create a live input, push a broadcast, in Java.

## 1. Install

See [Installation](/sdks/java/installation).

## 2. Create a live input + mint a playback URL

```java
import com.clutchcall.sdk.streams.Streams;

try (Streams s = new Streams("https://app.clutchcall.dev",
                              System.getenv("CLUTCHCALL_API_KEY"),
                              "org_abc")) {
    var created = s.liveInputs().create("My First Stream", null, null);
    var inputId   = created.input().externalInputId();
    var streamKey = created.streamKey();    // returned ONCE
    System.out.println("inputId: " + inputId + "  streamKey: " + streamKey);

    var signed = s.liveInputs().get(inputId).signedPlaybackUrl(3600, null);
    System.out.println("playback URL: " + signed.url());
}
```

## 3. Push a broadcast

```java
try (var pub = Streams.BroadcastPublisher.open(inputId, streamKey,
        new Streams.Codecs("avc1.42E01F", "opus"))) {
    pub.write(fmp4Init);
    pub.write(fmp4Segment);
    pub.close(Streams.CloseReason.COMPLETE);
}
```

## 4. Subscribe

```java
try (var viewer = Streams.BroadcastViewer.open(signed.url(),
        (init, chunk) -> out.write(chunk),
        reason -> System.out.println("closed: " + reason))) {
    // viewer is AutoCloseable
}
```

## Other modalities

  - **[Voice](/modalities/voice/details)** — `new Voice(...)` + `Calls.originate` + `AudioBridge.attach`
  - **[Robotics](/modalities/robotics/details)** — `new Robotics(...)` + `publishTelemetry` / `subscribeCommand`
  - **[Games](/modalities/games/details)** — `new Games(...)` + `publishState` / `subscribeInputs`
  - **[Data](/modalities/data/details)** — `new Data(...)` + `publish` / `subscribe`
