ff_raw_read_partial_packet读取部分数据—FFmpeg源码分析
本文使用的命令如下:
ffmpeg -i juren-30s.h264 out.flv -y
请参考《用Ubuntu18与clion调试FFmpeg》搭建好调试环境,juren-30s.h264
在 GitHub 里面有的,请自行下载。
ff_raw_read_partial_packet()
函数的实现如下:
首先 raw_packet_size
是在 ff_rawvideo_options[]
里面定义的,默认就是 RAW_PACKET_SIZE
(1024),如下:
const AVOption ff_rawvideo_options[] = {
{ "framerate", "", OFFSET(framerate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, DEC},
{ "raw_packet_size", "", OFFSET(raw_packet_size), AV_OPT_TYPE_INT, {.i64 = RAW_PACKET_SIZE }, 1, INT_MAX, DEC},
{ NULL },
};
所以对于 h.264 文件,他每次只会读 1024 字节的数据。avio_read_partial()
函数就是一个简单的读文件数据的函数,没有什么特别。
av_shrink_packet()
函数主要是给 AVPacket
的多余数据 清零,因为 AVPacket
里面的 size
的大小是 1024,如果 avio_read_partial()
只读了 1000 字节,那av_shrink_packet()
就会把后面的 24 字节的内容清零。
虽然 ff_raw_read_partial_packet()
函数很简单,就是默认读取 1024 字节内容丢给上层。
但是上层的逻辑是非常复杂的,因为 1024 肯定不是一个完整的 NALU,上层需要再处理 这种部分的数据,推荐阅读《parse_packet解析数据包》