FFMPEG把H264或者H265格式的内存流转换为MP4格式并输出到内存流中

因为项目的需要,需要把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
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值