Как выполнить запись FFmpeg из обычного потока RTP с паузами?Javascript

Форум по Javascript
Ответить
Anonymous
 Как выполнить запись FFmpeg из обычного потока RTP с паузами?

Сообщение Anonymous »

Я создаю решение для потоковой передачи 1 к N с использованием библиотеки mediasoup node.js и пытаюсь решить проблему с записью видео HLS.
У меня уже есть работающее решение для записи одного потока с использованием FFmpeg. Но мне нужно иметь возможность приостанавливать запись/черный экран/записывать последний кадр после того, как продюсер перестанет отправлять видео (например, пользователь закрывает браузер), пока они не присоединятся снова. Я хочу иметь одну непрерывную запись нескольких потоков.
У меня проблема с ffmpeg: когда пользователь отключается, процесс ffmpeg останавливается из-за таймаута. Я пробовал много решений, таких как увеличение различных таймаутов, но ничего не помогает.
Это мой текущий код для записи, который мне нужно изменить:

Код: Выделить всё

export class FFmpeg {
private _recordInfo: RecordInfo;
private _process: ChildProcessWithoutNullStreams | undefined;
private _observer: EventEmitter;

constructor(recordInfo: RecordInfo) {
this._recordInfo = recordInfo;
this._process = undefined;
this._observer = new EventEmitter();
this._createProcess();
}

private _createProcess() {
const sdpString = createSdpText(this._recordInfo);
const sdpStream = convertStringToStream(sdpString);

this._process = child_process.spawn("ffmpeg", this._commandArgs);

sdpStream.pipe(this._process.stdin);
}

public kill () {
if (!this._process) return;
this._process.kill('SIGINT');
}

private get _commandArgs() {
let filePath = `${RECORDINGS_FOLDER}/${this._recordInfo.folderName}/playlist`;

let commandArgs = [
"-loglevel", "warning",
"-protocol_whitelist", "pipe,udp,rtp",

"-fflags", "+genpts+discardcorrupt+igndts+nobuffer",
"-flags", "low_delay",

"-analyzeduration", "0",
"-probesize", "32",

"-rw_timeout", "0",
"-timeout", "0",
"-max_delay", "0",
"-f", "sdp",
"-i", "pipe:0",

"-r", "30",

"-map", "0:v:0",
"-c:v", "libx264",

"-preset", "ultrafast",
"-tune", "zerolatency",

"-b:v", "1500k",
"-level:v", "4.1",
"-pix_fmt", "yuv420p",
"-g", "30",
];

commandArgs = commandArgs.concat([
"-movflags", "+frag_keyframe+empty_moov",
"-f", "hls",
"-hls_time", "4",
"-hls_list_size", "0",
"-hls_flags", "independent_segments",
`${filePath}.m3u8`
]);

return commandArgs;
}
};
Этот код используется из другого файла JS, который создает PlainTransport и Consumer mediasoup для отправки пакетов RTP на адрес 127.0.0.1:, где работает ffmpeg.
>

Подробнее здесь: https://stackoverflow.com/questions/798 ... ith-pauses
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»