音视频流媒体开发-目录
iOS知识点-目录
Android-目录
Flutter-目录
数据结构与算法-目录
uni-pp-目录
ffmpe -i 9.mp4 -c copy 9.flv -y (stream copy方式)
ffmpe -i 9.mp4 -vcodec libx264 -acodec aac 9.flv -y
做命令⾏解析的对⽐
命令⾏解析
命令⾏对-c copy的解析
const OptionDef options[] = {
........
{ "c", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_INPUT | OPT_OUTPUT, { .off =
OFFSET(codec_names) },
"codec name", "codec" },
{ "codec", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_INPUT | OPT_OUTPUT, { .off =
OFFSET(codec_names) },
"codec name", "codec" },
............
对应
typedef struct OptionsContext {
........
SpecifierOpt *codec_names;
int nb_codec_names;
.........
}OptionsContext;
static int open_files(OptionGroupList *l,
const char *inout,
int (*open_file)(OptionsContext*, const char*))
{
int i, ret;
for (i = 0; i < l->nb_groups; i++) {
OptionGroup *g = &l->groups[i];
OptionsContext o;
init_options(&o); // 从OptionGroup解析出来的
o.g = g;
ret = parse_optgroup(&o, g); // 解析参数 从OptionGroup解析出来的
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file " "%s.\n", inout, g->arg);
return ret;
}
// 这⾥可以下断点查看o解析出来的codecname
av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
...........
}
return 0;
}
创建输出流
choose_encoder
static int choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
{
enum AVMediaType type = ost->st->codecpar->codec_type;
char *codec_name = NULL;
if (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO || type == AVMEDIA_TYPE_SUBTITLE) {
MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
if (!codec_name) {
ost->st->codecpar->codec_id = av_guess_codec(s->oformat,NULL, s->url, NULL, ost->st->codecpar->codec_type);
ost->enc = avcodec_find_encoder(ost->st->codecpar->codec_id);// 具体还要看存不存在
.........
} else if (!strcmp(codec_name, "copy"))
ost->stream_copy = 1; // 编码器维持输⼊的即是流拷⻉
else {
ost->enc = find_codec_or_die(codec_name, ost->st->codecpar->codec_type, 1);
ost->st->codecpar->codec_id = ost->enc->id;
}
ost->encoding_needed = !ost->stream_copy; // 需要编码
} else {
/* no encoding supported for other media types */
ost->stream_copy = 1; // 不需要重新编码
ost->encoding_needed = 0;
}
return 0;
}