私はisamplegrabberサンプルコールバックを使用してオーディオサンプルを取得しました。imediasampleからバッファとバッファ長を取得できます。avcodec_fill_audio_frame(frame、ost-> enc-> channels、ost-> enc-> sample_fmt、(uint8_t *)バッファー、長さ、0)を使用してavframeを作成しますが、このフレームはmuxファイルにオーディオを作成しません!私は長さがframe_sizeよりも非常に小さいと思います。 一人一人は私を助けてくれますか?可能であれば、私にいくつかの例を教えてください。ffmpeg audio frame from directshow sampleCB imediasample
HRESULT AudioSampleGrabberCallBack::SampleCB(double Time, IMediaSample*pSample){
BYTE *pBuffer;
pSample->GetPointer(&pBuffer);
long BufferLen = pSample->GetActualDataLength();
muxer->PutAudioFrame(pBuffer,BufferLen);
}
、これはsamplegrabberピンのメディアタイプです:その後
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の多重化の例を使用して、私は必要だと思う が、これは私のsamplecbコードであるあなたに
に感謝しますコードの信号生成部分を変更する場合のみ:
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を使用してmediasampleを取得し、それのavframeをしたい、私はビデオフレームのためにこれを行うが、私はそうすることはできませんでしたオーディオフレーム。 – overtech
はい。誰もが助けることができます。 – Felix