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下的编译过程

    注:此段内容参考:编译MP4v2
Mp4v2 一开始是与 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
  1. class MP4Encoder    
  2.     
  3. public:    
  4.     MP4Encoder(void);    
  5.     ~MP4Encoder(void);    
  6. public:    
  7.     // open or creat a mp4 file.    
  8.     MP4FileHandle CreateMP4File(const char *fileName,int width,int height,int timeScale = 90000,int frameRate = 25);    
  9.     // wirte 264 metadata in mp4 file.    
  10.     bool Write264Metadata(MP4FileHandle hMp4File,LPMP4ENC_Metadata lpMetadata);    
  11.     // wirte 264 data, data can contain  multiple frame.    
  12.     int WriteH264Data(MP4FileHandle hMp4File,const unsigned char* pData,int size);     
  13.     // close mp4 file.    
  14.     void CloseMP4File(MP4FileHandle hMp4File);    
  15.     // convert H264 file to mp4 file.    
  16.     // no need to call CreateMP4File and CloseMP4File,it will create/close mp4 file automaticly.    
  17.     bool WriteH264File(const char* pFile264,const char* pFileMp4);    
  18.     // Prase H264 metamata from H264 data frame    
  19.     static bool PraseMetadata(const unsigned char* pData,int size,MP4ENC_Metadata &metadata);    
  20. ;     
客户端调用示例代码: [cpp]  view plain  copy
  1. #include <stdio.h>    
  2. #include "MP4Encoder.h"    
  3.     
  4. int main(int argc, char** argv)    
  5.     
  6.     MP4Encoder mp4Encoder;    
  7.     // convert H264 file to mp4 file    
  8.     mp4Encoder.WriteH264File("test.264","test.mp4");    
  9.     
MP4Encoder的完整代码如下: [cpp]  view plain  copy
  1. /********************************************************************   
  2. filename:   MP4Encoder.h  
  3. created:    2013-04-16  
  4. author:     firehood   
  5. purpose:    MP4编码器,基于开源库mp4v2实现(https://code.google.com/p/mp4v2/)。  
  6. *********************************************************************/    
  7. #pragma once    
  8. #include "mp4v2\\mp4v2.h"    
  9.     
  10. // NALU单元    
  11. typedef struct _MP4ENC_NaluUnit    
  12.     
  13.     int type;    
  14.     int size;    
  15.     unsigned char *data;    
  16. MP4ENC_NaluUnit;    
  17.     
  18. typedef struct _MP4ENC_Metadata    
  19.     
  20.     // video, must be h264 type    
  21.     unsigned int    nSpsLen;    
  22.     unsigned char   Sps[1024];    
  23.     unsigned int    nPpsLen;    
  24.     unsigned char   Pps[1024];    
  25.     
  26.  MP4ENC_Metadata,*LPMP4ENC_Metadata;    
  27.     
  28. class MP4Encoder    
  29.     
  30. public:    
  31.     MP4Encoder(void);    
  32.     ~MP4Encoder(void);    
  33. public:    
  34.     // open or creat a mp4 file.    
  35.     MP4FileHandle CreateMP4File(const char *fileName,int width,int height,int timeScale = 90000,int frameRate = 25);    
  36.     // wirte 264 metadata in mp4 file.    
  37.     MP4V2封装的类库,可将H264和AAC直接打包到MP4容器中,堪称经典

    Chrome或者IE浏览器支持h264视频流播放吗?(不是MP4文件,仅仅是h264编码的视频流)

    FFmpeg4入门13:h264编码为mp4

    嵌入式Linux下MP4视频录制库MP4V2移植和简单介绍

    把h264文件快速包装成mp4格式

    为啥H264编码要先把数据转换成YUV图像格式的