首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用avcodec_send_frame()和avcodec_receive_packet()替换avcodec_encode_audio2()/avcodec_encode_video2()?

如何用avcodec_send_frame()和avcodec_receive_packet()替换avcodec_encode_audio2()/avcodec_encode_video2()?
EN

Stack Overflow用户
提问于 2019-12-24 23:39:53
回答 1查看 2.3K关注 0票数 1

link的多路复用示例中,我尝试使用avcodec_send_frame()avcodec_receive_packet()而不是avcodec_encode_audio2()/avcodec_encode_video2(),因为它们已被弃用。在……里面

代码语言:javascript
复制
  352     ret = avcodec_encode_audio2(c, &pkt, frame, &got_packet);
  353     if (ret < 0) {
  354         fprintf(stderr, "Error encoding audio frame: %s\n", av_err2str(ret));
  355         exit(1);
  356     }
  357 
  358     if (got_packet) {
  359         ret = write_frame(oc, &c->time_base, ost->st, &pkt);
  360         if (ret < 0) {
  361             fprintf(stderr, "Error while writing audio frame: %s\n",
  362                     av_err2str(ret));
  363             exit(1);
  364         }
  365     }
  366 
  367     return (frame || got_packet) ? 0 : 1;

和在

代码语言:javascript
复制
  522     ret = avcodec_encode_video2(c, &pkt, frame, &got_packet);
  523     if (ret < 0) {
  524         fprintf(stderr, "Error encoding video frame: %s\n", av_err2str(ret));
  525         exit(1);
  526     }
  527 
  528     if (got_packet) {
  529         ret = write_frame(oc, &c->time_base, ost->st, &pkt);
  530     } else {
  531         ret = 0;
  532     }
  533 
  534     if (ret < 0) {
  535         fprintf(stderr, "Error while writing video frame: %s\n", av_err2str(ret));
  536         exit(1);
  537     }
  538 
  539     return (frame || got_packet) ? 0 : 1;

在使用avcodec_send_frame()avcodec_receive_packet()函数时,如何为got_packet变量赋值?如果这样做,如何更改代码?到目前为止我已经试过了

代码语言:javascript
复制
ret = avcodec_send_frame(c, frame);
if (ret < 0) {
    fprintf(stderr, "Error sending the frame to the audio encoder\n");
    exit(1);
}
if (ret = 0) {
    got_packet = avcodec_receive_packet(c, &pkt);
    if (got_packet == AVERROR(EAGAIN) || got_packet == AVERROR_EOF){
        fprintf(stderr, "Error receiving packet\n");
        return -1;}
    else if (got_packet < 0) {
        fprintf(stderr, "Error encoding audio frame\n");
        exit(1);
    }
    ret1 = write_frame(oc, &c->time_base, ost->st, &pkt);
    if (ret1 < 0) {
        fprintf(stderr, "Error while writing audio frame: %s\n",
                av_err2str(ret1));
        exit(1);
    }
    av_packet_unref(&pkt);
}
return (frame || got_packet) ? 0 : 1;

但是它不工作,我很难让它工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-22 17:59:26

avcodec_encode_video2()中,当输出数据包为空时,got_packet_ptr将为0。当输出包为非空时,以及在排出模式期间(在文件结束的情况下),当NULL被发送到avcodec_encode_video2()时,直到所有缓冲的项被刷新之后,它再次变为0,此时,avcodec_encode_video2()将等于0

在新的接口中,当buffer已满或进入排出模式时,avcodec_receive_packet()的返回值将等于0,类似于got_packet_ptr等于1。否则,avcodec_receive_packet()返回负错误代码AVERROR(EAGAIN),这意味着输出在当前状态下不可用-用户必须尝试发送输入或AVERROR_EOF,即编码器已完全刷新,将不再有输出数据包。

muxing.c示例中以以下方式使用新的接口对我很有效:

代码语言:javascript
复制
ret = avcodec_send_frame(c, frame);
if (ret < 0) {
    fprintf(stderr, "Error sending a frame for encoding\n");
    exit(1);
}
while (ret >= 0) {
    ret = avcodec_receive_packet(c, &pkt);
    if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF){
        return (ret==AVERROR(EAGAIN)) ? 0:1;
     }
    else if (ret < 0) {
        fprintf(stderr, "Error during encoding\n");
        exit(1);
    }
    ret = write_frame(oc, &c->time_base, ost->st, &pkt);
    if (ret < 0) {
       fprintf(stderr, "Error while writing video frame: %s\n", av_err2str(ret));
       exit(1);
    }
    av_packet_unref(&pkt);
}
return (frame) ? 0 : 1;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59470927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档