mp4v2研究笔记1-获得Track(新)
来源:互联网 发布:淘宝图片自己拍 编辑:程序博客网 时间:2024/05/01 22:23
***免责申明:本博客是博主研究mp4v2时的笔记,第一初衷是备忘,是写给自己看的,想到多少写多少,文中观点很可能不正确,也可能缺乏逻辑性,可读性,不喜勿喷。***
正文:
mp4v2是一个开源的分析mp4文件结构的工具。解压下载包后发现有一个vstudio9.0文件夹,非常感谢作者直接给了一个VC工程,不像其它的开源代码只有基于linux的版本,还得自己改为windows版本。这里但是要特别提醒一下,从官方下载的源码天生就缺少3个文件,下载了就编译肯定是编不过的,需要在网上找到那三个文件。编译完后会生成一个libmp4v2.lib静态库,编译前需要设置一个工程属性,“C/C++ / 输出文件 / 程序数据库文件名”,它原本是vc90.pdb,改为libmp4v2.pdb,否则以后断点执行时不会进入到源码中,这个问题折腾了我好久。如何在VC下编译有很多网文,此处略过。
库编译后,还有几个演示工程,他们可以向您演示如何使用mp4v2库(其实我觉得还差很远)
我们从mp4track工程开始研究起。且看它的代码,很简洁,但是太简洁了也不好使,我们要把它剥皮,把TrackUtility这外包装类去掉,才好真正的在在自己的代码中使用mp4v2库。
extern "C"int main( int argc, char** argv ){ mp4v2::util::TrackUtility util( argc, argv ); return util.process();}
如何去掉这层皮也不是很复杂的事,我花了半小时把皮剥好了,如果你创建一个工程直接使用如下代码,即可运行,效果与上面一样,但是少了一些包装类工具类,让我们更容易深入本质研究分析代码:
#include "stdafx.h"#include "util/impl.h"#pragma comment( lib, "..\\debug\\libmp4v2.lib" )using namespace std;void verbose1f( const char* format, ... ){va_list ap;va_start( ap, format );vfprintf( stdout, format, ap );va_end( ap );}bool actionListSinglex( MP4FileHandle fileHandle, uint16_t index ){mp4v2::util::TrackModifier tm( fileHandle, index );//这是解析Track的关键,TrackModifier中有关于Track的一切信息ostringstream report;tm.dump( report, " ");verbose1f( "%s", report.str().c_str() );return false;}extern "C"int main( int argc, char** argv ){string strFile("d:\\clip\\workers_world_co64_box64.mp4");MP4FileHandle fileHandle = MP4Read(strFile.c_str());if( fileHandle == MP4_INVALID_FILE_HANDLE ) return printf( "unable to open for read: %s\n", strFile.c_str() );bool result = 0;const uint16_t trackc = static_cast<uint16_t>( MP4GetNumberOfTracks( fileHandle )); for( uint16_t i = 0; i < trackc; i++ ){if( actionListSinglex( fileHandle, i ))result = 1;}MP4Close(fileHandle);return result;}
我们来看上面的代码,main函数中,首先是打开一个mp4文件。使用MP4Read函数打开文件,除了openfile之外还做了读取所有atom信息的操作:
void MP4File::Read( const char* name, const MP4FileProvider* provider ){ Open( name, File::MODE_READ, provider ); ReadFromFile();//获取所有atom CacheProperties();}
打开文件之后,用MP4GetNumberOfTracks获得轨道数,再循环打印每个轨道的信息。其实track信息早已在MP4Read函数中读取了,MP4GetNumberOfTracks只是简单的返回MP4File类中的私有数组m_pTracks的Size。
我们来看看main函数中的actionListSinglex,其中最关键的一句:mp4v2::util::TrackModifier tm( fileHandle, index );这个TrackModifier类在构造函数中调用了refTrackAtom方法,对了,就是这个方法在所有的atom中找到track,因为track也是atom的一种:
MP4Atom& TrackModifier::refTrackAtom( MP4File& file, uint16_t index ){ MP4Atom& root = *file.FindAtom( NULL ); ostringstream oss; oss << "moov.trak[" << index << "]"; MP4Atom* trak = root.FindAtom( oss.str().c_str() ); if( !trak ) { oss.str( "" ); oss << "trackIndex " << index << " not found"; throw new Exception( oss.str(), __FILE__, __LINE__, __FUNCTION__ ); } return *trak;}
这里涉及到相关知识点,即mp4文件的结构,可以参考这个链接:MP4文件格式
- mp4v2研究笔记1-获得Track(新)
- MP4v2获得h264数据
- mp4v2
- MP4V2
- MP4V2
- Audio笔记之Track::attachAuxEffect
- mp4v2 使用系列(一)
- MP4v2 基本使用(二)
- [Interview Street] Track 1
- [Interview Street] Track 1
- track
- GSM-Track 开发日志 GSM-Track开发 STEP 1
- Back Track 5学习笔记一
- 磁盘的磁道(Track)
- 磁盘的磁道(Track)
- Do Not Track(DNT)
- 磁盘的磁道(Track)
- 磁盘的磁道(Track)
- 名称重定义
- 我成为VB编程语言的爱好者~
- linux防火墙iptables简单介绍
- 归纳(未完,待续更新时间14.02.06)
- OpenGL 纹理映射
- mp4v2研究笔记1-获得Track(新)
- JAVA默认排序算法问题
- 无法找到表单域
- 大数据的处理策略
- vs中设置断点发生错位的常用解决办法
- 『黑马程序员』---java--IO--字符流基础
- hexToDec
- 排列算法——字典序法
- 插入排序--直接插入排序和希尔排序