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() 函数的实现如下:

1-1

首先 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解析数据包

版权所属 xianwanzhiyin.net 罗上文 2023 all right reserved,powered by Gitbook该文件修订时间: 2023-06-09 23:36:50

results matching ""

    No results matching ""