So führen Sie eine FFmpeg-Aufzeichnung aus einem einfachen RTP-Stream mit Pausen durchJavaScript

Javascript-Forum
Anonymous
 So führen Sie eine FFmpeg-Aufzeichnung aus einem einfachen RTP-Stream mit Pausen durch

Post by Anonymous »

Ich baue eine 1-zu-N-Streaming-Lösung mit der Bibliothek mediasoup node.js auf und versuche, ein Problem mit der Aufzeichnung von HLS-Videos zu lösen.
Ich habe bereits eine funktionierende Lösung für die Aufzeichnung eines Streams mit FFmpeg. Aber ich muss in der Lage sein, die Aufnahme / den schwarzen Bildschirm / das letzte Bild anzuhalten, nachdem der Produzent das Senden von Videos beendet hat (z. B. wenn der Benutzer den Browser schließt), bis er wieder beitritt. Ich möchte eine kontinuierliche Aufzeichnung der mehreren Streams haben.
Ich habe ein Problem mit ffmpeg, dass der ffmpeg-Prozess aufgrund einer Zeitüberschreitung stoppt, wenn der Benutzer die Verbindung trennt. Ich habe viele Lösungen ausprobiert, wie z. B. die Erhöhung verschiedener Zeitüberschreitungen, aber nichts scheint zu helfen.
Dies ist mein aktueller Code für die Aufzeichnung, den ich ändern muss:

Code: Select all

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;
}
};
Dieser Code wird aus einer anderen JS-Datei verwendet, die den PlainTransport und Consumer von mediasoup erstellt, um RTP-Pakete an 127.0.0.1:
zu senden, wo ffmpeg ausgeführt wird.
Vielen Dank für jede Hilfe.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post