ffmpeg开发中的问题(十一)

      今天开发一个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].
>=0 on success, negative error code on failure

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 
  )
这个函数成功, 则返回0, 

且:

如果got_packet_ptr>0, 则表示packet有数据,这个很重要,  =0 则表示空

这样就可以测试是否编码成功了,如果失败, 那问题就在这个函数的前面了,而不是本身




每天早上叫醒你的不是闹钟,而是心中的梦~
原文地址:https://www.cnblogs.com/vintion/p/4116983.html