みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

[xcode]写真を動画にする

毎度お世話になっております。
現在、株式会社エムディエヌコーポレーション社が出した『小学生・中学生でもできるiPhoneアプリ開発XcodeでつくるiOSアプリ』を参考にxcodeにて撮影した写真情報を動画にする作業をしています。
この会社が出しているMovieCreatorファイル(http://www.mdn.co.jp/di/book/3214303003/?page=2)をダウンロードし、ビルドをしたのですがこのダウンロードしたファイルにエラーが出てしまいました。

以下エラーです。(計3つ)
#import "MovieCreator.h"

@implementation MovieCreator

/*!
画像の配列から動画を生成する。

@param images 画像の配列
@param path 動画ファイルの出力先
*/
- (void)writeImagesAsMovie:(NSArray *)images toPath:(NSString *)path
{
NSFileManager *fileManager = [NSFileManager defaultManager];

// ファイルを削除する
[fileManager removeItemAtPath:path error:nil];

// 最初の画像から動画のサイズ指定する
CGSize size = ((UIImage *)images[0]).size;
(1)ここでProperty "size" cannot be found in forward class object "UIImage" というエラー

_videoWriter = [[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:path]
fileType:AVFileTypeQuickTimeMovie
error:nil];

NSDictionary *outputSettings =
@{
AVVideoCodecKey : AVVideoCodecH264,
AVVideoWidthKey : @(size.width),
AVVideoHeightKey : @(size.height),
};

AVAssetWriterInput *writerInput = [AVAssetWriterInput
assetWriterInputWithMediaType:AVMediaTypeVideo
outputSettings:outputSettings];

[_videoWriter addInput:writerInput];

AVAssetWriterInputPixelBufferAdaptor *adaptor = [AVAssetWriterInputPixelBufferAdaptor
assetWriterInputPixelBufferAdaptorWithAssetWriterInput:writerInput
sourcePixelBufferAttributes:nil];

[_videoWriter startWriting];

[_videoWriter startSessionAtSourceTime:kCMTimeZero];

CVPixelBufferRef buffer = NULL;

int frameCount = 0;
// 次の画像を表示する時間感覚の設定です。
// この数字を小さくすると、早く画像が変わるので滑らかに動きます。
// この数字を大きくすると、かくかくした動画になり、面白いです。
float durationForEachImage = 0.5;
int32_t fps = 24;

for (UIImage *image in images)
{
if (adaptor.assetWriterInput.readyForMoreMediaData)
{
CMTime frameTime = CMTimeMake((int64_t)frameCount * fps * durationForEachImage, fps);

buffer = [self pixelBufferFromCGImage:image.CGImage];

(2)ここでProperty "CGImage"cannot be found in forward class object "UIImage"というエラー


if (![adaptor appendPixelBuffer:buffer withPresentationTime:frameTime])
{
NSLog(@"Failed to append buffer. [image : %@]", image);
}

if(buffer) {
CVBufferRelease(buffer);
}

frameCount++;

[NSThread sleepForTimeInterval:0.05];
}
else
{
[NSThread sleepForTimeInterval:0.1];
}
}
// 動画生成終了
[writerInput markAsFinished];
[_videoWriter finishWritingWithCompletionHandler:^
{
NSLog(@"Finish writing!");

// 動画をカメラロールに保存する
UISaveVideoAtPathToSavedPhotosAlbum(path, self, nil, nil);
(3)ここでImplicit declaration of function "UISaveVideoAtPathToSavedPhotosAlbum"is invalid inC99

}];


ちなみにコードは先ほどのダウンロードページにあるchap5にあるAsagaoです。

おそらくこのMovieCreatorファイルのコードにミスがあると思うのですが、まだまだ素人のため解決策が全くわかりません。説明不足の点があれば申し訳ございません。どなたかご教授願います。

投稿日時 - 2014-11-28 14:40:15

QNo.8840182

すぐに回答ほしいです

質問者が選んだベストアンサー

たぶんMovieCreator.hの
#import <Foundation/Foundation.h>

#import <UIKit/UIKit.h>
に修正すれば3つともエラーは無くなると思います。

この本はxcode5(SDK7)を対象にしていますが、
xcode6(SDK8)でビルドする場合は、UIKitをincludeするよう
修正しないとエラーになった経験があり、このケースもおそらく
それだと思います。

この問題について詳しい解説記事を見つけることはできませんでしたが、
本来UIImageクラスを使うにはUIKit.hをincludeしないといけないけど、
おそらくxcode5まではFoundation.hをincludeすることで、たまたま
内部でUIKit.hのincludeも行われていたのだと思います。
それがxcode6になって、そのたまたま状態が解消されたので
ちゃんとUIKit.hの方をincludeしないといけなくなった
(正しい状態に強制されるようになった)のだろうと思います。

ちゃんと調べてませんが、たぶんそういう理解でよいと思います。

投稿日時 - 2014-11-28 16:56:48

お礼

お礼が遅くなってしまい申し訳ございません。
ご回答通りにしたところ無事プログラムが動くようになりました!
本当に助かりました!
ありがとうございます!!

投稿日時 - 2014-12-05 18:58:35

このQ&Aは役に立ちましたか?

13人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問