Audio LibAV-采取什么方法进行实时音频和视频捕获?

Audio LibAV-采取什么方法进行实时音频和视频捕获?,audio,encoding,streaming,libav,Audio,Encoding,Streaming,Libav,我使用libav将原始RGB24帧编码为h264,并将其muxing为flv。这很有效 一切都很好,我已经流了超过48小时,没有任何问题!我的下一步 是向流中添加音频。我将捕获现场音频,并对其进行编码 实时使用speex、mp3或nelly moser 背景信息 我不熟悉数字音频,因此我可能做错了事情。但基本上我的应用程序得到了一个带有交错音频的“浮动”缓冲区。这个“audioIn”函数由我使用的应用程序框架调用。缓冲区每个通道包含256个样本, 我有两个频道。因为我可能在混合术语,所以我使用

我使用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;
}