我的ffmpeg版本是6.0,据我所知,已经弃用了av_register_all这个函数了,除了这个函数,你再检查检查其他的函数,把上面程序修改一下
时间: 2024-04-22 17:28:06 浏览: 276
非常抱歉,我之前的回答有误。对于FFmpeg版本6.0,确实不再需要调用`av_register_all()`函数。以下是修改后的代码,适用于FFmpeg 6.0版本:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libavformat/avformat.h>
int main(int argc, char *argv[]) {
avformat_network_init(); // 初始化网络模块
AVFormatContext *outputContext = NULL;
AVOutputFormat *outputFormat = NULL;
AVPacket packet;
const char *inputFileName = "in.h264";
const char *outputUrl = "rtsp://output_stream_url";
// 打开输出流
avformat_alloc_output_context2(&outputContext, NULL, "rtsp", outputUrl);
if (!outputContext) {
printf("无法创建输出流上下文\n");
return -1;
}
outputFormat = outputContext->oformat;
// 添加视频流
AVStream *outStream = avformat_new_stream(outputContext, NULL);
if (!outStream) {
printf("无法创建输出流\n");
return -1;
}
// 设置流参数
outStream->codecpar->codec_id = AV_CODEC_ID_H264;
outStream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
// 打开输出流
if (!(outputFormat->flags & AVFMT_NOFILE)) {
if (avio_open(&outputContext->pb, outputUrl, AVIO_FLAG_WRITE) < 0) {
printf("无法打开输出流\n");
return -1;
}
}
// 写入流头信息
if (avformat_write_header(outputContext, NULL) < 0) {
printf("无法写入流头信息\n");
return -1;
}
// 打开输入文件
FILE *inputFile = fopen(inputFileName, "rb");
if (!inputFile) {
printf("无法打开输入文件\n");
return -1;
}
// 读取输入文件的数据帧并写入输出流
while (1) {
int ret = fread(packet.data, 1, sizeof(packet.data), inputFile);
if (ret <= 0)
break;
packet.size = ret;
packet.pts = packet.dts = AV_NOPTS_VALUE;
packet.stream_index = outStream->index;
// 写入数据包
if (av_interleaved_write_frame(outputContext, &packet) < 0) {
printf("无法写入数据包\n");
break;
}
}
// 写入流尾信息
av_write_trailer(outputContext);
// 关闭输入文件
fclose(inputFile);
// 释放资源
if (outputContext && !(outputFormat->flags & AVFMT_NOFILE))
avio_closep(&outputContext->pb);
avformat_free_context(outputContext);
return 0;
}
```
请确保将`output_stream_url`替换为要推送到的RTSP流的URL,并将`in.h264`文件放在可执行文件的同一目录下。编译并运行此代码,它将从`in.h264`文件中读取H.264原始数据帧并将其推送到指定的RTSP流中。
阅读全文