FFmpeg-视频加背景音乐、H.264协议
具体代码请看:NDKPractice项目的ffmpeg88livepush
1.实现视频加背景音乐
private MediaInfoListener mMediaInfoListener = new MediaInfoListener() {
private long mAudioPts = 0;
private int mSampleRate = 0;
private int mChannels = 0;
@Override
public void musicInfo(int sampleRate, int channels) {
// 获取了音频的信息
try {
initAudioCodec(sampleRate, channels);
} catch (Exception e) {
e.printStackTrace();
}
this.mSampleRate = sampleRate;
this.mChannels = channels;
}
@Override
public void callbackPcm(byte[] pcmData, int size) {
// 把数据写入到 mAudioCodec 的 InputBuffer
int inputBufferIndex = mAudioCodec.dequeueInputBuffer(0);
if (inputBufferIndex >= 0) {
ByteBuffer byteBuffer = mAudioCodec.getInputBuffers()[inputBufferIndex];
byteBuffer.clear();
byteBuffer.put(pcmData);
// pts 44100 * 2 *2
mAudioPts += size * 1000000 / mSampleRate * mChannels * 2;
// size 22050*2*2
mAudioCodec.queueInputBuffer(inputBufferIndex, 0, size, mAudioPts, 0);
}
}
};
/**
* 音频的编码线程
*/
private static final class AudioEncoderThread extends Thread {
private final MediaMuxer mMediaMuxer;
private WeakReference<BaseVideoRecorder> mVideoRecorderWr;
private volatile boolean mShouldExit = false;
private MediaCodec mAudioCodec;
private MediaCodec.BufferInfo mBufferInfo;
private int mAudioTrackIndex = -1;
private long mAudioPts = 0;
private final CyclicBarrier mStartCb