from moqt import Relay
relay = Relay(
cert_file="server.crt",
key_file="server.key",
)
def on_publish(namespace: bytes, track_name: bytes, track_alias: int):
print(f"PUBLISH: {namespace}/{track_name}")
def on_subscribe(namespace: bytes, track_name: bytes, track_alias: int):
print(f"SUBSCRIBE: {namespace}/{track_name}")
relay.set_on_publish(on_publish)
relay.set_on_subscribe(on_subscribe)
relay.start(port=4433)
# QUIC: moqt://127.0.0.1:4433/moqt
# WebTransport: https://127.0.0.1:4433/moqtfrom moqt import Client
with Client(verify=False) as client:
with client.connect("moqt://127.0.0.1:4433/moqt") as session:
publisher = session.publish(
namespace=[b"live"],
track_name=b"video",
)
publisher.send_object(group_id=0, object_id=0, payload=b"Hello, MOQT!")
publisher.publish_done()from moqt import Client
with Client(verify=False) as client:
with client.connect("moqt://127.0.0.1:4433/moqt") as session:
def on_object(group_id: int, object_id: int, payload: bytes):
print(f"Received: {payload}")
subscriber = session.subscribe(
namespace=[b"live"],
track_name=b"video",
on_object=on_object,
)
# データ受信待機
subscriber.unsubscribe()MediaStream を使用した簡単な配信・受信 API です。WebCodecs API を内部で使用し、エンコード・デコードを自動的に行います。
import { createMediaPublisher } from "moqt-js"
const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true })
const publisher = await createMediaPublisher(
"https://example.com/moqt",
{
namespace: ["live"],
audio: {
trackName: "audio",
codec: "opus",
bitrate: 128_000,
},
video: {
trackName: "video",
codec: "h264",
width: 1280,
height: 720,
bitrate: 2_000_000,
framerate: 30,
},
},
{
onStateChange: (state) => console.log("state:", state),
onError: (e) => console.error(e),
}
)
await publisher.start(stream)
// 配信終了
await publisher.close()import { createMediaSubscriber } from "moqt-js"
const subscriber = await createMediaSubscriber(
"https://example.com/moqt",
{
namespace: ["live"],
audio: { trackName: "audio" },
video: { trackName: "video" },
},
{
onStateChange: (state) => console.log("state:", state),
onError: (e) => console.error(e),
}
)
await subscriber.start()
// MediaStream を video 要素に設定
videoElement.srcObject = subscriber.mediaStream
// 受信終了
await subscriber.close()プロトコルレベルの細かい制御が必要な場合に使用します。WebCodecs API や MediaStream API の処理は自前で実装する必要があります。
import { connect } from "moqt-js"
const session = await connect(
"https://example.com/moqt",
{
close: () => console.log("disconnected"),
error: (e) => console.error(e),
}
)
const publisher = await session.publish(
["live"],
"video",
{ error: (e) => console.error(e) }
)
publisher.sendObject({ groupId: 0, objectId: 0, payload: new Uint8Array([1, 2, 3]) })
await publisher.done()import { connect } from "moqt-js"
const session = await connect(
"https://example.com/moqt",
{
close: () => console.log("disconnected"),
error: (e) => console.error(e),
}
)
const subscriber = await session.subscribe(
["live"],
"video",
{
object: (obj) => console.log(obj),
end: () => console.log("track ended"),
error: (e) => console.error(e),
}
)
// データ受信待機
await subscriber.unsubscribe()