FFMPEG代碼爲3.2 release版本, 文件位於ffmpeg_opt.c。數組
打開輸出文件,而且給指針數組output_files賦值。若是存在的話給指針數組output_streams賦值。ide
即options[]中的內容。例如配置:函數
-to,影響值stop_timespa
-t,影響值recording_time指針
-ss,影響值start_timecode
-fs,影響值limit_filesizeorm
-shortest,影響值shortest視頻
-map,影響值nb_stream_mapstoken
-vn,影響值video_disableci
-an,影響值audio_disable
-sn,影響值subtitle_disable
-dn,影響值data_disable
註釋:
從FFMPEG release 3.2發現-dn沒有起做用,因此代碼有冗餘:
/* Data only if codec id match */ if (!o->data_disable ) { enum AVCodecID codec_id = av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_DATA); for (i = 0; codec_id != AV_CODEC_ID_NONE && i < nb_input_streams; i++) { if (input_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_DATA && input_streams[i]->st->codecpar->codec_id == codec_id ) new_data_stream(o, oc, i); } }
-attach,影響值nb_attachments
OptionsContext int nb_metadata_map沒有賦值的地方,該代碼也是冗餘:
/* copy metadata */ for (i = 0; i < o->nb_metadata_map; i++) { char *p; int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0); if (in_file_index >= nb_input_files) { av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index); exit_program(1); } copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc, in_file_index >= 0 ? input_files[in_file_index]->ctx : NULL, o); }
OptionsContext int nb_program沒有賦值的地方,該代碼也是冗餘:
/* process manually set programs */ for (i = 0; i < o->nb_program; i++) { const char *p = o->program[i].u.str; int progid = i+1; AVProgram *program; while(*p) { const char *p2 = av_get_token(&p, ":"); const char *to_dealloc = p2; char *key; if (!p2) break; if(*p) p++; key = av_get_token(&p2, "="); if (!key || !*p2) { av_freep(&to_dealloc); av_freep(&key); break; } p2++; if (!strcmp(key, "program_num")) progid = strtol(p2, NULL, 0); av_freep(&to_dealloc); av_freep(&key); } program = av_new_program(oc, progid); p = o->program[i].u.str; while(*p) { const char *p2 = av_get_token(&p, ":"); const char *to_dealloc = p2; char *key; if (!p2) break; if(*p) p++; key = av_get_token(&p2, "="); if (!key) { av_log(NULL, AV_LOG_FATAL, "No '=' character in program string %s.\n", p2); exit_program(1); } if (!*p2) exit_program(1); p2++; if (!strcmp(key, "title")) { av_dict_set(&program->metadata, "title", p2, 0); } else if (!strcmp(key, "program_num")) { } else if (!strcmp(key, "st")) { int st_num = strtol(p2, NULL, 0); av_program_add_stream_index(oc, progid, st_num); } else { av_log(NULL, AV_LOG_FATAL, "Unknown program key %s.\n", key); exit_program(1); } av_freep(&to_dealloc); av_freep(&key); } }
OptionsContext int nb_metadata沒有賦值的地方,該代碼也是冗餘:
/* process manually set metadata */ for (i = 0; i < o->nb_metadata; i++) { AVDictionary **m; char type, *val; const char *stream_spec; int index = 0, j, ret = 0; val = strchr(o->metadata[i].u.str, '='); if (!val) { av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n", o->metadata[i].u.str); exit_program(1); } *val++ = 0; parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec); if (type == 's') { for (j = 0; j < oc->nb_streams; j++) { ost = output_streams[nb_output_streams - oc->nb_streams + j]; if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) { av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0); if (!strcmp(o->metadata[i].u.str, "rotate")) { ost->rotate_overridden = 1; } } else if (ret < 0) exit_program(1); } } else { switch (type) { case 'g': m = &oc->metadata; break; case 'c': if (index < 0 || index >= oc->nb_chapters) { av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index); exit_program(1); } m = &oc->chapters[index]->metadata; break; case 'p': if (index < 0 || index >= oc->nb_programs) { av_log(NULL, AV_LOG_FATAL, "Invalid program index %d in metadata specifier.\n", index); exit_program(1); } m = &oc->programs[index]->metadata; break; default: av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier); exit_program(1); } av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0); } }
根據配置的輸出文件格式,獲取AVOutputFormat內容
若是輸出視頻數據的話,須要執行該函數
若是輸出音頻數據的話,須要執行該函數
打開輸出文件