ffmpeg 编码 h264失败问题

lucasli 发布于 2019/03/02 18:21
阅读 89
收藏 0

华为云11月刊推送:DIY微信问答机器人,高性能计算代码的20个技巧!>>>

ffmpeg版本是0.11,编译ffmpeg时合入libx264。

采用ndk编译。

测试代码如下:

 

int VCodec::encoder_from_nv21(
         int width,
         int height,
         vbyte8_ptr srcdata,
         vint32_t srclen,
         vbyte8_ptr *dest,
         vint32_t *destlen,
         int keyframe)
 {
     TRACE_LOG("entering function encoder_from_nv21");
 
     uint32_t out_size;
     vint32_t ret = V_OK;
 
     if(open_codec() != V_OK) {
         return V_FAIL;
     }
 
     _av_codec_ctx->codec->capabilities = CODEC_CAP_TRUNCATED;
     _av_codec_ctx->codec->type = AVMEDIA_TYPE_VIDEO;
     _picture->pts = AV_TIME_BASE;
     _picture->key_frame = keyframe;
 
     TRACE_LOG("w=%d,h=%d,c->w=%d, c->h=%d", width, height, _av_codec_ctx->width, _av_codec_ctx->height);
     avpicture_fill((AVPicture*)_tmp_picture, srcdata, PIX_FMT_NV21, width, height);
     video_translate(_tmp_picture,
             width,
             height,
             PIX_FMT_NV21,
             _picture,
             _av_codec_ctx->width,
             _av_codec_ctx->height,
             PIX_FMT_YUV420P);
 
     out_size = avcodec_encode_video(_av_codec_ctx, _outbuf, MAX_BUFSIZE, _picture);
 
     TRACE_LOG("encoder_from_nv21::out_size:%d", out_size);
 
     if(out_size > 0) {
         *dest = _outbuf;
         *destlen = out_size;
         ret = V_OK;
     } else {
         ret = V_FAIL;
     }
 
     while(out_size) {
         out_size = avcodec_encode_video(_av_codec_ctx, _outbuf, MAX_BUFSIZE, NULL);
         if(out_size > 0) {
         }
     }
 
     close_codec();
     TRACE_LOG("exit encoder_from_nv21");
     return ret;                                                                                                                                                                                                                        
 }

 

    int VCodec::video_translate(AVFrame* srcframe, int srcw, int srch, PixelFormat srcfmt,
         AVFrame *dstframe, int dstw, int dsth, PixelFormat dstfmt)
 {
     struct SwsContext * swsctx = NULL;
     vint32_t dst_size = avpicture_get_size(dstfmt, dstw, dsth);
     if(dst_size > _tmp_size) {
         _tmp_size = dst_size;
         if(_tmp_buffer) {
             av_free(_tmp_buffer);
         }
         _tmp_buffer = (vbyte8_ptr)av_malloc(_tmp_size);
     }
     swsctx = sws_getContext(srcw,
             srch,
             srcfmt,
             dstw,
             dsth,
             dstfmt,
             SWS_BILINEAR,
             //SWS_BICUBIC,
             //SWS_GAUSS,//SWS_BICUBIC,//SWS_FAST_BILINEAR,
             NULL,
             NULL,
             NULL);
     avpicture_fill((AVPicture*)dstframe, _tmp_buffer, dstfmt, dstw, dsth);
     sws_scale(swsctx, srcframe->data, srcframe->linesize, 0, srch, dstframe->data, dstframe->linesize);
     sws_freeContext(swsctx);
     return V_OK;
 }

上面代码中avcodec_encode_video()总是返回0

 

加载中
返回顶部
顶部