格式获取
本质上是通过文件的后缀、文件头部信息,在既定的格式集合中,找出最匹配的格式。
前提是先要有既定格式集合(av_format_register_all,并在编译的时候把demuxer打开),并且要有数据才能分析。
结构上:
avio_alloc_context(创建pb) -> av_prob_input_buffer(探测输入格式) -> avformat_open_input(取得格式) -> avformat_find_stream_info(取得更细的信息,像duration)
推导发散:
1.在编译configure的时候,可以enable或disable特定的demuxer,以修改既定的格式集合。
2.既然是匹配,就存在在猜测的因素,还是有可能匹配错格式。--可以修改匹配的逻辑或分数值,把自己关心的格式提高分数。
3.格式就是结构,获取格式就是获取结构,有了结构,就可以找到对应这个结构的编解码器。--在拿到formatcontext后,可以拿到所有流,进而拿到每个流的codecContext,进而拿到codec。
技巧:
int FFmpegExtractor::readData(void* obj, uint8_t* buf, int bufsize) {
DataSourceBase* source = (DataSourceBase*)obj;
if (source) {
int realsize = source->ds_read(buf, bufsize);
return realsize;
}
return 0;
}
int64_t FFmpegExtractor::seekData(void* obj, int64_t offset, int whence) {
DataSourceBase* source = (DataSourceBase*)obj;
if (source) {
if (whence == AVSEEK_SIZE) {
int size = source->ds_size();
return size;
}
}
return offset;
本质上是通过文件的后缀、文件头部信息,在既定的格式集合中,找出最匹配的格式。
前提是先要有既定格式集合(av_format_register_all,并在编译的时候把demuxer打开),并且要有数据才能分析。
结构上:
avio_alloc_context(创建pb) -> av_prob_input_buffer(探测输入格式) -> avformat_open_input(取得格式) -> avformat_find_stream_info(取得更细的信息,像duration)
推导发散:
1.在编译configure的时候,可以enable或disable特定的demuxer,以修改既定的格式集合。
2.既然是匹配,就存在在猜测的因素,还是有可能匹配错格式。--可以修改匹配的逻辑或分数值,把自己关心的格式提高分数。
3.格式就是结构,获取格式就是获取结构,有了结构,就可以找到对应这个结构的编解码器。--在拿到formatcontext后,可以拿到所有流,进而拿到每个流的codecContext,进而拿到codec。
技巧:
1.可以把获取格式的代码抽离出来,写成一个app,支持把文件拉进来,就解析出文件的格式并显示出来。这是一个mac平台上的app,供下载。--木有得上传
获取格式的部分代码:int FFmpegExtractor::readData(void* obj, uint8_t* buf, int bufsize) {
DataSourceBase* source = (DataSourceBase*)obj;
if (source) {
int realsize = source->ds_read(buf, bufsize);
return realsize;
}
return 0;
}
int64_t FFmpegExtractor::seekData(void* obj, int64_t offset, int whence) {
DataSourceBase* source = (DataSourceBase*)obj;
if (source) {
if (whence == AVSEEK_SIZE) {
int size = source->ds_size();
return size;
}
}
return offset;