目前调试思路是:JNI导入源码,然后找到入口Main函数,使用PC 平台的命令输入,然后顺着命令来阅读代码,目前能执行 视频合成 视频分拆等常用命令,封装成一个JNI调用,下一步再阅读源码,进行一个业务的流程整合;
开始部分代码 是解释命令,后面的 ffmpeg.c 中的static int transcode(void) 方法才是真正的转码函数
参照 http://blog.csdn.net/leixiaohua1020/article/category/1360795/3
图片合成视频
1、ffmpeg_parse_options方法;
2、open_input_file方法;
3、libavformat\utils.c avformat_find_stream_info 方法,因为是图片,而不是视频,所以走这个方法;
4、libavformat\utils.c read_frame_internal 方法;
5、libavformat\utils.c ff_read_packet;
6、在ff_read_packet 中执行了 AVFormatContext 的回调函数 s->iformat->read_packet(s, pkt); read_packet,赋值于 img2dec.c ff_img_read_packet方法;
7、libavformat\img2dec.c ff_img_read_packet(); 中执行 io_open 的回调函数;
8、options.c avformat_get_context_defaults()中 把io_open 的回调函数io_open_default 赋值了;
9、options.c io_open_default() 调用 ffio_open_whitelist;
10、aviobuf.c ffio_open_whitelist(); 调用了 ffurl_open_whitelist,再有一个 ffio_fdopen 方法,在里面 新建了 *s = avio_alloc_context(buffer, buffer_size, h->flags & AVIO_FLAG_WRITE,
internal, io_read_packet, io_write_packet, io_seek); 注意回调方法 io_read_packet,这个就是读取字节到AVIOContext 的地方
11、avio.c ffurl_open_whitelist();
12、avio.c ffurl_connect(); 调用了 url_open 的回调函数 在 libavformat\file.c 中ff_file_protocol赋值了;
13、url.h (*url_open);
14、libavformat\file.c->url_open();