iOS - How to play a video with transparency? - ios

I recorded a video with a bluescreen. We have the software to convert that video to a transparent background. What's the best way to play this video overlaid on a custom UIView? Anytime I've seen videos on the iPhone it always launches that player interface. Any way to avoid this?

Don't know if anyone is still interested in this besides me, but I'm using GPUImage and the Chromakey filter to achieve this^^ https://github.com/BradLarson/GPUImage
EDIT: example code of what I did (may be dated now):
-(void)AnimationGo:(GPUImageView*)view {
NSURL *url = [[NSBundle mainBundle] URLForResource:#"test" withExtension:#"mov"];
movieFile = [[GPUImageMovie alloc] initWithURL:url];
filter = [[GPUImageChromaKeyBlendFilter alloc] init];
[movieFile addTarget:filter];
GPUImageView* imageView = (GPUImageView*)view;
[imageView setBackgroundColorRed:0.0 green:0.0 blue:0.0 alpha:0.0];
imageView.layer.opaque = NO;
[filter addTarget:imageView];
[movieFile startProcessing];
//to loop
[imageView setCompletionBlock:^{
[movieFile removeAllTargets];
[self AnimationGo:view];
}];
}
I may have had to modify GPUImage a bit, and it may not work with the latest version of GPUImage but that's what we used

You'll need to build a custom player using AVFoundation.framework and then use a video with alpha channel. The AVFoundation framework allows much more robust handeling of video without many of the limitations of MPMedia framework. Building a custom player isn't as hard as people make it out to be. I've written a tutorial on it here:
http://www.sdkboy.com/?p=66

I'm assuming what you're trying to do is actually remove the blue screen in real-time from your video: you'll need to play the video through OpenGL, run pixel shaders on the frames and finally render everything using an OpenGL layer with a transparent background.
See the Capturing from the Camera using AV Foundation on iOS 5 session from WWDC 2011 which explains techniques to do exactly that (watch Chroma Key demo at 9:00). Presumably the source can be downloaded but I can't find the link right now.

The GPUImage would work, but it is not perfect because the iOS device is not the place to do your video processing. You should do all your on the desktop using a professional video tool that handles chromakey, then export a video with an alpha channel. Then import the video into your iOS application bundle as described at playing-movies-with-an-alpha-channel-on-the-ipad. There are a lot of quality and load time issues you can avoid by making sure your video is properly turned into an alpha channel video before it is loaded onto the iOS device.

Only way to avoid using the player interface is to roll your own video player, which is pretty difficult to do right. You can insert a custom overlay on top of the player interface to make it look like the user is still in your app, but you don't actually have control of the view. You might want to try playing your transparent video in the player interface and see if it shows up as transparent. See if there is a property for the background color in the player. You would want to set that to be transparent too.
--Mike

I'm not sure the iPhone APIs will let you have a movie view over the top of another view and still have transparency.

You can't avoid launching the player interface if you want to use the built-in player.
Here's what I would try:
get the new window that is created by MPMoviePlayerController (see here)
explore the view hierarchy in that window, using [window subviews] and [view subviews]
try to figure out which one of those views is the actual player view
try to insert a view BEHIND the player view (sendSubviewToBack)
find out if the player supports transparency or not.
I don't think you can do much better than this without writing your own player, and I have no idea if this method would work or not.
Depending on the size of your videos and what you're trying to do, you could also try messing around with animated GIFs.

if you could extract the frames from your video and save them as images then your video could be reproduced by changing the images. Here is an example of how you could reproduce your images so that it looks like a video:
in this image that I uploaded the names of the images have a different name but if you name your images as: frame1, fram2, fram3.... then you could place that inside a loop.
I have never tried it I just know it works for simple animations. Hope it works.

Related

Black video when using PBJVideoPlayer on iOS 10

I am using PBJVideoPlayer to show videos on my iOS app, using the following code:
_videoPlayerController = [[PBJVideoPlayerController alloc] init];
_videoPlayerController.delegate = self;
_videoPlayerController.view.frame = _playerView.bounds;
[self addChildViewController:_videoPlayerController];
[_playerView addSubview:_videoPlayerController.view];
[_videoPlayerController didMoveToParentViewController:self];
_videoPlayerController.videoPath = [self finalVideoPath];
On about 50% of the time, the video is shown as black while the sound is fine.
The bounds are good (since I do see a black box) and the video path is good since I do have the correct video created.
I am using a device with iOS 10, and I still do not have a device with an older iOS to check..
Any ideas what might be the problem? I have seen other questions regarding black videos but non of them help.
So, after several hours of investigating this, it seems to be an iOS10 bug.
See this: AVPlayer playback fails while AVAssetExportSession is active as of iOS 10
What worked for me, is removing the watermark layer I had on the video and then removing the animationTool property from the video composition

How to have video as a background in iOS?

I'm finding it difficult to search for this, background video searches for iOS typically refer to multitasking and switching apps with video.
I want to know if it's possible to have a video playing full screen without movie player controls, while displaying another view on top of that with logo, buttons, text, etc...
So,
Background: 15 second video loop -
Foreground: login / signup buttons, logo, etc...
There are a number of options, but the simplest will be to use a MPMoviePlayerController, with its repeatMode property set to loop forever, and its controlStyle set to none. That will give you a view with a looped movie with no controls that you can use as a background by adding it to your view hierarchy.
OP here - I was able to display a video full screen using this code (in viewDidLoad):
(don't forget to substantiate player as a property with MPMoviePlayerController *player;)
player = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:#"videoname" ofType:#"m4v"]]];
[player.view setFrame: self.view.bounds];
player.repeatMode = MPMovieRepeatModeOne;
player.controlStyle = MPMovieControlStyleNone;
[myView addSubview:player.view];
[player play];
And that worked fine - it displays a video fullscreen without video controls. What I had a problem with was displaying buttons and graphics above that. Even though my view hierarchy had the player.view seemingly behind my view with buttons, I couldn't get the buttons to appear.
I fixed that by adding in:
[player.view addSubview:overlayView];
Just set the layer you intend to display above the video to an IBOutlet and then use the video view to add that view (overlayView in this case) as a subview.
I actually prefer a way that is portrayed in this tutorial
basically the idea is to create a gif of your video, crop it to iPhone Screen size and load it into an un-interactive UIWebView. I believe this will get the job done if you don't need any audio, and it's basically done effortlessly.
I hope it helps you =)

How to capture screen video in iphone?

I want to capture video from screen.
I am unable to capture video from avplayer layer. But, can record from other viewes.
Do I need to search code for OpenGLES?
You can have look at the blog.
I think it covers what you want.
Actually this blog does not use AVPlayer, but rather it uses AVAssetWriter.
Look into the comments there you can get hint using AVPlayer.
Or you can have this project, which is for recording of screen.
These two libraries are the best possible options that you can use to record video of your application screen.
https://github.com/wess/Glimpse
https://everyplay.com/about
Yes I'm working with the same job it comes black screen because of high frameDuration of video .But I've solved this
Don't add AVPlayer to that view. Add to another view and note the time at play and then crop the video of time that has played and after all merge with the recorded video.
I've stated it shortly but I hope you will understand.
You need to work on OpenGLES to render video layer, otherwise it will look black
I would suggest using the GPUImage framework, for a number of reasons:
It IS OpenGL but is wrapped in Objective-C, so there's no need to learn OpenGL to implement it
It is 100% App Store vetted - I have an app in the store that uses it now, as do dozens of others
There is a class named GPUImageMovie that wraps AVAssetReader for playback and another named GPUImageMovieWriter that allows you to write textures to file - these can be the same file, or separate.
There are quite a few examples available within the repository that should be pretty easy to understand...
Source Code / Git Repo
* https://github.com/BradLarson/GPUImage
Blog
* http://www.sunsetlakesoftware.com/2012/02/12/introducing-gpuimage-framework
Hope that helps !
This is good for you testing you achieve that goal through this framework
https://github.com/gabriel/CaptureRecord for screen capture. But, it can be used to record simulator only. You can't submit app to appstore using this code as it use private api.

Examples on Drum Sim Build for iOS

I'm trying to build a drum simulator in Xcode for an app for my brother in laws band. I'm having a little trouble doing this. What I'm wanting to do is use a picture of the drummer's drum set and use that as the drum you can play on the iPhone. I was thinking it could kind of be like an image map in HTML where the buttons would play a sound of the drum and everything else. If anyone has any ideas or how-tos on this it would be greatly appreciated.
Thanks
A very basic approach:
Use a UIImageView with an image of the drumkit as background.
Create a transparent UIView in front of each drum. Attach a UITapGestureRecognizer to each UIView. This gesture recognizer should call a different method for each view. Use AVAudioPlayer to play the sound.
That's just a very basic app but not so bad. After you've done with that your next tasks could be:
optimize performance. Sound should play in the moment you touch the display.
multitouch
use core motion to detect the strength of your tap and adjust the sound
A UIImageView with some nice invisible buttons (UIButton's tintColor property as in button.tintColor = [UIColor clearColor];) over the skins would be perfect. Then, take a look at how to play some audio over here: http://blogs.x2line.com/al/archive/2011/05/19/3831.aspx

iPhone SDK: Custom video player controls

In my iPhone app I have designed a custom video player, currently it is very basic with just a play pause and stop button,
but I would like the user to be able to scrub, (I think thats the right word) the video like you can do with apple's original media player.
So for Instance I would like to be able to take a UISlider and have it control the current postiion of the videos playback if you get what I mean. Oh and incase your curious, the way I pause/play/stop the video is by using this simple piece of code [self.theMovie play]; [self.theMovie stop]; [self.theMovie pause]; The trouble is I don't know how to scrub the video.
Any help appreciated.
I've asked the same question: customize quicktime iphone and here MPVideoPlayer add/remove buttons
It seams that you have to posibilities:
You can add you view over the main window. An sample can be found here: MoviePlayer Sample
You can iterate through views, found one you need and Add/Remove views. I don't know yet how must does Apple likes/dislikes this method.

Resources