说明
以截取音频演示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;
}