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

流媒体/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-2002.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  * Dave Mackie dmackie@cisco.com
  20.  */
  21. // N.B. mp4clips clips tracks in an mp4 file
  22. // without regard to sync samples aka "key frames"
  23. // as a testing app the burden is on the user to choose
  24. // an appropriate clip start time
  25. #include "mp4.h"
  26. #include "mpeg4ip_getopt.h"
  27. char* ProgName;
  28. // forward declaration
  29. void ClipTrack(
  30. MP4FileHandle srcFile, 
  31. MP4TrackId trackId, 
  32. MP4FileHandle dstFile,
  33. float startTime,
  34. float duration);
  35. int main(int argc, char** argv)
  36. {
  37. char* usageString = 
  38. "usage: %s [-t <track-id>] [-v [<level>]] [-s <start>] -l <duration> <file-name>n";
  39. char* srcFileName = NULL;
  40. char* dstFileName = NULL;
  41. MP4TrackId trackId = MP4_INVALID_TRACK_ID;
  42. u_int32_t verbosity = MP4_DETAILS_ERROR;
  43. float startTime = 0.0;
  44. float duration = 0.0;
  45. /* begin processing command line */
  46. ProgName = argv[0];
  47. while (true) {
  48. int c = -1;
  49. int option_index = 0;
  50. static struct option long_options[] = {
  51. { "length", 1, 0, 'l' },
  52. { "start", 1, 0, 's' },
  53. { "track", 1, 0, 't' },
  54. { "verbose", 2, 0, 'v' },
  55. { "version", 0, 0, 'V' },
  56. { NULL, 0, 0, 0 }
  57. };
  58. c = getopt_long_only(argc, argv, "l:s:t:v::V",
  59. long_options, &option_index);
  60. if (c == -1)
  61. break;
  62. switch (c) {
  63. case 'l':
  64. if (sscanf(optarg, "%f", &duration) != 1) {
  65. fprintf(stderr, 
  66. "%s: bad length specified: %sn",
  67.  ProgName, optarg);
  68. }
  69. break;
  70. case 's':
  71. if (sscanf(optarg, "%f", &startTime) != 1) {
  72. fprintf(stderr, 
  73. "%s: bad start time specified: %sn",
  74.  ProgName, optarg);
  75. }
  76. break;
  77. case 't':
  78. if (sscanf(optarg, "%u", &trackId) != 1) {
  79. fprintf(stderr, 
  80. "%s: bad track-id specified: %sn",
  81.  ProgName, optarg);
  82. exit(1);
  83. }
  84. break;
  85. case 'v':
  86. verbosity |= MP4_DETAILS_READ;
  87. if (optarg) {
  88. u_int32_t level;
  89. if (sscanf(optarg, "%u", &level) == 1) {
  90. if (level >= 2) {
  91. verbosity |= MP4_DETAILS_TABLE;
  92. if (level >= 3) {
  93. verbosity |= MP4_DETAILS_SAMPLE;
  94. if (level >= 4) {
  95. verbosity = MP4_DETAILS_ALL;
  96. }
  97. }
  98. }
  99. break;
  100. case '?':
  101. fprintf(stderr, usageString, ProgName);
  102. exit(0);
  103. case 'V':
  104.   fprintf(stderr, "%s - %s version %sn", 
  105.   ProgName, PACKAGE, VERSION);
  106.   exit(0);
  107. default:
  108. fprintf(stderr, "%s: unknown option specified, ignoring: %cn", 
  109. ProgName, c);
  110. }
  111. }
  112. /* check that we have at least one non-option argument */
  113. if ((argc - optind) < 1) {
  114. fprintf(stderr, usageString, ProgName);
  115. exit(1);
  116. }
  117. if (verbosity) {
  118. fprintf(stderr, "%s version %sn", ProgName, VERSION);
  119. }
  120. /* point to the specified file name */
  121. srcFileName = argv[optind++];
  122. /* get dest file name */
  123. if ((argc - optind) > 0) {
  124. dstFileName = argv[optind++];
  125. }
  126. /* warn about extraneous non-option arguments */
  127. if (optind < argc) {
  128. fprintf(stderr, "%s: unknown options specified, ignoring: ", ProgName);
  129. while (optind < argc) {
  130. fprintf(stderr, "%s ", argv[optind++]);
  131. }
  132. fprintf(stderr, "n");
  133. }
  134. if (duration == 0.0) {
  135. fprintf(stderr,
  136. "%s: please specify clip length with -l optionn",
  137. ProgName);
  138. }
  139. /* end processing of command line */
  140. MP4FileHandle srcFile = 
  141. MP4Modify(srcFileName, verbosity);
  142. if (!srcFile) {
  143. exit(1);
  144. }
  145. MP4FileHandle dstFile = 
  146. MP4_INVALID_FILE_HANDLE;
  147.  
  148. if (dstFileName) {
  149. dstFile = MP4Create(dstFileName, verbosity);
  150. }
  151. if (trackId == MP4_INVALID_TRACK_ID) {
  152. u_int32_t numTracks = MP4GetNumberOfTracks(srcFile);
  153. for (u_int32_t i = 0; i < numTracks; i++) {
  154. trackId = MP4FindTrackId(srcFile, i);
  155. ClipTrack(srcFile, trackId, dstFile, startTime, duration);
  156. }
  157. } else {
  158. ClipTrack(srcFile, trackId, dstFile, startTime, duration);
  159. }
  160. MP4Close(srcFile);
  161. if (dstFile != MP4_INVALID_FILE_HANDLE) {
  162. MP4Close(dstFile);
  163. }
  164. return(0);
  165. }
  166. void ClipTrack(
  167. MP4FileHandle srcFile, 
  168. MP4TrackId trackId, 
  169. MP4FileHandle dstFile,
  170. float startTime,
  171. float duration)
  172. {
  173. MP4Timestamp trackStartTime =
  174. MP4ConvertToTrackTimestamp(
  175. srcFile,
  176. trackId,
  177. (u_int64_t)(startTime * 1000),
  178. MP4_MSECS_TIME_SCALE);
  179. MP4Duration trackDuration =
  180. MP4ConvertToTrackDuration(
  181. srcFile,
  182. trackId,
  183. (u_int64_t)(duration * 1000),
  184. MP4_MSECS_TIME_SCALE);
  185. MP4EditId editId = 
  186. MP4AddTrackEdit(
  187. srcFile, 
  188. trackId,
  189. 1,
  190. trackStartTime,
  191. trackDuration);
  192. if (editId == MP4_INVALID_EDIT_ID) {
  193. fprintf(stderr,
  194. "%s: can't create track editn",
  195. ProgName);
  196. return;
  197. }
  198. if (dstFile) {
  199. MP4CopyTrack(
  200. srcFile,
  201. trackId,
  202. dstFile,
  203. MP4_COPY_SAMPLES,
  204. true);
  205. MP4DeleteTrackEdit(
  206. srcFile,
  207. trackId, 
  208. editId);
  209. }
  210. }