赞
踩
因为项目的需要,需要把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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。