今天开发一个blackmagic的程序, 要用到ffmpeg的编码库
当然,对于视频,很好处理, 没一上午,就得到了清晰可见的视频, 甚是满意.
但处理音频时颇费周折,具体曲折如下:
1. 硬件不支持
blackmagic的产品各异, 有的支持获取声音, 有的不支持, 虽然用到的板卡可以抓取声音, 并存入文件.但打开的文件全为0, 要么全是噪声.
刚开始分析问题如下:
~Capture程序的模式选择不对
~抓取数据函数不对
~音频未写入
~就算写入,得到的原始的pcm , 播放的参数不对
从上到下,一一排除, 最后发现都不是.
得出结论:
硬件不支持
后来得到验证
启示:
开发过程中, 首先要确定最基本的问题是确信无疑的, 再一步一步往下走. 如果基础出错, 后面的就会一连串的出错. 如同解数学证明题一般.
若前提不对, 一切枉然.
软件开发要义:
确保硬件/驱动无误, 环境无误
换成sony的相机, 一切ok
2. avcodec_fill_audio_frame()
int avcodec_fill_audio_frame | ( | AVFrame * | frame, |
int | nb_channels, | ||
enum AVSampleFormat | sample_fmt, | ||
const uint8_t * | buf, | ||
int | buf_size, | ||
int | align | ||
) |
frame | the AVFrame frame->nb_samples must be set prior to calling the function. This function fills in frame->data, frame->extended_data, frame->linesize[0]. |
The buffer buf must be a preallocated buffer with a size big enough to contain the specified samples amount. The filled AVFrame data pointers will point to this buffer.
这里解释很清楚了, 要分配buf, 数据要正确, 且 frame->nb_samples要先赋值, 其它的就不用管了, 如果成功, 返回>0
实际上nb_samples就是编码器的frame_size. oaCodecCtx->frame_size....
3. avcodec_encode_audio2
int avcodec_encode_audio2 | ( | AVCodecContext * | avctx, |
AVPacket * | avpkt, | ||
const AVFrame * | frame, | ||
int * | got_packet_ptr | ||
) |
且:
如果got_packet_ptr>0, 则表示packet有数据,这个很重要, =0 则表示空
这样就可以测试是否编码成功了,如果失败, 那问题就在这个函数的前面了,而不是本身