mp4v2再学习 -- H264视频编码成MP4文件
Posted 聚优致成
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mp4v2再学习 -- H264视频编码成MP4文件相关的知识,希望对你有一定的参考价值。
一、H264视频编码成MP4文件
参看:H264视频编码成MP4文件 参看:mp4v2在VS2010下的编译与在项目中的使用 最近做项目需要将H264文件封装为mp4文件,从网上找到了MP4V2库,下载下来后不知道从何下手,官方网站https://code.google.com/p/mp4v2/在windows下的编译过程介绍的很简短,对刚刚开始使用VS2010做大型项目的人来说,实在是有些无力。于是从网上找到了下面几篇博客文章,亲测可用,留下来以备查看。(1)mp4v2 库在VS2017下的编译过程
注:此段内容参考:编译MP4v2Mp4v2 一开始是与 mpeg4ip 这个开源项目捆绑在一起的,现在已经脱离mpeg4ip以一个单独的库存在着。Mp4v2 库提供了一些 API 用来创建修改 MP4 文件。
源码在 http://mp4v2.googlecode.com/svn/trunk/,首先新建一个文件夹用来导入源码,创建文件夹后右键 SVN checkout(需要预先在电脑上安装 TortoiseSVN 客户端),在 URL of repository 中填入http://mp4v2.googlecode.com/svn/trunk/ 这个网址,点击ok后导入代码,再把vstudio9.0\\libmp4v2\\Version.rc 放入 src 文件夹下。
上面的内容其实就是获取 MP4V2 源码。上面两个谷歌网站没有进入,原因你懂的。可从 CSDN 下载。 下载:mp4v2最新源码
然后在进入 vs2013 目录下,用 vs2017 打开 mp4v2.sln 。选择配置为 release win32,成功后,编译 libmp4v2。 在 mp4v2-master\\buildwin\\lib.vs2013\\Win32\\Release 下会生成 4 个文件,lbmp4v2.lib、libmp4v2.dll、libmp4v2.pdb、libmp4v2.exp。这样就完成了。
备注: 1. mp4v2 的源码下载需要用到 SVN 客户端 TortoiseSVN,官方网站上能下载的是 Linux 平台下的代码。 Linux下安装编译之前有讲,参看:mp4v2再学习 -- mp4v2 安装说明
2. 此过程在 VS2017 下打开没有问题。
3. 以后在你的项目中会用到 lbmp4v2.lib、libmp4v2.dll 这两个文件。
上面的操作有几处需要注意的: (1)首先选择配置为 release win32,这个该如何配置? 配置方法:生成->配置管理器,然后将 libmp4v2 配置改为 Release
(2)问题分析 出现 无法打开包括文件: “corecrt.h”
解决方法,参看:VS2015无法打开包括文件corecrt.h 简单来说就是按如下图, 把里面的 10.0.15063.0 文件复制一份,重命名成 10.0.10240.0
(2)mp4v2库在VS2010中的使用
注:此处测试代码参考:H264视频编码成MP4文件,作者代码写的很好,赞一个。此处只是把配置过程再详讲一下。 原文如下:最近需要将H264视频编码成MP4格式。研究了一下,一种方法是采用ffmpeg库,可以先将H264文件解码,再编码生成MP4文件,但这种方式效率较低,10M的视频可能需要几秒钟才能完成。另一种方式根据MP4文件协议直接将H264包封装成MP4格式,由于是直接基于MP4的封装,因而效率很高。H264可以很方便的封装成FLV文件,但MP4格式格式相对比较复杂,封装起来会比较麻烦。由于没时间研究MP4协议,在Google Code上找到一个开源的MP4编解码库Mp4v2(https://code.google.com/p/mp4v2/),通过Mp4v2可以很方便的将H264编码成MP4格式文件。为了方便使用,基于该库封装了一个MP4Encoder类,MP4Encoder封装的接口如下。目前仅支持将H264文件或数据帧编码成MP4文件。
[cpp] view plain copy
- class MP4Encoder
- public:
- MP4Encoder(void);
- ~MP4Encoder(void);
- public:
- // open or creat a mp4 file.
- MP4FileHandle CreateMP4File(const char *fileName,int width,int height,int timeScale = 90000,int frameRate = 25);
- // wirte 264 metadata in mp4 file.
- bool Write264Metadata(MP4FileHandle hMp4File,LPMP4ENC_Metadata lpMetadata);
- // wirte 264 data, data can contain multiple frame.
- int WriteH264Data(MP4FileHandle hMp4File,const unsigned char* pData,int size);
- // close mp4 file.
- void CloseMP4File(MP4FileHandle hMp4File);
- // convert H264 file to mp4 file.
- // no need to call CreateMP4File and CloseMP4File,it will create/close mp4 file automaticly.
- bool WriteH264File(const char* pFile264,const char* pFileMp4);
- // Prase H264 metamata from H264 data frame
- static bool PraseMetadata(const unsigned char* pData,int size,MP4ENC_Metadata &metadata);
- ;
- #include <stdio.h>
- #include "MP4Encoder.h"
- int main(int argc, char** argv)
- MP4Encoder mp4Encoder;
- // convert H264 file to mp4 file
- mp4Encoder.WriteH264File("test.264","test.mp4");
- /********************************************************************
- filename: MP4Encoder.h
- created: 2013-04-16
- author: firehood
- purpose: MP4编码器,基于开源库mp4v2实现(https://code.google.com/p/mp4v2/)。
- *********************************************************************/
- #pragma once
- #include "mp4v2\\mp4v2.h"
- // NALU单元
- typedef struct _MP4ENC_NaluUnit
- int type;
- int size;
- unsigned char *data;
- MP4ENC_NaluUnit;
- typedef struct _MP4ENC_Metadata
- // video, must be h264 type
- unsigned int nSpsLen;
- unsigned char Sps[1024];
- unsigned int nPpsLen;
- unsigned char Pps[1024];
- MP4ENC_Metadata,*LPMP4ENC_Metadata;
- class MP4Encoder
- public:
- MP4Encoder(void);
- ~MP4Encoder(void);
- public:
- // open or creat a mp4 file.
- MP4FileHandle CreateMP4File(const char *fileName,int width,int height,int timeScale = 90000,int frameRate = 25);
- // wirte 264 metadata in mp4 file.
- MP4V2封装的类库,可将H264和AAC直接打包到MP4容器中,堪称经典