javacv-ffmpeg(五)OutputStream方式截取-音频截取

说明

以截取音频演示OutputStream方式输出截取后的媒体到内存中,无需保存文件。后期可以直接二进制保存到第三方库(redis、mysql等)或者转化成base64存储传输。

一、代码示例

		OutputStream fileOS = null;
		byte[] fileByte = null;
		//CustomFrameGrabber15 是我系列四中重写后的类 也可以用FFmpegFrameGrabber
		CustomFrameGrabber15 grabber = null;
		FFmpegFrameRecorder recorder = null;
		// 获取视频源
			grabber = new CustomFrameGrabber15(inputFile, scheduleinfo);
			// 微秒 大概为设置时间的两倍
			grabber.setOption(TimeoutOption.RW_TIMEOUT.getKey(), timeout);
			// rtsp 默认udp 丢包 改为tcp
			grabber.setOption("rtsp_transport", "tcp");
			grabber.start();
			
			fileOS = new ByteArrayOutputStream();
			recorder = new FFmpegFrameRecorder(fileOS, audioChannel);
			recorder.setAudioCodec(avcodec.AV_CODEC_ID_PCM_S16LE);
			recorder.setAudioOption("ar", "16000");
			recorder.setFormat(VoiceFormat);
			recorder.start();
			Frame frame = null;
			while (isStart) {
    
    
				frame = grabber.grabSamples();
				recorder.record(frame);
			}
			
		recorder.stop();
		recorder.release();
		//这个就可以随意操作了
		fileByte = ((ByteArrayOutputStream) fileOS).toByteArray();
		grabber.stop();
		grabber.release();
		

一、如何时间段截取

本来不想写,这个自己想想也就知道了

				// 时间条件满足 切换输出  timestamp 当前帧时间 frequency_time时间段长度
				if (timestamp > nexttime) {
    
    
				
					recorder.stop();
					recorder.release();

					fileByte = ((ByteArrayOutputStream) fileOS).toByteArray();

					fileOS = new ByteArrayOutputStream();
					recorder = new FFmpegFrameRecorder(fileOS, audioChannel);
					recorder.setAudioCodec(avcodec.AV_CODEC_ID_PCM_S16LE);
					recorder.setAudioOption("ar", "16000");
					recorder.setFormat(VoiceFormat);

					recorder.start();
					nexttime = nexttime + frequency_time;
					continue;
				}

猜你喜欢

转载自blog.csdn.net/u013947963/article/details/103425632