JXConvertMedia.m 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  1. //
  2. // JXConvertMedia.m
  3. // MyAVController
  4. //
  5. // Created by imac on 13-3-8.
  6. // Copyright (c) 2013年 __MyCompanyName__. All rights reserved.
  7. //
  8. #import "JXConvertMedia.h"
  9. #import "UIImage-Extensions.h"
  10. @implementation JXConvertMedia
  11. @synthesize outputFileName;
  12. @synthesize audioSampleRate,audioEncodeBitRate,videoWidth,videoHeight,videoEncodeBitRate,videoFrames,audioChannels,saveVideoToImage,logoRect,logoImage,rotateSize,inputAudioFile1,inputAudioFile2,progress,progressText,delegate,onFinish;
  13. - (id)init {
  14. self = [super init];
  15. if (self) {
  16. audioSampleRate = 44100;
  17. audioEncodeBitRate = 64000;
  18. audioChannels = 1;
  19. videoEncodeBitRate = 300*1000;
  20. videoHeight = JX_SCREEN_WIDTH;
  21. videoWidth = 480;
  22. videoFrames = 15;
  23. [self initRotateSize];
  24. }
  25. return self;
  26. }
  27. - (void)dealloc {
  28. // NSLog(@"JXConvertMedia.dealloc");
  29. // [_videoReader release];
  30. // [_audioReader1 release];
  31. // [_audioReader2 release];
  32. // [_videoInput release];
  33. // [_audioInput release];
  34. // [_writer release];
  35. // [super dealloc];
  36. }
  37. -(void)openMedia:(NSString*)video audio1:(NSString*)audio1 audio2:(NSString*)audio2
  38. {
  39. AVURLAsset * assetVideo;
  40. if(video){
  41. NSURL* url = [NSURL fileURLWithPath:video];
  42. if ([video rangeOfString:@"://"].location != NSNotFound) {
  43. url = [NSURL URLWithString:video];
  44. }
  45. assetVideo = [AVURLAsset URLAssetWithURL:url options:nil];
  46. [self readVideo:assetVideo];
  47. }
  48. if(audio1){
  49. NSURL* url = [NSURL fileURLWithPath:audio1];
  50. AVURLAsset * assetAudio = [AVURLAsset URLAssetWithURL:url options:nil];
  51. [self readAudio1:assetAudio];
  52. }
  53. if(audio2){
  54. if(![video isEqualToString:audio2]){
  55. NSURL* url = [NSURL fileURLWithPath:audio2];
  56. assetVideo = [AVURLAsset URLAssetWithURL:url options:nil];
  57. }
  58. [self readAudio2:assetVideo];
  59. }
  60. [self createWriter];
  61. }
  62. - (void)readVideo:(AVURLAsset*)asset
  63. {
  64. AVAssetTrack * videoTrack = nil;
  65. NSArray * tracks = [asset tracksWithMediaType:AVMediaTypeVideo];
  66. if ([tracks count] == 1)
  67. {
  68. videoTrack = [tracks objectAtIndex:0];
  69. NSError * error = nil;
  70. _videoReader = [[AVAssetReader alloc] initWithAsset:asset error:&error];
  71. // if (error)
  72. // NSLog(@"_videoReader fail!\n");
  73. NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey;
  74. NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA];
  75. NSDictionary* videoSettings =
  76. [NSDictionary dictionaryWithObject:value forKey:key];
  77. [_videoReader addOutput:[AVAssetReaderTrackOutput
  78. assetReaderTrackOutputWithTrack:videoTrack
  79. outputSettings:videoSettings]];
  80. [_videoReader startReading];
  81. }
  82. }
  83. - (void)readAudio1:(AVURLAsset*)asset{
  84. AVAssetTrack * audioTrack = nil;
  85. NSArray * tracks = [asset tracksWithMediaType:AVMediaTypeAudio];
  86. if ([tracks count] == 1)
  87. {
  88. audioTrack = [tracks objectAtIndex:0];
  89. _audiotimeRange1= CMTimeRangeMake(kCMTimeZero, asset.duration);
  90. NSError * error = nil;
  91. _audioReader1 = [[AVAssetReader alloc] initWithAsset:asset error:&error];
  92. // if (error)
  93. // NSLog(@"_audioReader fail!\n");
  94. NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
  95. [NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey,
  96. nil ];
  97. [_audioReader1 addOutput:[AVAssetReaderTrackOutput
  98. assetReaderTrackOutputWithTrack:audioTrack
  99. outputSettings:settings]];
  100. [_audioReader1 startReading];
  101. }
  102. }
  103. - (void)readAudio2:(AVURLAsset*)asset{
  104. AVAssetTrack * audioTrack = nil;
  105. NSArray * tracks = [asset tracksWithMediaType:AVMediaTypeAudio];
  106. if ([tracks count] == 1)
  107. {
  108. audioTrack = [tracks objectAtIndex:0];
  109. NSError * error = nil;
  110. _audioReader2 = [[AVAssetReader alloc] initWithAsset:asset error:&error];
  111. // if (error)
  112. // NSLog(@"_audioReader fail!\n");
  113. NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
  114. [NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey,
  115. nil ];
  116. [_audioReader2 addOutput:[AVAssetReaderTrackOutput
  117. assetReaderTrackOutputWithTrack:audioTrack
  118. outputSettings:settings]];
  119. [_audioReader2 startReading];
  120. }
  121. }
  122. -(void) convert{
  123. [_writer startWriting];
  124. if(_videoReader)
  125. [self convertVideo];
  126. if(_audioReader1){
  127. if(_audioReader2)
  128. [self addTwoAudio];
  129. else
  130. [self convertOneAudio];
  131. }
  132. // [_writer endSessionAtSourceTime:_time];
  133. [_videoInput markAsFinished];
  134. [_audioInput markAsFinished];
  135. [_writer finishWriting];
  136. // [_writer finishWritingWithCompletionHandler:^{
  137. // NSLog(@"convert completed");
  138. // [self.delegate performSelectorOnMainThread:self.onFinish withObject:[outputFileName lastPathComponent] waitUntilDone:NO];
  139. // }];
  140. // NSLog(@"convert ok");
  141. }
  142. -(void) convertVideo{
  143. CMTime timeStart,timelen;
  144. double maxLen = (double)_audiotimeRange1.duration.value/_audiotimeRange1.duration.timescale;
  145. AVAssetReaderTrackOutput * outputVideo = [_videoReader.outputs objectAtIndex:0];
  146. _writeVideoCount = 0;
  147. [self setProgressValue:0];
  148. while ([_videoReader status] == AVAssetReaderStatusReading)
  149. {
  150. CMSampleBufferRef sampleBuffer = [outputVideo copyNextSampleBuffer];
  151. if (sampleBuffer){
  152. _time = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
  153. if(_writeVideoCount==0){
  154. [_writer startSessionAtSourceTime:_time];
  155. timeStart = _time;
  156. }
  157. //超时则退出
  158. timelen = CMTimeSubtract(_time,timeStart);
  159. double curLen = (double)timelen.value/timelen.timescale;
  160. [self setProgressValue:curLen/maxLen];
  161. if(curLen >= maxLen)
  162. break;
  163. [self changeSample:sampleBuffer];
  164. [self writeSampleBuffer:sampleBuffer ofType:AVMediaTypeVideo];
  165. // _time = CMSampleBufferGetOutputPresentationTimeStamp(sampleBuffer);
  166. _writeVideoCount++;
  167. CMItemCount numSamplesInBuffer = CMSampleBufferGetNumSamples(sampleBuffer);
  168. double sec = (double)_time.value/_time.timescale;
  169. // NSLog(@"%d,%d,%d,%d,%f",_writeVideoCount,numSamplesInBuffer,_time.value,_time.timescale,sec);
  170. CFRelease(sampleBuffer);
  171. }
  172. }
  173. _timeLast = _time;
  174. }
  175. /*
  176. -(void) convertVideo{
  177. CMTime timeStart,timelen;
  178. double maxLen = (double)_audiotimeRange1.duration.value/_audiotimeRange1.duration.timescale;
  179. AVAssetReaderTrackOutput * outputVideo = [_videoReader.outputs objectAtIndex:0];
  180. _writeVideoCount = 0;
  181. [self setProgressValue:0];
  182. AVAssetReaderTrackOutput * outputAudio = [_audioReader1.outputs objectAtIndex:0];
  183. while ([_videoReader status] == AVAssetReaderStatusReading)
  184. {
  185. CMSampleBufferRef sampleBuffer = [outputVideo copyNextSampleBuffer];
  186. if (sampleBuffer){
  187. _time = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
  188. if(_writeVideoCount==0){
  189. [_writer startSessionAtSourceTime:_time];
  190. timeStart = _time;
  191. }
  192. //超时则退出
  193. timelen = CMTimeSubtract(_time,timeStart);
  194. double curLen = (double)timelen.value/timelen.timescale;
  195. [self setProgressValue:curLen/maxLen];
  196. if(curLen >= maxLen)
  197. break;
  198. [self changeSample:sampleBuffer];
  199. [self writeSampleBuffer:sampleBuffer ofType:AVMediaTypeVideo];
  200. _writeVideoCount++;
  201. CMItemCount numSamplesInBuffer = CMSampleBufferGetNumSamples(sampleBuffer);
  202. NSLog(@"video=%d,%d",_writeVideoCount,numSamplesInBuffer);
  203. CFRelease(sampleBuffer);
  204. if ([_audioReader1 status] == AVAssetReaderStatusReading)
  205. {
  206. CMSampleBufferRef sampleBuffer = [outputAudio copyNextSampleBuffer];
  207. if (sampleBuffer){
  208. _time = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
  209. [self writeSampleBuffer:sampleBuffer ofType:AVMediaTypeAudio];
  210. _writeAudioCount1++;
  211. CMItemCount numSamplesInBuffer = CMSampleBufferGetNumSamples(sampleBuffer);
  212. NSLog(@"audio=%d,%d",_writeAudioCount1,numSamplesInBuffer);
  213. CFRelease(sampleBuffer);
  214. }
  215. }
  216. }
  217. }
  218. }*/
  219. -(void)convertOneAudio{
  220. //转换音频:
  221. AVAssetReaderTrackOutput * outputAudio = [_audioReader1.outputs objectAtIndex:0];
  222. // CMTime time;
  223. _writeAudioCount1 = 0;
  224. while ([_audioReader1 status] == AVAssetReaderStatusReading)
  225. {
  226. CMSampleBufferRef sampleBuffer = [outputAudio copyNextSampleBuffer];
  227. if (sampleBuffer){
  228. _time = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
  229. // if(_writeAudioCount1==0)
  230. // [_writer startSessionAtSourceTime:_time];
  231. [self writeSampleBuffer:sampleBuffer ofType:AVMediaTypeAudio];
  232. _writeAudioCount1++;
  233. // _time = CMSampleBufferGetOutputPresentationTimeStamp(sampleBuffer);
  234. double sec = (double)_time.value/_time.timescale;
  235. CMItemCount numSamplesInBuffer = CMSampleBufferGetNumSamples(sampleBuffer);
  236. // NSLog(@"%d,%d,%d,%d,%f",_writeAudioCount1,numSamplesInBuffer,_time.value,_time.timescale,sec);
  237. CFRelease(sampleBuffer);
  238. }
  239. }
  240. }
  241. -(void)addTwoAudio{
  242. CMTime time,timeStart,timelen;
  243. double maxLen = (double)_audiotimeRange1.duration.value/_audiotimeRange1.duration.timescale;
  244. AudioBufferList audioBufferList1;
  245. AudioBuffer audioBuffer1;
  246. AudioBufferList audioBufferList2;
  247. AudioBuffer audioBuffer2;
  248. //转换音频:
  249. AVAssetReaderTrackOutput * outputAudio1 = [_audioReader1.outputs objectAtIndex:0];
  250. AVAssetReaderTrackOutput * outputAudio2 = [_audioReader2.outputs objectAtIndex:0];
  251. _writeAudioCount1 = 0;
  252. [self setProgressValue:0];
  253. while ([_audioReader1 status] == AVAssetReaderStatusReading)
  254. {
  255. CMSampleBufferRef sampleBuffer1 = [outputAudio1 copyNextSampleBuffer];
  256. if (sampleBuffer1){
  257. time = CMSampleBufferGetPresentationTimeStamp(sampleBuffer1);
  258. if(_writeAudioCount1==0){
  259. [_writer startSessionAtSourceTime:time];
  260. timeStart = time;
  261. }
  262. timelen = CMTimeSubtract(time,timeStart);
  263. double curLen = (double)timelen.value/timelen.timescale;
  264. [self setProgressValue:curLen/maxLen];
  265. if(curLen >= maxLen)
  266. break;
  267. if(_audioReader2){//假如有双音轨:
  268. if([_audioReader2 status] == AVAssetReaderStatusReading){
  269. CMSampleBufferRef sampleBuffer2 = [outputAudio2 copyNextSampleBuffer];
  270. if(sampleBuffer2) {
  271. CMItemCount samples1 = CMSampleBufferGetNumSamples(sampleBuffer1);
  272. CMItemCount samples2 = CMSampleBufferGetNumSamples(sampleBuffer2);
  273. CMBlockBufferRef blockBuffer1;
  274. CMBlockBufferRef blockBuffer2;
  275. CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampleBuffer1, NULL, &audioBufferList1, sizeof(audioBufferList1), NULL, NULL, kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment, &blockBuffer1);
  276. audioBuffer1 = audioBufferList1.mBuffers[0];
  277. CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampleBuffer2, NULL, &audioBufferList2, sizeof(audioBufferList2), NULL, NULL, kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment, &blockBuffer2);
  278. audioBuffer2 = audioBufferList2.mBuffers[0];
  279. SInt16* p1 = audioBuffer1.mData;
  280. SInt16* p2 = audioBuffer2.mData;
  281. for(int i=0;i<samples1;i++){
  282. p1[i] = get2To1Sample16(p1[i] , p2[i*2], 1, 1);
  283. // p1[i*2] = get2To1Sample16(p1[i*2] , p2[i], 1, 1);
  284. // p1[i*2+1] = get2To1Sample16(p1[i*2+1] , p2[i], 1, 1);
  285. }
  286. p1 = NULL;
  287. p2 = NULL;
  288. CFRelease(sampleBuffer2);
  289. // NSLog(@"count=%d,mDataByteSize=%d,%d;samples=%d,%d;",_writeAudioCount1,audioBuffer1.mDataByteSize,audioBuffer2.mDataByteSize,samples1,samples2);
  290. }
  291. }
  292. }
  293. [self writeSampleBuffer:sampleBuffer1 ofType:AVMediaTypeAudio];
  294. CFRelease(sampleBuffer1);
  295. // NSLog(@"%d",_writeAudioCount1);
  296. // NSLog(@"count=%d,mDataByteSize=%d,%d;samples=%d,%d;",_writeAudioCount1,audioBuffer1.mDataByteSize,audioBuffer2.mDataByteSize);
  297. _writeAudioCount1++;
  298. }
  299. }
  300. }
  301. SInt32 get2To1Sample32(SInt32 n1,SInt32 n2,float volume,float volRecord){
  302. return (n1*volRecord+volume*n2)/2; //录音放大2倍,伴奏跟随音量调节
  303. }
  304. SInt16 get2To1Sample16(SInt16 n1,SInt16 n2,float volume,float volRecord){
  305. return (n1*volRecord+volume*n2)/2; //录音放大2倍,伴奏跟随音量调节
  306. }
  307. -(void)setProgressValue:(double)n{
  308. progress.progress = n;
  309. progressText.text = [[NSString stringWithFormat:@"%.0f",progress.progress*100] stringByAppendingString:@"%"];
  310. [[NSRunLoop currentRunLoop]runUntilDate:[NSDate distantPast]];//重要
  311. }
  312. - (void) writeSampleBuffer:(CMSampleBufferRef)sampleBuffer ofType:(NSString *)mediaType
  313. {
  314. // if ( _writer.status == AVAssetWriterStatusUnknown ) {
  315. //
  316. // if ([_writer startWriting]) {
  317. // [_writer startSessionAtSourceTime:CMSampleBufferGetPresentationTimeStamp(sampleBuffer)];
  318. // }
  319. // }
  320. if ( _writer.status == AVAssetWriterStatusWriting ) {
  321. if (mediaType == AVMediaTypeVideo) {
  322. if (_videoInput.readyForMoreMediaData)
  323. [_videoInput appendSampleBuffer:sampleBuffer];
  324. }
  325. if (mediaType == AVMediaTypeAudio) {
  326. if (_audioInput.readyForMoreMediaData)
  327. [_audioInput appendSampleBuffer:sampleBuffer];
  328. }
  329. }
  330. }
  331. - (void)removeFile:(NSURL *)fileURL
  332. {
  333. NSFileManager *fileManager = [NSFileManager defaultManager];
  334. NSString *filePath = [fileURL path];
  335. if ([fileManager fileExistsAtPath:filePath]) {
  336. NSError *error;
  337. [fileManager removeItemAtPath:filePath error:&error];
  338. // if (!success)
  339. // [self showError:error];
  340. }
  341. }
  342. - (BOOL) createWriter
  343. {
  344. if ([[NSFileManager defaultManager] fileExistsAtPath:outputFileName])
  345. [[NSFileManager defaultManager] removeItemAtPath:outputFileName error:NULL];
  346. NSError *error = nil;
  347. _writer = [[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:outputFileName] fileType:AVFileTypeMPEG4 error:&error];
  348. if (error)
  349. {
  350. // NSLog(@"%@", error);
  351. return NO;
  352. }
  353. AudioChannelLayout acl;
  354. bzero( &acl, sizeof(acl));
  355. if(audioChannels>=2)
  356. acl.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo;
  357. else
  358. acl.mChannelLayoutTag = kAudioChannelLayoutTag_Mono;
  359. NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
  360. [NSNumber numberWithInt:kAudioFormatMPEG4AAC], AVFormatIDKey,
  361. [NSNumber numberWithFloat:audioSampleRate], AVSampleRateKey,
  362. [NSNumber numberWithInt:audioChannels], AVNumberOfChannelsKey,
  363. [NSNumber numberWithInt:audioEncodeBitRate], AVEncoderBitRateKey,
  364. [NSData dataWithBytes:&acl length:sizeof(acl)], AVChannelLayoutKey,
  365. nil ];
  366. _audioInput = [[AVAssetWriterInput alloc] initWithMediaType:AVMediaTypeAudio outputSettings:settings];
  367. _audioInput.expectsMediaDataInRealTime = YES;
  368. [_writer addInput:_audioInput];
  369. NSDictionary *codecSettings = [NSDictionary dictionaryWithObjectsAndKeys:
  370. [NSNumber numberWithInt:videoEncodeBitRate], AVVideoAverageBitRateKey,
  371. [NSNumber numberWithInt:videoFrames],AVVideoMaxKeyFrameIntervalKey,
  372. AVVideoProfileLevelH264Main31, AVVideoProfileLevelKey,
  373. nil];
  374. settings = [NSDictionary dictionaryWithObjectsAndKeys:
  375. AVVideoCodecH264, AVVideoCodecKey,
  376. [NSNumber numberWithInt:((int)videoWidth/16)*16], AVVideoWidthKey,
  377. [NSNumber numberWithInt:((int)videoHeight/16)*16], AVVideoHeightKey,
  378. codecSettings,AVVideoCompressionPropertiesKey,
  379. nil];
  380. _videoInput = [[AVAssetWriterInput alloc] initWithMediaType:AVMediaTypeVideo outputSettings:settings];
  381. _videoInput.expectsMediaDataInRealTime = YES;
  382. _writer.shouldOptimizeForNetworkUse = YES;
  383. [_writer addInput:_videoInput];
  384. return YES;
  385. }
  386. -(void)changeSample:(CMSampleBufferRef)sampleBuffer {
  387. @autoreleasepool {
  388. // NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  389. /*Lock the image buffer*/
  390. CVImageBufferRef imageBuffer=NULL;
  391. imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
  392. CVPixelBufferLockBaseAddress(imageBuffer,0);
  393. /*Get information about the image*/
  394. uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer);
  395. size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
  396. long width = CVPixelBufferGetWidth(imageBuffer);
  397. long height = CVPixelBufferGetHeight(imageBuffer);
  398. // UIGraphicsBeginImageContext(rotateSize);
  399. /*Create a CGImageRef from the CVImageBufferRef*/
  400. CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  401. CGContextRef newContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
  402. CGImageRef newImage = CGBitmapContextCreateImage(newContext);
  403. /*
  404. CGContextTranslateCTM(newContext, rotateSize.width/2, rotateSize.height/2);
  405. CGContextRotateCTM(newContext, -90.0 * M_PI / 180);
  406. CGContextScaleCTM(newContext, 1.0, 1.0);
  407. CGContextDrawImage(newContext, CGRectMake(-width/2, -height/2, width, height), newImage);
  408. */
  409. if(logoImage)
  410. CGContextDrawImage(newContext,logoRect,logoImage.CGImage);
  411. if(saveVideoToImage)
  412. [self saveToImage:sampleBuffer newImage:newImage];
  413. //[_customLayer performSelectorOnMainThread:@selector(setContents:) withObject: (id) newImage waitUntilDone:YES];
  414. //[_imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];
  415. CGContextRelease(newContext);
  416. CGColorSpaceRelease(colorSpace);
  417. CGImageRelease(newImage);
  418. CVPixelBufferUnlockBaseAddress(imageBuffer,0);
  419. // [pool drain];
  420. }
  421. }
  422. -(void)saveToImage:(CMSampleBufferRef)sampleBuffer newImage:(CGImageRef)newImage{
  423. CMTime n = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
  424. int m = (int)(n.value / n.timescale);
  425. if(m % saveVideoToImage == 0){
  426. NSString* s = [NSString stringWithFormat:@"%@convert_video_%d.jpg",docFilePath,m];
  427. if(![s isEqualToString:_lastSaveFile]){
  428. UIImage *image= [UIImage imageWithCGImage:newImage scale:1.0 orientation:UIImageOrientationRight];
  429. image = [image imageAtRect:CGRectMake(80, 0, JX_SCREEN_WIDTH, JX_SCREEN_WIDTH)];
  430. NSData* data = UIImageJPEGRepresentation(image,0.8f);
  431. // NSLog(@"saveToImage:%@",s);
  432. [data writeToFile:s atomically:YES];
  433. image = nil;
  434. data = nil;
  435. // [_lastSaveFile release];
  436. _lastSaveFile = s;
  437. // [_lastSaveFile retain];
  438. }
  439. }
  440. }
  441. -(void)initRotateSize{
  442. UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0, 0, videoWidth, videoHeight)];
  443. CGAffineTransform t = CGAffineTransformMakeRotation(-90.0/180*M_PI);
  444. rotatedViewBox.transform = t;
  445. rotateSize = rotatedViewBox.frame.size;
  446. // [rotatedViewBox release];
  447. rotateSize.width=480;
  448. rotateSize.height=480;
  449. // NSLog(@"rotateSize=%f,%f",rotateSize.width, rotateSize.height);
  450. }
  451. @end