avformat_new_stream
时间: 2023-10-04 20:11:16 浏览: 98
`avformat_new_stream` 是 FFmpeg 中的一个函数,用于创建一个新的音视频流。它的函数原型如下:
```
AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c);
```
其中,`s` 是指向 `AVFormatContext` 结构体的指针,表示要创建音视频流的封装格式上下文;`c` 是指向 `AVCodec` 结构体的指针,表示要使用的编解码器。函数返回一个指向 `AVStream` 结构体的指针,表示创建成功的音视频流。
在调用 `avformat_new_stream` 函数之后,还需要对返回的 `AVStream` 结构体进行一些初始化操作,例如设置音视频流的编码参数、时间基等信息。最后,将创建的音视频流添加到封装格式上下文中即可。
需要注意的是,`avformat_new_stream` 函数只是创建了一个空的音视频流,还需要使用编解码器对音视频数据进行编码,并将编码后的数据写入到封装格式中。
相关问题
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() 的前面。这样可以确保你创建的流具有正确的编码器,否则可能会导致编码失败或其他问题。