ffmpeg工作遇见坑

在以往的output里一直复制input的condeccontext,今天沿用代码时候发现视频播放时候有很大部分缺失,查看一下发现output的timebase比起input的timebase大很多,这不正常。反复对比之前跟现在的差别,发现了我在input的时候多了一个打开解码器的过程,这个导致了我output的timebase不同。这次Mark下来防止以后再遇见。

在重编码视频时候我发现视频会不行卡顿跟混乱,这是因为解码时候将frame缓冲下来,而data受到了上一帧的数据,正确做法是copy数据下来。


在使用ffmpeg滤镜时候,假如你使用"[in1]scale = iw / 2:ih / 2[in_tmp]; [in_tmp]split = 4[in_1][in_2][in_3][in_4]; [in_1]pad = iw * 2:ih * 2[a]; [a][in_2]overlay = w[b]; [b][in_3]overlay = 0:h[d]; [d][in_4]overlay = w:h[out]"这条拼接指令时候,你会发现十分慢,原因是在缩放那边,所以正确做法是先自己在程序缩放后再进行拼接,那样效率大大提高,不过还有个问题就是encode那边,现在还没有办法解决这个问题,先再研究研究,最好是能做到一帧耗时在10ms内。


在使用H264的编码时候avcodec_open2失败,"broken ffmpeg default settings detected" and "use an encoding preset (vpre)",这是因为参数设置错了,一下是检测:

 Detect default ffmpeg settings and terminate with an error. */
     if( b_open )
     {
         int score = 0;
         score += h->param.analyse.i_me_range == 0;
         score += h->param.rc.i_qp_step == 3;
         score += h->param.i_keyint_max == 12;
         score += h->param.rc.i_qp_min == 2;
         score += h->param.rc.i_qp_max == 31;
         score += h->param.rc.f_qcompress == 0.5;
         score += fabs(h->param.rc.f_ip_factor - 1.25) < 0.01;
         score += fabs(h->param.rc.f_pb_factor - 1.25) < 0.01;
         score += h->param.analyse.inter == 0 && 
h->param.analyse.i_subpel_refine == 8;
         if( score >= 5 )
         {
             x264_log( h, X264_LOG_ERROR, "broken ffmpeg default 
settings detected\n" );
             x264_log( h, X264_LOG_ERROR, "use an encoding preset (e.g. 
-vpre medium)\n" );
             x264_log( h, X264_LOG_ERROR, "preset usage: -vpre  
-vpre \n" );
             x264_log( h, X264_LOG_ERROR, "speed presets are listed in 
x264 --help\n" );
             x264_log( h, X264_LOG_ERROR, "profile is optional; x264 
defaults to high\n" );
             return -1;
         }
     }

在上面可以看到,如果参数设置错误就会导致上述错误。

We must at least set 4 param of the AVCodecContext before open it.
/*default settings for x264*/
        ctx->me_range = 16;
        ctx->max_qdiff = 4;
        ctx->qmin = 10;
        ctx->qmax = 51;
        ctx->qcompress = 0.6;

这个才能编译通过。


在重打一个sdl项目时候,因为修改了底层,将一个推送buffer改为要时候才分发,为了以后的业务发展,但这也导致了这几天的bug之旅。发现在部分视频里视音频是同步的,但不知为什么视频的buffer的size一直增长。如果将它控制后发现视音不同步。这就进入了尴尬的局面了,这几天里我一直以为是自己的buffer那里同步不好,结果改了很多次,还是那样子。为什么呢?一直找,最后不得已看回之前的代码demo那里,发现是自己的代码出问题的真正原因是在Input时候就错了。那时候改底层时候,没有考虑 av_audio_fifo_size过大的,所以就导致了后面的情况出现。


为什么我明明直接copy源视频编码器信息,然后再写入保存到MP4,反而发现视频帧写不进去。这个是在弄播放器时候,我打算插入一段视频作为拼接,为了提高效率,我打算将短视频那方重编码成长那方,因此正常情况下,将源视频的编码信息copy到目标视频,然后测试,发现仅仅是写入长源那个也写不成功,发现一切都没有出错,那么问题出在哪里了。问题就出在那个打开编码器那边,因为当初初始化那边信息,仅仅是copy,那样没有办法打开编码器,你会发现很多奇怪的错误,根据错误提示,以及Google,你发现终于可以编译了,而这一切恭喜你,进入一个新的大坑,这个坑就是我刚刚遇见的情况,因为编码器信息不对,而你乱改后,反而导致源那边错误。所以成也萧何败萧何,好好配好那边的编码器信息就可以了。



你可能感兴趣的:(FFmpeg)