如何解决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秒。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。