nullvplayer.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:3k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is MPEG4IP.
  13.  * 
  14.  * The Initial Developer of the Original Code is Cisco Systems Inc.
  15.  * Portions created by Cisco Systems Inc. are
  16.  * Copyright (C) Cisco Systems Inc. 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  * Dave Mackie dmackie@cisco.com
  20.  */
  21. #include "mp4.h"
  22. main(int argc, char** argv)
  23. {
  24. if (argc < 2) {
  25. fprintf(stderr, "Usage: %s <file>n", argv[0]);
  26. exit(1);
  27. }
  28. u_int32_t verbosity = MP4_DETAILS_ALL;
  29. char* fileName = argv[1];
  30. // open the mp4 file, and read meta-info
  31. MP4FileHandle mp4File = MP4Read(fileName, verbosity);
  32. u_int8_t profileLevel = MP4GetVideoProfileLevel(mp4File);
  33. // get a handle on the first video track
  34. MP4TrackId trackId = MP4FindTrackId(mp4File, 0, "video");
  35. // gather the crucial track information 
  36. u_int32_t timeScale = MP4GetTrackTimeScale(mp4File, trackId);
  37. // note all times and durations 
  38. // are in units of the track time scale
  39. MP4Duration trackDuration = MP4GetTrackDuration(mp4File, trackId);
  40. MP4SampleId numSamples = MP4GetTrackNumberOfSamples(mp4File, trackId);
  41. u_int32_t maxSampleSize = MP4GetTrackMaxSampleSize(mp4File, trackId);
  42. u_int8_t* pConfig;
  43. u_int32_t configSize = 0;
  44. MP4GetTrackESConfiguration(mp4File, trackId, &pConfig, &configSize);
  45. // initialize decoder with Elementary Stream (ES) configuration
  46. // done with our copy of ES configuration
  47. free(pConfig);
  48. // now consecutively read and display the track samples
  49. u_int8_t* pSample = (u_int8_t*)malloc(maxSampleSize);
  50. u_int32_t sampleSize;
  51. MP4Timestamp sampleTime;
  52. MP4Duration sampleDuration;
  53. MP4Duration sampleRenderingOffset;
  54. bool isSyncSample;
  55. for (MP4SampleId sampleId = 1; sampleId <= numSamples; sampleId++) {
  56. // give ReadSample our own buffer, and let it know how big it is
  57. sampleSize = maxSampleSize;
  58. // read next sample from video track
  59. MP4ReadSample(mp4File, trackId, sampleId, 
  60. &pSample, &sampleSize,
  61. &sampleTime, &sampleDuration, &sampleRenderingOffset, 
  62. &isSyncSample);
  63. // convert timestamp and duration from track time to milliseconds
  64. u_int64_t myTime = MP4ConvertFromTrackTimestamp(mp4File, trackId, 
  65. sampleTime, MP4_MSECS_TIME_SCALE);
  66. u_int64_t myDuration = MP4ConvertFromTrackDuration(mp4File, trackId,
  67. sampleDuration, MP4_MSECS_TIME_SCALE);
  68. // decode frame and display it
  69. }
  70. // close mp4 file
  71. MP4Close(mp4File);
  72. // Note to seek to time 'when' in the track
  73. // use MP4GetSampleIdFromTime(MP4FileHandle hFile, 
  74. // MP4Timestamp when, bool wantSyncSample)
  75. // 'wantSyncSample' determines if a sync sample is desired or not
  76. // e.g.
  77. // MP4Timestamp when = 
  78. // MP4ConvertToTrackTimestamp(mp4File, trackId, 30, MP4_SECS_TIME_SCALE);
  79. // MP4SampleId newSampleId = MP4GetSampleIdFromTime(mp4File, when, true);
  80. // MP4ReadSample(mp4File, trackId, newSampleId, ...);
  81. // 
  82. // Note that start time for sample may be later than 'when'
  83. exit(0);
  84. }