欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

实战教程:如何在Java中使用FFmpegFrameRecorder类

最编程 2024-02-15 11:32:55
...

实例1: initRecorder

import org.bytedeco.javacv.FFmpegFrameRecorder; //导入依赖的package包/类
void initRecorder(String filename) {

		try {
			log.info(String.format("initRecorder %s", filename));

			recorder = new FFmpegFrameRecorder(filename, imageSize.width(), imageSize.height(), 1);

			//recorder.setFormat("flv");
			// recorder.setFormat("mjpeg");
			recorder.setFormat("mp4");
			 
			recorder.setSampleRate(sampleAudioRateInHz);
			recorder.setImageWidth(imageSize.width());
			recorder.setImageHeight(imageSize.height());

			// re-set in the surface changed method as well
			recorder.setFrameRate(frameRate);
			recorder.start();
			log.info("recorder.setFrameRate(frameRate)");

			// Create audio recording thread
			// audioRecordRunnable = new AudioRecordRunnable();
			// audioThread = new Thread(audioRecordRunnable);

			/*
			 * 
			 * recorder = new FFmpegFrameRecorder(filePath, width, height);
			 * recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
			 * recorder.setFormat("mp4"); recorder.setFrameRate(VIDEO_FPS);
			 * recorder.setVideoBitrate(16384);
			 * recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
			 */

		} catch (Exception e) {
			Logging.logError(e);
		}
	}
 

实例2: initRecorder

import org.bytedeco.javacv.FFmpegFrameRecorder; //导入依赖的package包/类
private void initRecorder() {

        Log.w(LOG_TAG,"init recorder");

        if (yuvIplimage == null) {
            yuvIplimage = IplImage.create(imageWidth, imageHeight, IPL_DEPTH_8U, 2);
            Log.i(LOG_TAG, "create yuvIplimage");
        }

        Log.i(LOG_TAG, "ffmpeg_url: " + ffmpeg_link);
        recorder = new FFmpegFrameRecorder(ffmpeg_link, imageWidth, imageHeight, 1);
        recorder.setFormat("flv");
        recorder.setSampleRate(sampleAudioRateInHz);
        // Set in the surface changed method
        recorder.setFrameRate(frameRate);

        Log.i(LOG_TAG, "recorder initialize success");

        audioRecordRunnable = new AudioRecordRunnable();
        audioThread = new Thread(audioRecordRunnable);
        runAudioThread = true;
    }
 

实例3: onPreviewFrame

import org.bytedeco.javacv.FFmpegFrameRecorder; //导入依赖的package包/类
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
    /* get video data */
    if (yuvIplimage != null && recording) {
        yuvIplimage.getByteBuffer().put(data);

        Log.v(LOG_TAG,"Writing Frame");
        try {
            long t = 1000 * (System.currentTimeMillis() - startTime);
            if (t > recorder.getTimestamp()) {
                recorder.setTimestamp(t);
            }
            recorder.record(yuvIplimage);
        } catch (FFmpegFrameRecorder.Exception e) {
            Log.v(LOG_TAG,e.getMessage());
            e.printStackTrace();
        }
    }
}
 

实例4: saveVid

import org.bytedeco.javacv.FFmpegFrameRecorder; //导入依赖的package包/类
public void saveVid(File f, int width, int fps, ProgressDisplay d, ActionListener onFinish) {
	saveStopped = false;
	new Thread(() -> {
		try {
			d.setProgress(0, "Starting export");
			d.setCancel(ae -> saveStopped = true);

			String name	= f.getName();
			int dotIdx	= name.lastIndexOf('.');
			if(dotIdx !=- 1)
				name = name.substring(0, dotIdx);
			String ext = ".mp4";

			File out = StringUtil.resolveConflictName(f.getParentFile(), name+ext, false);

			int height = (int)Math.round(width * getSourceHeight()/(float)getSourceWidth());
			height = height %2 == 0 ? height : height + 1; 
			FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(out.getAbsolutePath(), width, height);
			recorder.setFrameRate(fps);
			recorder.setFormat("mp4");
			recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
			//recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
			recorder.setVideoBitrate(recorder.getImageWidth() * recorder.getImageHeight() * fps * 10);

			recorder.setVideoQuality(.1);
			recorder.start();

			for(int i = 0; i < frames && !saveStopped; i++) {
				try {
					setX(i/(float)(frames-1));
					d.setProgress((i/(float)(frames-1))*.95f, "Writing frame "+i+" of " + frames);
					BufferedImage frame = renderFrame(width);
					BufferedImage img = new BufferedImage(frame.getWidth(), frame.getHeight(), BufferedImage.TYPE_INT_RGB);
					img.getGraphics().drawImage(frame, 0, 0, null);
					recorder.record(new Java2DFrameConverter().convert(img), avutil.AV_PIX_FMT_ARGB);

				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			d.setProgress(.98, "Finishing export...");
			recorder.stop();
			recorder.close();
		} catch (Exception e1) {
			e1.printStackTrace();
		} finally {
			if(onFinish != null)
				SwingUtilities.invokeLater(() -> onFinish.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_FIRST, "save")));
		}
	}).start();
}
 

实例5: startRecording

import org.bytedeco.javacv.FFmpegFrameRecorder; //导入依赖的package包/类
public void startRecording() {
	try {
		if (recorder == null){
			initRecorder(name);
		}
		recorder.start();
		// startTime = System.currentTimeMillis();
		recording = true;
		// audioThread.start();
	} catch (FFmpegFrameRecorder.Exception e) {
		e.printStackTrace();
	}
}
 

推荐阅读