gpt4 book ai didi

c++ - FFmpeg/libav 将 AVPacket 数据存储在文件中并在不同的流中再次解码它们 - 如何在解码器中准备和发送自定义数据包?

转载 作者:行者123 更新时间:2023-12-04 23:18:20 25 4
gpt4 key购买 nike

我希望能够打开带有视频文件的流,并在解码器中发送我自己的数据包,其中包含我以前使用相同编解码器从不同流中存储的数据。就像在解码器中伪造我自己的数据包一样。
我的方法是使用 H.265 将帧编码为数据包,并将数据存储在如下文件中:

AVPacket *packet;
std::vector<uint8_t> data;
...encoding...
data->insert(data->end(), &packet->data[0], &packet->data[packet->size]);
...storing the buffer in a file...
我还有一个具有相同参数的 H.265 流的 mkv 视频。现在想获取文件中存储的包数据,新建一个包,发送到mkv文件的解码过程中。为了更容易,我只需将 mkv 流中第一个数据包的参数复制到一个新数据包中,在其中插入数据并将其发送到解码器。这是一个正确的方法吗?
...open decoder with mkv file...
auto packet = av_packet_alloc();
av_read_frame(formatContext, packet);
//here is the packet I will use later with my data
av_packet_copy_props(decodingPacket, packet);
decodingPacket->flags = 0;
//sending the packet from the mkv
avcodec_send_packet(codecContext, packet);
//the data contains the previously stored data
av_packet_from_data(decodingPacket, data.data(), data.size());
avcodec_send_packet(codecContext, decodingPacket);
...retrieving the frame...
但是,当我尝试发送忘记数据包时出现此错误:
Assertion buf_size >= 0 failed at libavcodec/bytestream.h:141
我试图手动更改 decodingPacket->buf->size但这可能不是问题。我相信我需要在伪造的数据包中设置一些其他参数,但究竟是什么?也许我还可以以某种方式不仅存储数据包数据,还存储整个结构?请让我知道,如果有更好的方法来存储和重新加载数据包并将其强制到具有相同参数的不相关解码器中。
谢谢!
编辑:似乎 buf_size 问题与我错误检索的数据有关。我可以确认这现在有效,但我收到了一个新错误:
[hevc @ 0x559b931606c0] Invalid NAL unit size (0 > 414).
[hevc @ 0x559b931606c0] Error splitting the input into NAL units.

最佳答案

所以我上面描述的过程似乎是正确和可能的!我的问题是数据包的不一致。编码器和解码器需要完全相同(某些编解码器参数显然可以产生不同类型的数据包)。实现这一点的最简单方法是创建一个最小的引用文件,用于初始化解码器。
NAL 的问题可能是由 h.265 的不同流格式引起的。 This great answer帮助我识别!输出格式会影响数据包数据,因此,例如,当拥有原始数据并使用附件 B 时,有必要插入如下开始代码:

data.insert(data.begin(), {0,0,0,1});

关于c++ - FFmpeg/libav 将 AVPacket 数据存储在文件中并在不同的流中再次解码它们 - 如何在解码器中准备和发送自定义数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71921980/

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