2016-10-06 7 views
1

Документов для av_find_best_stream функции libav в (libav 11,7, Windows, i686, GPL) указать параметр, который может быть использован для получения указателя на соответствующий AVCodec:Decoder возвращения av_find_best_stream против avcodec_find_decoder

decoder_ret - если не-NULL, то возвращает декодер для выбранного потока

Существует также функция avcodec_find_decoder, которая может найти AVCodec данный идентификатор.

Однако официальный demuxing + decoding example использует av_find_best_stream найти поток, но хочет использовать avcodec_find_decoder найти кодек вместо кодека возвращаемого параметра av_find_best_stream «s:

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, возвращаемого параметра по сравнению с использованием avcodec_find_decoder найти AVCodec?

Причина, по которой я прошу, состоит в том, что в примере используется avcodec_find_decoder, а не как более удобный возвращаемый параметр, и я не могу сказать, сделал ли это пример по определенной причине или нет. Сама документация немного пятнистая и несвязанная, поэтому трудно сказать, делаются ли такие вещи по определенной важной причине или нет. Я не могу сказать, подразумевает ли этот пример, что это «должно» быть сделано таким образом, или если автор примера сделал это по какой-то более произвольной личной причине.

ответ

1

av_find_best_stream использует avcodec_find_decoder внутренне почти так же, как в вашем примере кода. Однако есть изменения в поведении av_find_best_stream, когда от него запрашивается декодер, а именно: он будет пытаться использовать avcodec_find_decoder для каждого потока-кандидата, а если он терпит неудачу, он отбросит кандидата и перейдет к следующему. В итоге он вернет лучший поток вместе с его декодером. Если декодер не запрашивается, он просто вернет лучший поток, не проверив, может ли он быть декодирован.

Так что, если вы просто хотите получить единый видео/аудиопоток, и вы не собираетесь писать какую-то пользовательскую логику выбора потока, я бы сказал, что нет недостатка в использовании av_find_best_stream, чтобы получить декодер.

 Смежные вопросы

  • Нет связанных вопросов^_^