2013-08-13 4 views
2

Мы используем библиотеки FFmpeggit-ee94362 libavformat v55.2.100. Мы пытаемся написать простой пример кода HLS, основанный на стандартном muxing.c. Позвольте быть двумя входными потоками, видео и аудио (они могут быть синтетическими, неважно). Наша цель - mux их в плейлист M3U8, используя HLS. Предположим, продолжительность каждого файла сегмента TS быть 3 сек, и желательно максимальное количество записей в выходном файле M3U8 100.FFmpeg: параметры HLS не могут быть установлены/получить/найти

Из источников FFmpeg приложения, можно увидеть, что Сегментер компании Apple HTTP Live Streaming реализован в hlsenc.c файл. И соответствующие варианты есть, а также: "hls_list_size", "hls_time" и т.д. Проблема в том, что нам не удалось установить/получить/найти эти параметры обычным способом, как показано в следующем коде:


// Here is a part of main() program 

int64_t i1 = 0; 
void *target_obj; 

AVFormatContext *ofmt_ctx = NULL; 
AVOutputFormat *ofmt = NULL; 

avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, "Example_Out.m3u8"); 

ofmt = ofmt_ctx->oformat; 

// The relevant options ("hls_list_size", "hls_time") are located under ofmt->priv_class->option. 
// But AVClass *priv_class is not the first member of the AVOutputFormat. 
// So, due to the documentation, av_opt_find...(), av_opt_get...() and av_opt_set...() 
// cannot be used for options within AVOutputFormat. 
// In practice, any of the following three lines causes exception. 
const AVOption *o = av_opt_find2(ofmt, "hls_list_size", NULL, 0, AV_OPT_SEARCH_CHILDREN, &target_obj); 
av_opt_get_int(ofmt, "hls_list_size", AV_OPT_SEARCH_CHILDREN, &i1); 
av_opt_set_int(ofmt, "hls_list_size", 10, AV_OPT_SEARCH_CHILDREN); 

Наш вопрос: Если есть способ преодолеть эту проблему, то есть, чтобы установить/получить/найти варианты AVOutputFormat, как для AVCodecContext (например)?

Спасибо,

Andrey Mochenov.

ответ

1

Попробуйте перейти в поле priv_data AVFormatContext (ofmt-> priv_data) вместо самой структуры. Он будет NULL в этот момент вашего кода, но он будет заполнен после вызова avformat_write_header.

av_opt_set_int (ofmt-> priv_data, "hls_list_size", 10, AV_OPT_SEARCH_CHILDREN) должен работать в этой точке.

Если необходимо задать параметры перед вызовом avformat_write_header(), как и ваши параметры Live Streaming, вы должны передать их как аргумент опций AVDictionary ** для этой функции.

+0

В этом случае частный класс уже выделен avformat_alloc_output_context2, поэтому av_opt_set можно безопасно вызвать до avformat_write_header. – tab

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