当前位置:   article > 正文

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

ffmpeg rtsp 的h265 转成mp4

因为项目的需要,需要把H264或者H265的视频流转换为MP4格式的内存流,网上搜索出来的结果只有MP4格式输出到文件的,就是没有找到一个输出到内存流中的,没办法,只能去看FFMPEG的源码,分析相应的函数,经过连续几天的测试验证,终于实现了H264或者H265与MP4内存流之间格式的转换,也就是说H264或者H265格式的视频流进来,出去的时候是MP4格式的内存流,如果需要写文件的话直接把流写入一个文件就可以,不需要做其他的操作。

  1. #include <vector>
  2. /*************************************************
  3. * 描述:把视频数据转换为MP4格式的数据输出到outBuf,注意 不支持音频
  4. * 参数:
  5. * @inBuf:【输入】输入视频数据
  6. * @inBufLen【输入】输入视频数据的长度
  7. * @outBuf:【输出】MP4格式的数据
  8. * 返回:DLV_AV_ERROR
  9. *************************************************/
  10. int DLV_VideoToMP4(unsigned char* inBuf, unsigned int inBufLen, std::vector<unsigned char>& outBuf);
  11. enum
  12. {
  13. DLV_VIDEO_FAILED_WRITE_FRAME = -6,//写帧数据失败
  14. DLV_VIDEO_FAILED_WRITE_HEADER,//写格式头失败
  15. DLV_VIDEO_FAILED_COPY_STREAM_CODEC_CONTEXT,//没有找到解码上下文
  16. DLV_VIDEO_FAILED_ALLOCATING_OUTPUT_STREAM, //输出内存流失败
  17. DLV_VIDEO_NOT_FOUND_SOURCE_STREAM_INFO, //未找到资料流媒体信息
  18. DLV_VIDEO_FAILED_OPEN_SOURCE_STREAM, //打开资源流失败
  19. DLV_VIDEO_SUCCESS //成功
  20. }DLV_AV_ERROR;
  21. //这儿要注意,一定要以extern "C" {}的方式引入头文件
  22. extern "C" {
  23. #include "libavcodec/avcodec.h"
  24. #include "libavformat/avformat.h"
  25. }
  26. #define DLV_BUFFER_WRITE_SIZE 81920 //这是一次性写入缓冲区的大小
  27. typedef struct {
  28. unsigned char* data;
  29. unsigned int len;
  30. }DLV_BUF_DATA, * DLV_BUF_DATA_PTR;
  31. //填充
  32. int FillIoBuffer(void* opaque, uint8_t* buf, int buf_size) {
  33. DLV_BUF_DATA_PTR data = (DLV_BUF_DATA_PTR)opaque;
  34. int read_szie = 0;
  35. if (data->len <= 0)
  36. read_szie = 0;
  37. else
  38. read_szie = data->len - buf_size > 0 ? b
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/491180
推荐阅读
相关标签
  

闽ICP备14008679号