gpt4 book ai didi

c - 将 RTSP 流重新复用到容器中? (写入读取帧而不对其进行解码)

转载 作者:行者123 更新时间:2023-11-30 19:11:47 25 4
gpt4 key购买 nike

我正在尝试使用 dranger tutorials用于将 RTSP h264 流视频直接写入文件,无需对其进行解码和编码(ffmpeg 3.0/3.1 库)。但是,一旦获得相应的 AVPacket,我就有点迷失了如何填充 av_write_frame 的 AVFormatContext 指针。

试图澄清。我想做的是这个

1. Open webcam stream in h264
2. Read a frame
3. Save it to a file without decoding and encoding it.

编辑:我还尝试使用 ffmpeg 文档中的重新混合示例(执行网络 init()),但从 rtsp -> .mp4 转到时出现 dts 和 pts 同步错误

复制粘贴教程中的代码:

#include <stdio.h>
#include <libavutil/pixfmt.h>
#include <libavcodec/avcodec.h>
#include <libavutil/avconfig.h>
#include <libswscale/swscale.h>
#include <libavformat/avformat.h>

int main(int argc, char *argv[]) {
av_register_all();
avcodec_register_all();
avformat_network_init();

AVFormatContext *pFormatCtx = avformat_alloc_context();

// Camera comes from argv[1]
avformat_open_input(&pFormatCtx, argv[1], NULL, NULL);
avformat_find_stream_info(pFormatCtx, NULL);
av_dump_format(pFormatCtx, 0, argv[1], 0);

int video_stream_idx = -1;

for (int i = 0; i < pFormatCtx->nb_streams; i++) {
if (pFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
video_stream_idx = i;
break;
}
}

AVCodecContext *pCodecContext = NULL;
AVCodecContext *pCodecContextOrig = NULL;

pCodecContextOrig = pFormatCtx->streams[video_stream_idx]->codec;
AVCodec *pCodec;
pCodec = avcodec_find_decoder(pCodecContextOrig->codec_id);
pCodecContext = avcodec_alloc_context3(pCodec);
avcodec_copy_context(pCodecContext, pCodecContextOrig);
avcodec_open2(pCodecContext, pCodec, NULL);

AVFrame *pFrame = av_frame_alloc();
AVFrame *pFrameRGB = av_frame_alloc();

uint8_t *buffer = NULL;
int buffer_size = avpicture_get_size(AV_PIX_FMT_RGB24, pCodecContext->width,
pCodecContext->height);
buffer = (uint8_t *)av_malloc(buffer_size * sizeof(uint8_t));

// fill buffer
avpicture_fill((AVPicture *)pFrameRGB, buffer, AV_PIX_FMT_RGB24,
pCodecContext->width, pCodecContext->height);

struct SwsContext *sws_ctx = NULL;
int frame_finished = 0;
AVPacket packet;

// Size(src), fmt(src), Size(dst), fmt(dst) .. flags
sws_ctx = sws_getContext(pCodecContext->width, pCodecContext->height,
pCodecContext->pix_fmt, pCodecContext->width,
pCodecContext->height, AV_PIX_FMT_RGB24,
SWS_BILINEAR, NULL, NULL, NULL);


AVFormatContext *out_fmt_ctx;

avformat_write_header(out_fmt_ctx, NULL);

int i = 0;
while (i < 100 && (av_read_frame(pFormatCtx, &packet) >= 0)) {
// Want to write these frames to disk
i++;
}

av_write_trailer(out_fmt_ctx);

av_free(buffer);
av_free(pFrameRGB);
av_free(pFrame);

avcodec_close(pCodecContext);
avcodec_close(pCodecContextOrig);

avformat_close_input(&pFormatCtx);

return 0;
}

我认为这段代码的很多内容都可以删除。我正在努力学习:)。

链接到-lavutil -lavformat -lavcodec -lz -lavutil -lm -lswscale

最佳答案

我通过使用 FFmpeg 文档中的 remuxing.c 示例进行了修复。问题是,由于某种原因(我仍然不知道为什么),第一个数据包 dts 和 pts 高于第二个数据包(以及后续数据包,单调增加)。通过跳过第一个数据包写入来修复它:)。

关于c - 将 RTSP 流重新复用到容器中? (写入读取帧而不对其进行解码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39102557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com