因为项目的需要,需要把H264或者H265的视频流转换为MP4格式的内存流,网上搜索出来的结果只有MP4格式输出到文件的,就是没有找到一个输出到内存流中的,没办法,只能去看FFMPEG的源码,分析相应的函数,经过连续几天的测试验证,终于实现了H264或者H265与MP4内存流之间格式的转换,也就是说H264或者H265格式的视频流进来,出去的时候是MP4格式的内存流,如果需要写文件的话直接把流写入一个文件就可以,不需要做其他的操作。
#include <vector>
/*************************************************
* 描述:把视频数据转换为MP4格式的数据输出到outBuf,注意 不支持音频
* 参数:
* @inBuf:【输入】输入视频数据
* @inBufLen【输入】输入视频数据的长度
* @outBuf:【输出】MP4格式的数据
* 返回:DLV_AV_ERROR
*************************************************/
int DLV_VideoToMP4(unsigned char* inBuf, unsigned int inBufLen, std::vector<unsigned char>& outBuf);
enum
{
DLV_VIDEO_FAILED_WRITE_FRAME = -6,//写帧数据失败
DLV_VIDEO_FAILED_WRITE_HEADER,//写格式头失败
DLV_VIDEO_FAILED_COPY_STREAM_CODEC_CONTEXT,//没有找到解码上下文
DLV_VIDEO_FAILED_ALLOCATING_OUTPUT_STREAM, //输出内存流失败
DLV_VIDEO_NOT_FOUND_SOURCE_STREAM_INFO, //未找到资料流媒体信息
DLV_VIDEO_FAILED_OPEN_SOURCE_STREAM, //打开资源流失败
DLV_VIDEO_SUCCESS //成功
}DLV_AV_ERROR;
//这儿要注意,一定要以extern "C" {}的方式引入头文件
extern "C" {
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
}
#define DLV_BUFFER_WRITE_SIZE 81920 //这是一次性写入缓冲区的大小
typedef struct {
unsigned char* data;
unsigned int len;
}DLV_BUF_DATA, * DLV_BUF_DATA_PTR;
//填充
int FillIoBuffer(void* opaque, uint8_t* buf, int buf_size) {
DLV_BUF_DATA_PTR data = (DLV_BUF_DATA_PTR)opaque;
int read_szie = 0;
if (data->len <= 0)
read_szie = 0;
else
read_szie = data->len - buf_size > 0 ? b