avformat_new_stream
时间: 2023-10-04 12:09:23 浏览: 39
`avformat_new_stream()`是FFmpeg库中的一个函数,用于为输出格式上下文创建一个新的流。它的函数原型如下:
```
AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c);
```
其中,`s`是一个指向输出格式上下文的指针,`c`是一个指向要使用的编解码器的指针。该函数会自动分配并初始化一个新的`AVStream`结构体,并将其添加到输出格式上下文的`streams`数组中。
在创建新流之后,可以使用`AVStream`结构体中的成员变量来设置流的属性,例如流的编解码器、时间基、码率、帧率等。然后,可以使用`avcodec_parameters_from_context()`函数将这些属性从编解码器上下文复制到流的参数中。
最后,需要使用`avformat_write_header()`函数写入输出文件的头部,并使用`av_write_frame()`函数写入流的数据。完成所有写入后,使用`av_write_trailer()`函数完成输出文件的写入过程。
相关问题
avformat_new_stream 获取的 avStream 需要调用 avcodec_parameters_alloc 出世后 codecpar 吗
是的,avformat_new_stream函数会创建一个AVStream结构体实例,但是其中的codecpar字段是空的,需要调用avcodec_parameters_alloc函数为其分配内存空间,然后再根据需要设置其它属性。具体的代码示例如下:
```c
AVStream *stream = avformat_new_stream(formatContext, codec);
if (!stream) {
// 创建流失败
return;
}
// 分配codecpar内存空间
AVCodecParameters *codecpar = avcodec_parameters_alloc();
if (!codecpar) {
// 分配内存失败
avformat_free_context(formatContext);
return;
}
// 设置codecpar属性
codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
codecpar->codec_id = codecId;
codecpar->width = width;
codecpar->height = height;
// 将codecpar赋值给stream
stream->codecpar = codecpar;
```
其中,formatContext是AVFormatContext结构体实例,codec是AVCodec结构体实例,codecId是对应的编码器ID,width和height是视频的宽度和高度。
avformat_new_stream这个函数放在avcodec_find_encoder函数后面么
通常情况下,应该先使用 avformat_new_stream() 创建一个新的流,然后再使用 avcodec_find_encoder() 找到合适的编码器来为该流设置编码器。因此,avformat_new_stream() 应该放在 avcodec_find_encoder() 的前面。这样可以确保你创建的流具有正确的编码器,否则可能会导致编码失败或其他问题。