我正在努力捕获并将音频流传输到RTMP服务器.我在MacOS下工作(在Xcode中),所以为了捕获音频样本缓冲区我使用AVFoundation-framework.但是对于编码和流媒体,我需要使用ffmpeg-API和libfaac编码器.因此输出格式必须是AAC(用于支持iOS设备上的流播放).
我遇到了这样的问题:音频捕获设备(在我的案例中是罗技相机)为我提供了512个LPCM样本的样本缓冲区,我可以选择16000,24000,36000或48000 Hz的输入采样率.当我将这512个样本提供给AAC编码器(配置为适当的采样率)时,我听到一个缓慢而抽搐的音频(在每帧之后看起来像是沉默的骰子).
我想通了(也许我错了),libfaac编码器只接受1024个样本的音频帧.当我将输入采样率设置为24000并在编码之前将输入采样缓冲区重采样为48000时,我获得1024个重采样样本.将这些1024个样本编码到AAC后,我听到输出声音正确.但是,当输出采样率必须为48000 Hz时,我的网络摄像头会在缓冲区中为任何输入采样率生成512个样本.所以我需要在任何情况下进行重采样,重新采样后我不会在缓冲区中获得1024个样本.
有没有办法在ffmpeg-API功能中解决这个问题?
我将不胜感激任何帮助.
PS:我想我可以累积重采样缓冲区,直到样本数变为1024,然后对其进行编码,但这是流,因此会产生时间戳和其他输入设备的麻烦,并且这种解决方案不合适.
当前问题出自[问题]中描述的问题:如何使用从CMSampleBufferRef(AVFoundation)获得的数据填充音频AVFrame(ffmpeg)?
这是一个带有音频编解码器配置的代码(还有视频流,但视频工作正常):
/*global variables*/
static AVFrame *aframe;
static AVFrame *frame;
AVOutputFormat *fmt;
AVFormatContext *oc;
AVStream *audio_st, *video_st;
Init ()
{
AVCodec *audio_codec, *video_codec;
int ret;
avcodec_register_all();
av_register_all();
avformat_network_init();
avformat_alloc_output_context2(&oc, NULL, "flv", filename);
fmt = oc->oformat;
oc->oformat->video_codec = AV_CODEC_ID_H264;
oc->oformat->audio_codec = AV_CODEC_ID_AAC;
video_st = NULL;
audio_st = NULL;
if (fmt->video_codec != AV_CODEC_ID_NONE)
{ //… /*init video codec*/}
if (fmt->audio_codec != AV_CODEC_ID_NONE) {
audio_codec= avcodec_find_encoder(fmt->audio_codec);
if (!(audio_codec)) {
fprintf(stderr, "Could …Run Code Online (Sandbox Code Playgroud) 我完全清楚使用中的法律限制,libfaac但这仅仅是出于我的测试目的.
我编ffmpeg有faac启用.因此,当我尝试将.mp3转换为.m4a时,这是我得到的错误.请解决此问题.我在.mp3的两个不同来源上尝试过,我仍然得到同样的错误.
[user@ip-10-161-13-26 ~]$ ffmpeg -i Kalimba.mp3 -c:a libfaac Kalimba.m4a
ffmpeg version 0.11.1 Copyright (c) 2000-2012 the FFmpeg developers
built on May 4 2013 09:33:27 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
configuration: --enable-libfaac --enable-nonfree --disable-yasm
libavutil 51. 54.100 / 51. 54.100
libavcodec 54. 23.100 / 54. 23.100
libavformat 54. 6.100 / 54. 6.100
libavdevice 54. 0.100 / 54. 0.100
libavfilter 2. 77.100 / 2. 77.100
libswscale 2. 1.100 / 2. 1.100
libswresample 0. …Run Code Online (Sandbox Code Playgroud) 我可以通过命令行给ffmpeg视频进行转换,并且它可以快乐地转换它们,但是当我要求它转换为rails时,它会返回"Unknown encoder libfaac",无论我给它的视频.
我用它来调用它:process encode_video:[:mp4,resolution:"640x480"]
我已经花了好几个小时尝试(不成功)在Windows上用libfaac编译ffmpeg,但现在它看起来很荒谬,因为我传递的所有东西都不是aac.这是怎么回事?