FFMPEG-如何在截断视频和音频的前几秒钟的同时对输入流进行转码

问题描述

我正在使用ffmpeg将屏幕记录(x11)输入流转码为MP4。我想截断流的前10秒,这只是一个空白屏幕(这是有意的)。

我了解从mp4转换为另一个mp4时如何使用ffmpeg修剪视频,但是在考虑到延迟和音频/视频同步的同时,我找不到任何可行的解决方案来处理输入流。

这是我当前的代码:

const { spawn } = require('child_process');
const { S3Uploader } = require('./utils/upload');

const MEETING_URL = process.env.MEETING_URL || 'Not present in environment';
console.log(`[recording process] MEETING_URL: ${MEETING_URL}`);

const args = process.argv.slice(2);
const BUCKET_NAME = args[0];
console.log(`[recording process] BUCKET_NAME: ${BUCKET_NAME}`);
const BROWSER_SCREEN_WIDTH = args[1];
const BROWSER_SCREEN_HEIGHT = args[2];
const MEETING_ID = args[3];
console.log(`[recording process] BROWSER_SCREEN_WIDTH: ${BROWSER_SCREEN_WIDTH},BROWSER_SCREEN_HEIGHT: ${BROWSER_SCREEN_HEIGHT},TASK_NUMBER: 43`);

const VIDEO_BITRATE = 3000;
const VIDEO_FRAMERATE = 30;
const VIDEO_GOP = VIDEO_FRAMERATE * 2;
const AUDIO_BITRATE = '160k';
const AUDIO_SAMPLERATE = 44100;
const AUDIO_CHANNELS = 2
const DISPLAY = process.env.DISPLAY;

const transcodeStreamToOutput = spawn('ffmpeg',[
    '-hide_banner','-loglevel','error',// disable interaction via stdin
    '-nostdin',// screen image size
    // '-s',`${BROWSER_SCREEN_WIDTH}x${BROWSER_SCREEN_HEIGHT}`,'-s','1140x720',// video frame rate
    '-r',`${VIDEO_FRAMERATE}`,// hides the mouse cursor from the resulting video
    '-draw_mouse','0',// grab the x11 display as video input
    '-f','x11grab','-i',':1.0+372,8',// '-i',`${DISPLAY}`,// grab pulse as audio input
    '-f','pulse','-ac','2','default',// codec video with libx264
    '-c:v','libx264','-pix_fmt','yuv420p','-profile:v','main','-preset','veryfast','-x264opts','nal-hrd=cbr:no-scenecut','-minrate',`${VIDEO_BITRATE}`,'-maxrate','-g',`${VIDEO_GOP}`,// apply a fixed delay to the audio stream in order to synchronize it with the video stream
    '-filter_complex','adelay=delays=1000|1000',// codec audio with aac
    '-c:a','aac','-b:a',`${AUDIO_BITRATE}`,`${AUDIO_CHANNELS}`,'-ar',`${AUDIO_SAMPLERATE}`,// adjust fragmentation to prevent seeking(resolve issue: muxer does not support non seekable output)
    '-movflags','frag_keyframe+empty_moov+faststart',// set output format to mp4 and output file to stdout
    '-f','mp4','-'
    ]
);

transcodeStreamToOutput.stderr.on('data',data => {
    console.log(`[transcodeStreamToOutput process] stderr: ${(new Date()).toISOString()} ffmpeg: ${data}`);
});

const timestamp = new Date();
const year = timestamp.getFullYear();
const month = timestamp.getMonth() + 1;
const day = timestamp.getDate();
const hour = timestamp.getUTCHours();
console.log(MEETING_ID);
const fileName = `${year}/${month}/${day}/${hour}/${MEETING_ID}.mp4`;
new S3Uploader(BUCKET_NAME,fileName).uploadStream(transcodeStreamToOutput.stdout);

// event handler for docker stop,not exit until upload completes
process.on('SIGTERM',(code,signal) => {
    console.log(`[recording process] exited with code ${code} and signal ${signal}(SIGTERM)`);
    process.kill(transcodeStreamToOutput.pid,'SIGTERM');
});

// debug use - event handler for ctrl + c
process.on('SIGINT',signal) => {
    console.log(`[recording process] exited with code ${code} and signal ${signal}(SIGINT)`)
    process.kill('SIGTERM');
});

process.on('exit',function(code) {
    console.log('[recording process] exit code',code);
});

任何帮助将不胜感激!

解决方法

在最后一次输入之后添加-ss X,以切断前X秒。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...