我目前在尝试将原始H264 nal数据包封装到mp4容器中时遇到问题.但是,我想将结果存储在内存中,而不是将它们写入磁盘.我使用libavcodec在mpegts容器中遵循这种方法原始H264帧但到目前为止还没有成功.
首先,这是写入内存的正确方法吗?我的标题中有一个小结构
struct IOOutput {
uint8_t* outBuffer;
int bytesSet;
};
Run Code Online (Sandbox Code Playgroud)
我初始化缓冲区和bytesset.然后我初始化我的AVIOContext变量
AVIOContext* pIOCtx = avio_alloc_context(pBuffer, iBufSize, 1, outptr, NULL, write_packet, NULL);
Run Code Online (Sandbox Code Playgroud)
其中outptr是指向IOOutput输出的void指针,write_packet如下所示
int write_packet (void *opaque, uint8_t *buf, int buf_size) {
IOOutput* out = reinterpret_cast<IOOutput*>(opaque);
memcpy(out->outBuffer+out->bytesSet, buf, buf_size);
out->bytesSet+=buf_size;
return buf_size;
}
Run Code Online (Sandbox Code Playgroud)
我接着说
fc->pb = pIOCtx;
fc->flags = AVFMT_FLAG_CUSTOM_IO;
Run Code Online (Sandbox Code Playgroud)
在我的AVFormatContext*fc变量上.
然后,每当我从帧中编码nal数据包时,我通过av_interleaved_write_frame将它们写入AVFormatContext,然后通过以下方式获取mp4内容
void getBufferContent(char* buffer) {
memcpy(buffer, output.outBuffer, output.bytesSet);
output.bytesSet=0;
}
Run Code Online (Sandbox Code Playgroud)
因此重置变量bytesSet,因此在下一次写操作期间,将在缓冲区的开头插入字节.有一个更好的方法吗?这实际上是一种有效的方法吗?如果我只调用av_interleaved_write_frame和avformat_write_header来添加数据包,FFMPEG是否会执行任何读取操作?
非常感谢你提前!
编辑
这是关于多路复用过程的代码 - 在我的编码功能中我有类似的东西
int frame_size = x264_encoder_encode(obj->mEncoder, &obj->nals, &obj->i_nals, obj->pic_in, obj->pic_out);
int …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试实现半边折叠以执行增量重新网格化。我正在处理流形网格。考虑以下简单网格:

目标是将 a 折叠成 b。

然而,在这种情况下,这会导致非流形网格

我想阻止这一点。我的问题是:
我怎样才能提前做到这一点,即在崩溃之前执行检查崩溃操作是否安全?
我已经尝试过 Hoppe 的标准(链接条件),但看起来两者都已满足。此外,a 和 b 的一环的唯一交点是 c,因此只有一个点,因为它是边界边缘。
另外一般来说,我还需要执行哪些其他检查以避免非法倒塌?
现在,我有以下标准: