Audio LibAV-采取什么方法进行实时音频和视频捕获?
我使用libav将原始RGB24帧编码为h264,并将其muxing为flv。这很有效 一切都很好,我已经流了超过48小时,没有任何问题!我的下一步 是向流中添加音频。我将捕获现场音频,并对其进行编码 实时使用speex、mp3或nelly moser 背景信息 我不熟悉数字音频,因此我可能做错了事情。但基本上我的应用程序得到了一个带有交错音频的“浮动”缓冲区。这个“audioIn”函数由我使用的应用程序框架调用。缓冲区每个通道包含256个样本, 我有两个频道。因为我可能在混合术语,所以我使用 数据:Audio LibAV-采取什么方法进行实时音频和视频捕获?,audio,encoding,streaming,libav,Audio,Encoding,Streaming,Libav,我使用libav将原始RGB24帧编码为h264,并将其muxing为flv。这很有效 一切都很好,我已经流了超过48小时,没有任何问题!我的下一步 是向流中添加音频。我将捕获现场音频,并对其进行编码 实时使用speex、mp3或nelly moser 背景信息 我不熟悉数字音频,因此我可能做错了事情。但基本上我的应用程序得到了一个带有交错音频的“浮动”缓冲区。这个“audioIn”函数由我使用的应用程序框架调用。缓冲区每个通道包含256个样本, 我有两个频道。因为我可能在混合术语,所以我使用
//输入=带有音频样本的数组
//缓冲区大小=256
//n通道=2
void audioIn(浮点*输入,int bufferSize,int nChannels){
//从浮点转换为S16
short*buf=新签名的short[bufferSize*2];
对于(inti=0;i
现在我有了一个缓冲区,其中每个样本是16位,我将这个short*缓冲区传递给我的
包装器av.addAudioFrame()
函数。在这个函数中,我在编码之前创建一个缓冲区
音频。据我所知,音频编码器的AVCodecContext
设置帧大小。调用avcodec\u encode\u audio2()
时,此帧大小必须与缓冲区中的样本数匹配。我之所以这样认为,是因为现在的情况
然后,特别是这句话:
如果未设置,frame->nb_samples
必须等于除最后一帧之外的所有帧的avctx->frame_size
(如果我在这方面有错误,请在此更正)
编码后,我调用av\u interleaved\u write\u frame()
实际写入帧。
当我使用mp3作为编解码器时,我的应用程序会运行大约1-2分钟,然后我的服务器(接收视频/音频流(flv,tcp))会断开连接,并显示一条消息“帧太大:14485504
”。生成此消息的原因是rtmp服务器正在获取一个非常大的帧。这可能是因为我没有正确地与libav交错
问题:
- 有很多我不确定的地方,即使在浏览libav的源代码时也是如此,因此我希望有人有一个音频编码的工作示例,它来自一个来自“外部”libav的缓冲区(即您自己的应用程序)。i、 e.如何创建一个足以容纳编码器的缓冲区?当您需要等待缓冲区填满时,如何使“实时”流媒体工作
- 正如我在上面写的,在编码之前,我需要跟踪缓冲区。其他人有这样做的代码吗?我现在用的是AVAudioFifo。对音频进行编码并填充/读取缓冲区的功能也在这里:
- 我使用--enable debug=3编译并禁用优化,但没有看到任何优化
调试信息。如何使libav更加冗长
谢谢
// input = array with audio samples
// bufferSize = 256
// nChannels = 2
void audioIn(float * input, int bufferSize, int nChannels) {
// convert from float to S16
short* buf = new signed short[bufferSize * 2];
for(int i = 0; i < bufferSize; ++i) { // loop over all samples
int dx = i * 2;
buf[dx + 0] = (float)input[dx + 0] * numeric_limits<short>::max(); // convert frame of the first channel
buf[dx + 1] = (float)input[dx + 1] * numeric_limits<short>::max(); // convert frame of the second channel
}
// add this to the libav wrapper.
av.addAudioFrame((unsigned char*)buf, bufferSize, nChannels);
delete[] buf;
}