上一篇文章发送g711a的rtp包,要求原始的音频文件已经是进行了g711a转码好的.这篇文章介绍通过javacv实现音频文件转码为g711a并实现推流.
maven依赖
<!-- 媒体只用到以下两个,javacv、ffmpeg -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.5.6</version>
</dependency>
<!-- ffmpeg全平台引入 -->
<!-- <dependency>-->
<!-- <groupId>org.bytedeco</groupId>-->
<!-- <artifactId>ffmpeg-platform</artifactId>-->
<!-- <version>4.4-1.5.6</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>ffmpeg</artifactId>
<version>4.4-1.5.6</version>
<classifier>windows-x86_64</classifier>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>ffmpeg</artifactId>
<version>4.4-1.5.6</version>
<classifier>linux-x86_64</classifier>
</dependency>
示例代码:
package com.hisql.iot.javacv.util;
import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.ffmpeg.global.avutil;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import java.util.Date;
public class Wav2PCMARtp {
public static void main(String[] args) throws Exception {
String inputFilePath = "d:\\audio.wav";
String rtpDestination = "192.168.2.167";
int rtpPort = 8000;
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("rtp://" + rtpDestination + ":" + rtpPort, 1);
//recorder.setAudioCodec(avcodec.AV_CODEC_ID_PCM_MULAW); // G711a u-law
recorder.setAudioCodec(avcodec.AV_CODEC_ID_PCM_ALAW); // G711a a-law
recorder.setSampleRate(8000);
recorder.setSampleFormat(avutil.AV_SAMPLE_FMT_S16);
recorder.setAudioBitrate(64000);
recorder.start();
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFilePath);
grabber.start();
Frame frame;
while ((frame = grabber.grabSamples()) != null) {
long timestamp = grabber.getTimestamp();
System.out.println(">>>>>>>>" + new Date(timestamp));
recorder.setTimestamp(timestamp);
recorder.record(frame);
}
recorder.stop();
grabber.stop();
}
}