본문 바로가기
프로그래밍/iOS

iOS ffmpeg player (rtsp 플레이어)

by 백룡화검 2012. 9. 5.

출처 : http://bluexmas.tistory.com/277


ffmpeg 라이브러리를 이용해서 wowza서버를 사용하는 rtsp 플레이어를 제작해보았습니다.
소스는 iFrameExtractor 프로젝트에서 파일 오픈하는 부분을 rtsp 주소를 사용했고,
ffmpeg 라이브러리 경로를 따로 설정해서 컴파일 했습니다.

설치한 ffmpeg 라이브러리가 ios용으로 컴파일 되어 있어서
시뮬레이터에서는 테스트 할 수가 없네요.

iFrameExtractor 프로젝트는 ffmpeg 라이브러리만 사용했기 때문에 플레이는 되지만,
속도는 나오지 않습니다. OpenGL ES / SDL 라이브러리 이용해야 될 것 같네요.

출처

http://stackoverflow.com/questions/10518082/how-can-you-pass-yuv-frames-from-ffmpeg-to-opengl-es
Tech Tutorial – How to setup a SDL-Ready XCode4 Project
CODEC_TYPE_VIDEO undefined
ffmpeg을 이용한 iOS 동영상 플레이어

https://groups.google.com/forum/#!topic/appspresso-ko/eR8hlHjZRBs
https://developer.apple.com/library/safari/#documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/AudioandVideoTagBasics/AudioandVideoTagBasics.html#//apple_ref/doc/uid/TP40009523-CH2-SW4
http://code.google.com/p/chromium/issues/detail?id=82106

소스 다운로드

iFrameExtractor

ffmpeg 라이브러리 경로 설정

오류 수정

CODEC_TYPE_VIDEO undefined 발생 한다면,
AVMEDIA_TYPE_VIDEO 로 수정

rtsp 주소 설정
iFrameExtractorAppDelegate.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- (void)applicationDidFinishLaunching:(UIApplication *)application {   
    //self.video = [[VideoFrameExtractor alloc] initWithVideo:[Utilities bundlePath:@"sophie.mov"]];
    //self.video = [[VideoFrameExtractor alloc] initWithVideo:[Utilities bundlePath:@"oh.mp4"]];
    self.video = [[VideoFrameExtractor alloc] initWithVideo:@"rtsp://192.168.0.13/vod/mp4:sample.mp4"];
    [video release];
 
    // set output image size
    video.outputWidth = 426;
    video.outputHeight = 320;
     
    // print some info about the video
    NSLog(@"video duration: %f",video.duration);
    NSLog(@"video size: %d x %d", video.sourceWidth, video.sourceHeight);
     
    // video images are landscape, so rotate image view 90 degrees
    [imageView setTransform:CGAffineTransformMakeRotation(M_PI/2)];
    [window makeKeyAndVisible];
}

YUV 데이터 -> RGB 데이터 소스
VideoFrameExtractor.m

1
2
3
4
5
-(void)convertFrameToRGB { 
    sws_scale (img_convert_ctx, pFrame->data, pFrame->linesize,
               0, pCodecCtx->height,
               picture.data, picture.linesize);
}

실행