欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ffmpeg中MP4的解复用过程

程序员文章站 2022-07-13 12:19:08
...

主要流程

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

ffmpeg中MP4的解复用过程

其中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:
ffmpeg中MP4的解复用过程

3.av_probe_input_format3()函数:
ffmpeg中MP4的解复用过程

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: