最新的视频,24秒,但播放两三秒就结束了
This commit is contained in:
@@ -43,12 +43,14 @@ describe('recording composer', () => {
|
||||
|
||||
expect(args).toContain('-filter_complex');
|
||||
expect(args.join(' ')).toContain('xstack=inputs=2');
|
||||
expect(args.join(' ')).toContain('scale=1280:540');
|
||||
expect(args.join(' ')).toContain('scale=1280:180');
|
||||
expect(args.join(' ')).toContain('layout=0_0|0_540');
|
||||
expect(args.join(' ')).toContain('scale=2560:1080');
|
||||
expect(args.join(' ')).toContain('scale=2560:360');
|
||||
expect(args.join(' ')).toContain('layout=0_0|0_1080');
|
||||
expect(args.join(' ')).toContain('fps=60');
|
||||
expect(args.join(' ')).toContain('amix=inputs=2');
|
||||
expect(args).toContain('libvpx-vp9');
|
||||
expect(args).toContain('libopus');
|
||||
expect(args).toContain('16000k');
|
||||
expect(args).not.toContain('-shortest');
|
||||
expect(args[args.length - 1]).toBe('recordings/room-1/output.webm');
|
||||
});
|
||||
@@ -75,9 +77,9 @@ describe('recording composer', () => {
|
||||
'-i',
|
||||
'recordings/room-1/p2-video.webm'
|
||||
]);
|
||||
expect(filter).toContain('scale=1280:540');
|
||||
expect(filter).toContain('scale=640:180');
|
||||
expect(filter).toContain('layout=0_0|0_540|640_540');
|
||||
expect(filter).toContain('scale=2560:1080');
|
||||
expect(filter).toContain('scale=1280:360');
|
||||
expect(filter).toContain('layout=0_0|0_1080|1280_1080');
|
||||
});
|
||||
|
||||
test('builds mp4 encoder args', () => {
|
||||
@@ -90,6 +92,8 @@ describe('recording composer', () => {
|
||||
|
||||
expect(args).toContain('libx264');
|
||||
expect(args).toContain('-pix_fmt');
|
||||
expect(args).toContain('16000k');
|
||||
expect(args).toContain('60');
|
||||
expect(args).not.toContain('libopus');
|
||||
});
|
||||
|
||||
@@ -128,12 +132,31 @@ describe('recording composer', () => {
|
||||
const filter = args[args.indexOf('-filter_complex') + 1];
|
||||
expect(filter).toContain('[0:v]split=2[vin0_0][vin0_1]');
|
||||
expect(filter).toContain('[vin0_0]trim=start=0:duration=2.5');
|
||||
expect(filter).toContain('tpad=stop_mode=clone:stop_duration=2.5,trim=duration=2.5');
|
||||
expect(filter).toContain('[vin0_1]trim=start=2.5:duration=7.5');
|
||||
expect(filter).toContain('tpad=stop_mode=clone:stop_duration=7.5,trim=duration=7.5');
|
||||
expect(filter).toContain('[1:v]trim=start=0:duration=7.5');
|
||||
expect(filter).toContain('concat=n=2:v=1:a=0[vout]');
|
||||
expect(filter).toContain('[2:a]aresample=async=1:first_pts=0[a0]');
|
||||
expect(filter).toContain('[3:a]aresample=async=1:first_pts=0,adelay=2500:all=1[a1]');
|
||||
expect(filter).toContain('[a0][a1]amix=inputs=2:duration=longest');
|
||||
expect(filter).toContain('[a0][a1]amix=inputs=2:duration=longest:dropout_transition=2,asetpts=N/SR/TB[aout]');
|
||||
});
|
||||
|
||||
test('bounds each video segment to its timeline duration before composition', () => {
|
||||
const args = buildFfmpegCompositionArgs({
|
||||
videoInputs: [
|
||||
file('host-video.webm', 'video', 'host', 'host', '2026-06-01T00:00:00.000Z', '2026-06-01T00:00:24.000Z')
|
||||
],
|
||||
audioInputs: [
|
||||
file('host-audio.webm', 'audio', 'host', 'host', '2026-06-01T00:00:00.000Z', '2026-06-01T00:00:24.000Z')
|
||||
],
|
||||
outputPath: 'recordings/room-1/output.webm',
|
||||
format: 'webm'
|
||||
});
|
||||
|
||||
const filter = args[args.indexOf('-filter_complex') + 1];
|
||||
expect(filter).toContain('trim=start=0:duration=24,setpts=PTS-STARTPTS,tpad=stop_mode=clone:stop_duration=24,trim=duration=24,setpts=PTS-STARTPTS');
|
||||
expect(filter).toContain('[1:a]aresample=async=1:first_pts=0,asetpts=N/SR/TB[aout]');
|
||||
});
|
||||
|
||||
test('changes the layout when participants join and leave without overlapping', () => {
|
||||
@@ -150,7 +173,7 @@ describe('recording composer', () => {
|
||||
|
||||
const filter = args[args.indexOf('-filter_complex') + 1];
|
||||
expect(filter).toContain('xstack=inputs=2');
|
||||
expect(filter).toContain('layout=0_0|0_540');
|
||||
expect(filter).toContain('layout=0_0|0_1080');
|
||||
expect(filter).toContain('[0:v]split=2[vin0_0][vin0_1]');
|
||||
expect(filter).toContain('[vin0_0]trim=start=0:duration=5');
|
||||
expect(filter).toContain('[1:v]trim=start=0:duration=5');
|
||||
@@ -174,6 +197,6 @@ describe('recording composer', () => {
|
||||
|
||||
const filter = args[args.indexOf('-filter_complex') + 1];
|
||||
expect(filter).toContain('xstack=inputs=3');
|
||||
expect(filter).toContain('layout=0_0|0_540|640_540');
|
||||
expect(filter).toContain('layout=0_0|0_1080|1280_1080');
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user