相关疑难解决方法(0)

检测RTP流中的MPEG4/H264 I帧(IDR)

我需要检测RTP数据包中的MPEG4 I帧.我知道如何删除RTP标头并获取其中的MPEG4帧,但我无法弄清楚如何识别I帧.

它有特定的签名/标题吗?

rtp rtsp

25
推荐指数
3
解决办法
5万
查看次数

FFMPEG I/O输出缓冲区

我目前在尝试将原始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)

c c++ ffmpeg

6
推荐指数
1
解决办法
5545
查看次数

为什么从avi容器解码帧并将它们编码为h264/mp4不起作用?

我开始使用ffmpeg,我想将avi文件转换为mp4/h264文件.我已经阅读了很多帖子,包括这个,但我找不到任何好的例子如何将帧保存到mp4文件.下面的代码是简化的代码,它解码来自avi文件的帧并将其编码为H264/mp4文件,但是当我保存帧时,mp4文件无法播放.我想我在编码方面做了一些错误

如果你能告诉我什么是错的以及如何解决它,我将不胜感激.

const char* aviFileName = "aviFrom.avi";
const char* mp4FileName = "mp4To.mp4";

// Filling pFormatCtx by open video file and Retrieve stream information
// ...
// Retrieving codecCtxDecode and opening codecDecode 
//...


// Get encoder
codecCtxEncode = avcodec_alloc_context();   
codecCtxEncode->qmax = 69; 
codecCtxEncode->max_qdiff = 4;
codecCtxEncode->bit_rate = 400000;
codecCtxEncode->width = codecCtxDecode->width;
codecCtxEncode->height = codecCtxDecode->height;
codecCtxEncode->pix_fmt = AV_PIX_FMT_YUV420P;   
codecEncode = avcodec_find_encoder(CODEC_ID_H264);
if(codecEncode == NULL)
    return -1;  
if(avcodec_open2(codecCtxEncode, codecEncode, NULL))
    return -1;

SwsContext *sws_ctx = sws_getContext(codecCtxDecode->width, codecCtxDecode->height, codecCtxDecode->pix_fmt,
                            codecCtxDecode->width, codecCtxDecode->height, AV_PIX_FMT_YUV420P, …
Run Code Online (Sandbox Code Playgroud)

video ffmpeg video-encoding h.264 libavcodec

5
推荐指数
1
解决办法
3766
查看次数

ffmpeg:如何将 h264 原始数据保存为 mp4 文件

我用 libavcodec 编码 h264 数据。前任。

while (1) {
  ...
  avcodec_encode_video(pEnc->pCtx, OutBuf, ENC_OUTSIZE, pEnc->pYUVFrame);
  ...
}
Run Code Online (Sandbox Code Playgroud)

如果我直接将 OutBuf 数据保存为 .264 文件,则播放器无法播放。现在我想保存 OutBuf

作为 mp4 文件。任何人都知道如何通过 ffmpeg lib 做到这一点?谢谢。

c++ mp4 ffmpeg h.264

3
推荐指数
1
解决办法
1万
查看次数

标签 统计

ffmpeg ×3

c++ ×2

h.264 ×2

c ×1

libavcodec ×1

mp4 ×1

rtp ×1

rtsp ×1

video ×1

video-encoding ×1