【发布时间】:2017-01-04 17:28:51
【问题描述】:
我使用 isamplegrabber sampleCB 回调来获取音频样本,我可以从 imediasample 获取缓冲区和缓冲区长度,我使用 avcodec_fill_audio_frame(frame,ost->enc->channels,ost->enc->sample_fmt,(uint8_t *)buffer ,length,0) 来制作一个 avframe ,但是这个框架在我的 mux 文件中没有任何音频!我认为长度比 frame_size 小得多。 每个人都可以帮助我吗?或者如果可能的话给我一些例子。 谢谢
这是我的示例 cb 代码:
HRESULT AudioSampleGrabberCallBack::SampleCB(double Time, IMediaSample*pSample){
BYTE *pBuffer;
pSample->GetPointer(&pBuffer);
long BufferLen = pSample->GetActualDataLength();
muxer->PutAudioFrame(pBuffer,BufferLen);
}
这是 samplegrabber pin 媒体类型:
AM_MEDIA_TYPE pmt2;
ZeroMemory(&pmt2, sizeof(AM_MEDIA_TYPE));
pmt2.majortype = MEDIATYPE_Audio;
pmt2.subtype = FOURCCMap(0x1602);
pmt2.formattype = FORMAT_WaveFormatEx;
hr = pSampleGrabber_audio->SetMediaType(&pmt2);
之后我使用 ffmpeg 多路复用示例来处理帧,我认为我只需要更改代码的信号生成部分:
AVFrame *Muxing::get_audio_frame(OutputStream *ost,BYTE* buffer,long length)
{
AVFrame *frame = ost->tmp_frame;
int j, i, v;
uint16_t *q = (uint16_t*)frame->data[0];
int buffer_size = av_samples_get_buffer_size(NULL, ost->enc->channels,
ost->enc->frame_size,
ost->enc->sample_fmt, 0);
// uint8_t *sample = (uint8_t *) av_malloc(buffer_size);
av_samples_alloc(&frame->data[0], frame->linesize, ost->enc->channels, ost->enc->frame_size, ost->enc->sample_fmt, 1);
avcodec_fill_audio_frame(frame, ost->enc->channels, ost->enc->sample_fmt,frame->data[0], buffer_size, 1);
frame->pts = ost->next_pts;
ost->next_pts += frame->nb_samples;
return frame;
}
【问题讨论】:
-
问题没有明确定义。您需要提供有关 DirectShow 捕获的更多数据,以及尝试使用 libav 编写的代码。
-
很简单!我想使用 directshow 抓取一个媒体样本并制作一个 avframe,我为视频帧执行此操作,但我无法为音频帧执行此操作。
-
是的。每个人都可以提供帮助。
标签: c++ qt audio ffmpeg directshow