Skip to content

Commit c9ac91f

Browse files
committed
add registerNodeGtkGst util
1 parent 4202691 commit c9ac91f

File tree

3 files changed

+66
-35
lines changed

3 files changed

+66
-35
lines changed

packages/core/src/media/factory.ts

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
11
import { Event, Logger } from '@skyway-sdk/common';
22

3-
import { errors } from '../errors';
3+
import {
4+
MediaDevices,
5+
MediaStreamTrackFactory,
6+
Navigator,
7+
} from '../imports/mediasoup';
48
import { createError, createWarnPayload } from '../util';
59
import { LocalMediaStreamOptions } from './stream';
610
import { LocalAudioStream } from './stream/local/audio';
7-
import {
8-
LocalCustomVideoStream,
9-
ProcessedStream,
10-
} from './stream/local/customVideo';
11+
import { ProcessedStream } from './stream/local/customVideo';
1112
import { DataStreamOptions, LocalDataStream } from './stream/local/data';
1213
import { LocalVideoStream } from './stream/local/video';
13-
import { MediaDevices, Navigator } from '../imports/mediasoup';
1414

1515
const log = new Logger('packages/core/src/media/factory.ts');
1616

1717
export class StreamFactory {
1818
readonly navigator: Navigator;
19+
private gst: any;
1920

2021
constructor(props: ConstructorParameters<typeof Navigator>[0] = {}) {
2122
this.navigator = new Navigator(props);
@@ -28,6 +29,49 @@ export class StreamFactory {
2829
});
2930
}
3031

32+
registerNodeGtkGst(gst: any) {
33+
this.gst = gst;
34+
}
35+
36+
async registerGstAudio({
37+
wave,
38+
rtpProcessor,
39+
}: { wave?: string; rtpProcessor?: (b: Buffer) => Buffer } = {}) {
40+
wave ??= 'ticks';
41+
42+
const [track, port, disposer] = await MediaStreamTrackFactory.rtpSource({
43+
kind: 'audio',
44+
cb: rtpProcessor,
45+
});
46+
const launch = this.gst.parseLaunch(
47+
`audiotestsrc wave=${wave} ! audioconvert ! audioresample ! queue ! opusenc ! rtpopuspay ! udpsink host=127.0.0.1 port=${port}`
48+
);
49+
launch.setState(this.gst.State.PLAYING);
50+
SkyWayStreamFactory.registerMediaDevices({ audio: track });
51+
52+
return () => {
53+
disposer();
54+
launch.setState(this.gst.State.NULL);
55+
};
56+
}
57+
58+
/**h264 only */
59+
async registerGstVideo(_: any = {}) {
60+
const [track, port, disposer] = await MediaStreamTrackFactory.rtpSource({
61+
kind: 'video',
62+
});
63+
const launch = this.gst.parseLaunch(
64+
`videotestsrc ! video/x-raw,width=640,height=480,format=I420 ! x264enc key-int-max=60 ! rtph264pay ! udpsink host=127.0.0.1 port=${port}`
65+
);
66+
launch.setState(this.gst.State.PLAYING);
67+
SkyWayStreamFactory.registerMediaDevices({ video: track });
68+
69+
return () => {
70+
disposer();
71+
launch.setState(this.gst.State.NULL);
72+
};
73+
}
74+
3175
/**
3276
* @description [japanese] CameraのVideoStreamを作成する
3377
*/

submodules/mediasoup

tests/large/loopback.test.ts

Lines changed: 15 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
1+
import Gst from '@girs/node-gst-1.0';
12
import { describe, expect, it } from 'vitest';
23
import {
4+
dePacketizeRtpPackets,
5+
deserializeAudioLevelIndication,
6+
serializeAudioLevelIndication,
7+
} from 'werift';
8+
9+
import {
10+
MediaStreamTrackFactory,
311
RemoteVideoStream,
12+
RoomPublication,
413
RtpPacket,
514
SkyWayContext,
615
SkyWayRoom,
7-
MediaStreamTrackFactory,
816
SkyWayStreamFactory,
9-
RoomPublication,
1017
} from '../../packages/room/src';
11-
12-
import Gst from '@girs/node-gst-1.0';
1318
import { testTokenString } from './fixture';
14-
import {
15-
dePacketizeRtpPackets,
16-
deserializeAudioLevelIndication,
17-
serializeAudioLevelIndication,
18-
} from 'werift';
1919

2020
const gst = require('node-gtk').require('Gst', '1.0') as typeof Gst;
2121
gst.init([]);
@@ -26,15 +26,15 @@ describe('loopback', () => {
2626
const context = await SkyWayContext.Create(testTokenString, {
2727
codecCapabilities: [{ mimeType: 'audio/opus' }],
2828
});
29+
SkyWayStreamFactory.registerNodeGtkGst(gst);
2930
const room = await SkyWayRoom.Create(context, {
3031
type: 'sfu',
3132
});
3233
console.log('roomId', room.id);
3334
const sender = await room.join();
3435

35-
const [track, port, disposer] = await MediaStreamTrackFactory.rtpSource({
36-
kind: 'audio',
37-
cb: (buf) => {
36+
const disposer = await SkyWayStreamFactory.registerGstAudio({
37+
rtpProcessor: (buf) => {
3838
const rtp = RtpPacket.deSerialize(buf);
3939
rtp.header.extension = true;
4040
rtp.header.extensions.push({
@@ -44,11 +44,6 @@ describe('loopback', () => {
4444
return rtp.serialize();
4545
},
4646
});
47-
const launch = gst.parseLaunch(
48-
`audiotestsrc wave=ticks ! audioconvert ! audioresample ! queue ! opusenc ! rtpopuspay ! udpsink host=127.0.0.1 port=${port}`
49-
);
50-
launch.setState(gst.State.PLAYING);
51-
SkyWayStreamFactory.registerMediaDevices({ audio: track });
5247

5348
const publication = await sender.publish(
5449
await SkyWayStreamFactory.createMicrophoneAudioStream()
@@ -69,7 +64,6 @@ describe('loopback', () => {
6964
console.log('audioLevel', p);
7065
await room.close();
7166
context.dispose();
72-
launch.setState(gst.State.NULL);
7367
disposer();
7468
done();
7569
}
@@ -157,21 +151,15 @@ describe('loopback', () => {
157151
],
158152
rtcConfig: { turnPolicy: 'disable' },
159153
});
154+
SkyWayStreamFactory.registerNodeGtkGst(gst);
155+
160156
const room = await SkyWayRoom.Create(context, {
161157
type: 'sfu',
162158
});
163159
console.log('roomId', room.id);
164160
const sender = await room.join();
165161

166-
const [track, port, disposer] = await MediaStreamTrackFactory.rtpSource({
167-
kind: 'video',
168-
});
169-
const launch = gst.parseLaunch(
170-
`videotestsrc ! video/x-raw,width=640,height=480,format=I420 ! x264enc key-int-max=60 ! rtph264pay ! udpsink host=127.0.0.1 port=${port}`
171-
);
172-
launch.setState(gst.State.PLAYING);
173-
SkyWayStreamFactory.registerMediaDevices({ video: track });
174-
162+
const disposer = await SkyWayStreamFactory.registerGstVideo();
175163
const publication = await sender.publish(
176164
await SkyWayStreamFactory.createCameraVideoStream()
177165
);
@@ -191,7 +179,6 @@ describe('loopback', () => {
191179

192180
await room.close();
193181
context.dispose();
194-
launch.setState(gst.State.NULL);
195182
disposer();
196183
done();
197184
}

0 commit comments

Comments
 (0)