写一段c++ 使用ffmpeg库,解析rtsp流并转码到H264
时间: 2023-02-28 07:01:27 浏览: 244
以下是一段使用 ffmpeg 库解析 RTSP 流并转码为 H264 的 C 代码示例:
```
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libavutil/avutil.h>
int main(int argc, char *argv[]) {
// 初始化 libav
av_register_all();
avformat_network_init();
// 创建输入上下文
AVFormatContext *input_ctx = NULL;
avformat_open_input(&input_ctx, "rtsp://...", NULL, NULL);
avformat_find_stream_info(input_ctx, NULL);
// 创建输出上下文
AVFormatContext *output_ctx = NULL;
avformat_alloc_output_context2(&output_ctx, NULL, "h264", "out.h264");
// 获取视频流
int video_stream_index = -1;
for (int i = 0; i < input_ctx->nb_streams; i++) {
if (input_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
video_stream_index = i;
break;
}
}
// 创建视频流
AVStream *out_stream = avformat_new_stream(output_ctx, input_ctx->streams[video_stream_index]->codec->codec);
out_stream->codec->codec_id = AV_CODEC_ID_H264;
out_stream->codec->codec_type = AVMEDIA_TYPE_VIDEO;
avcodec_copy_context(out_stream->codec, input_ctx->streams[video_stream_index]->codec);
// 打开输出文件
avio_open(&output_ctx->pb, "out.h264", AVIO_FLAG_WRITE);
// 写入头信息
avformat_write_header(output_ctx, NULL);
// 循环读取帧
AVPacket packet;
while (av_read_frame(input_ctx, &packet) >= 0) {
if (packet.stream_index == video_stream_index) {
packet.stream_index = out_stream->index;
packet.pts = av_rescale_q(packet.pts, input_ctx->streams[video_stream_index]->time_base, out_stream->time_base);
packet.dts = av_rescale_q(packet.dts, input_ctx->streams[video_stream_index]->time_base, out_stream->time_base);
packet.duration =
阅读全文