• 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 则表示空

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




    每天早上叫醒你的不是闹钟,而是心中的梦~
  • 相关阅读:
    第一个Django demo
    内建函数
    Git积累
    区间dp
    【Spring】Spring AOP详解(转载)
    【git】git 常用命令(含删除文件)
    【idea】idea如何在maven工程中引入jar包
    【Java】Scanner类nextInt后使用nextLine无法读取输入
    【Java_Eclipse】Eclipse插件如何卸载?
    【MySQL】MySQL5.7等以上版本在Windows上的配置
  • 原文地址:https://www.cnblogs.com/vintion/p/4116983.html
Copyright © 2020-2023  润新知