av_find_best_stream 与 avcodec_find_decoder 的解码器 return

Decoder return of av_find_best_stream vs. avcodec_find_decoder

libav 的 av_find_best_stream 函数(libav 11.7、Windows、i686、GPL)的文档指定了一个参数,该参数可用于接收指向适当 AVCodec 的指针:

decoder_ret - if non-NULL, returns the decoder for the selected stream

还有一个 avcodec_find_decoder 函数可以找到给定 ID 的 AVCodec

不过官方demuxing + decoding example使用av_find_best_stream找流,却选择用avcodec_find_decoder找编解码器代替av_find_best_stream的编解码器return参数:

ret = av_find_best_stream(fmt_ctx, type, -1, -1, NULL, 0);
...
stream_index = ret;
st = fmt_ctx->streams[stream_index];
...
/* find decoder for the stream */
dec = avcodec_find_decoder(st->codecpar->codec_id);

与类似的东西相反:

ret = av_find_best_stream(fmt_ctx, type, -1, -1, &dec, 0);

我的问题很简单:使用 av_find_best_stream 的 return 参数与使用 avcodec_find_decoder 查找 AVCodec 之间有区别吗?

我问的原因是因为示例选择使用 avcodec_find_decoder 而不是看似更方便的 return 参数,我无法判断示例是否出于特定原因或不是。文档本身有点参差不齐且不连贯,因此很难判断这样的事情是否出于特定的重要原因而完成。我不知道这个例子是在暗示它 "should" 是那样做的,还是例子作者这样做是出于一些更随意的个人原因。

av_find_best_stream 在内部使用 avcodec_find_decoder 的方式与您的代码示例中的方式几乎相同。然而,当向它请求解码器时,av_find_best_stream 的行为发生了变化——即,它将尝试在每个候选流上使用 avcodec_find_decoder,如果失败,它将丢弃候选并继续下一个。最后它将 return 与其解码器一起进行最佳流式传输。如果不请求解码器,它只会 return 最佳流而不检查它是否可以解码。

因此,如果您只想获取单个 video/audio 流并且您不打算编写一些自定义流选择逻辑,那么我会说使用 av_find_best_stream 获取解码器没有任何缺点.