ffmpeg中MP4的解复用过程

来源:互联网 发布:linux mysql5.7 重启 编辑:程序博客网 时间:2024/05/16 05:58

主要流程

1.在s->io_open()中创建了URLContext和它的prot成员(URLProtcol)。其中URLProtcol对应的协议为file;

这里写图片描述

其中MP4的URLProtcol为:

const URLProtocol ff_file_protocol = {    .name                = "file",    .url_open            = file_open,    .url_read            = file_read,    .url_write           = file_write,    .url_seek            = file_seek,    .url_close           = file_close,    .url_get_file_handle = file_get_handle,    .url_check           = file_check,    .url_delete          = file_delete,    .url_move            = file_move,    .priv_data_size      = sizeof(FileContext),    .priv_data_class     = &file_class,    .url_open_dir        = file_open_dir,    .url_read_dir        = file_read_dir,    .url_close_dir       = file_close_dir,    .default_whitelist   = "file,crypto"};

在libformate/file.c文件中。

2.在av_probe_input_buffer2()中判断出AVInputFormat:
这里写图片描述

3.av_probe_input_format3()函数:
这里写图片描述

4.mp4对应的read_probe为mov_probe(),在mov.c文件中;

MP4对应的AVFormatContext

AVInputFormat ff_mov_demuxer = {    .name           = "mov,mp4,m4a,3gp,3g2,mj2",    .long_name      = NULL_IF_CONFIG_SMALL("QuickTime / MOV"),    .priv_class     = &mov_class,    .priv_data_size = sizeof(MOVContext),    .extensions     = "mov,mp4,m4a,3gp,3g2,mj2",    .read_probe     = mov_probe,    .read_header    = mov_read_header,    .read_packet    = mov_read_packet,    .read_close     = mov_read_close,    .read_seek      = mov_read_seek,    .flags          = AVFMT_NO_BYTE_SEEK,};

4.在s->iformat->read_header(s),实际为mov_read_header()中,创建MP4文件的AVStream:

0 0
原创粉丝点击