2015-06-30 30 views
8

'u işlerken Bir video oynatmak için bir parça gölgelendiricisiyle birlikte doku kaynakları olarak birkaç GPUImagePicture s kullanmaya çalışıyorum.GPUImageMovie birden çok görüntüyü doku olarak kullanır ve

Durağan görüntülerin bu şekilde harika bir şekilde işlenmesini sağlıyorum, ancak eksik olanı bulmak için bunu göremiyorum, bir GPUImageMovie üzerinde çalışmak için teklif edilen herhangi bir yardımı takdir ediyorum.

@property (nonatomic, strong) GPUImageView *gpuPlayerView; 
@property (nonatomic, strong) GPUImageMovie *gpuMovie; 

AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:self.video]; 

self.player = [AVPlayer playerWithPlayerItem:playerItem]; 

self.player.actionAtItemEnd = AVPlayerActionAtItemEndNone; 

[self.player play]; 

self.gpuMovie = [[GPUImageMovie alloc]initWithPlayerItem:playerItem]; 

self.gpuMovie.playAtActualSpeed = YES; 

GPUImagePicture *sourcePicture1 = [[GPUImagePicture alloc]initWithImage: 
[UIImage imageNamed:@"FilterBG"]]; 

GPUImagePicture *sourcePicture2 = [[GPUImagePicture alloc]initWithImage: 
[UIImage imageNamed:@"FilterOverlay"]]; 

GPUImagePicture *sourcePicture3 = [[GPUImagePicture alloc]initWithImage: 
[UIImage imageNamed:@"Filter1Map"]]; 

GPUImageFilter *filter = [[GPUImageFourInputFilter alloc]initWithFragmentShaderFromString: 
kFilter1ShaderString]; 

[self.gpuMovie addTarget:filter atTextureLocation:0]; 

if (sourcePicture1) 
{ 
    [sourcePicture1 addTarget:filter atTextureLocation:1]; 
} 

if (sourcePicture2) 
{ 
    [sourcePicture2 addTarget:filter atTextureLocation:2]; 
} 

if (sourcePicture3) 
{ 
    [sourcePicture3 addTarget:filter atTextureLocation:3]; 
} 

[filter addTarget:self.gpuPlayerView]; 

[self.gpuMovie startProcessing]; 
+0

Lütfen bunu yararlı bulmaya çalışın .. [GPUImageMovie] (http://stackoverflow.com/questions/23799836/gpuimagemovie-pause -ile-uygulama-filtre) – 0yeoj

+0

Sorununuzu paylaşmak için herhangi bir minimum proje var mı? –

+0

GPUImageFourInputFilter uygulamanızı nereden buldunuz? çerçeveyle birlikte verilen GPUImageTwoInputFilter veya GPUImageThreeInputFilter sınıflarını temel aldığını varsayarak.İçeriği güncellemek için uygun şekilde zaman damgalarının yayıldığından emin olmak için bu sınıfı kontrol etmek isteyebilirsiniz. GPUImageFourInputFilter uygulamanızın yerelleştirilip yerleştirilmediğini görmek için yukarıdakileri bir GPUImageTwoInputFilter veya GPUImageThreeInputFilter ve daha az harmanla test edin. –

cevap

-1

Bir GL dokusu ve bir film arasında paylaşılan bir tampon verir aynı

CVOpenGLESTextureCacheCreateTextureFromImage

ulaşmak için kullanabileceğiniz bir yöntem yoktur. Bu Core Video OpenGLES doku önbelleklerinde CVOpenGLESTextureRef dokularını önbelleğe almak ve yönetmek için kullanılır. Bu doku önbellekleri, GLES'ten 420v veya BGRA gibi çeşitli piksel formatlarına sahip tamponları doğrudan okuma ve yazma için bir yol sağlar.

//Mapping a BGRA buffer as a source texture: 
CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, textureCache, pixelBuffer, NULL, GL_TEXTURE_2D, GL_RGBA, width, height, GL_RGBA, GL_UNSIGNED_BYTE, 0, &outTexture); 
//Mapping a BGRA buffer as a renderbuffer: 
CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, textureCache, pixelBuffer, NULL, GL_RENDERBUFFER, GL_RGBA8_OES, width, height, GL_RGBA, GL_UNSIGNED_BYTE, 0, &outTexture); 
//Mapping the luma plane of a 420v buffer as a source texture: 
CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, textureCache, pixelBuffer, NULL, GL_TEXTURE_2D, GL_LUMINANCE, width, height, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &outTexture); 
//Mapping the chroma plane of a 420v buffer as a source texture: 
CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, textureCache, pixelBuffer, NULL, GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, width/2, height/2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &outTexture); 
//Mapping a yuvs buffer as a source texture (note: yuvs/f and 2vuy are unpacked and resampled -- not colorspace converted) 
CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, textureCache, pixelBuffer, NULL, GL_TEXTURE_2D, GL_RGB_422_APPLE, width, height, GL_RGB_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, 1, &outTexture); 

    CVReturn CVOpenGLESTextureCacheCreateTextureFromImage (CFAllocatorRef 
    __nullable allocator, CVOpenGLESTextureCacheRef __nonnull textureCache, CVImageBufferRef __nonnull sourceImage, CFDictionaryRef 
    __nullable textureAttributes, GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, size_t planeIndex, CVOpenGLESTextureRef __nullable * __nonnull textureOut); 

Bu fonksiyon ya yeni oluşturan veya CVImageBufferRef ve ilişkili parametreler eşleştirilmiş önbelleğe alınmış CVOpenGLESTextureRef doku nesnesi döndürür. Bu işlem, görüntü tamponu ve alttaki doku nesnesi arasında canlı bir bağ oluşturur.

O :) gereklidir

+0

, bu kod bir CVPixelBufferRef çekiyor ve GPU'dan yararlanırken üzerine bir görüntüyü yerleştiriyor. Üzgünüm, OpenGLES'te yeni başlayan biriyim. Ve sonra son satır, her iki görüntü birleştirilmiş olan bir CVPixelBufferRef döndürür? – Charlie

-2

Ben senin çıkışını elde etmek GPUImage ‘ın örnek kodu (SimpleVideoFileFilter) ne denedim oluştururken size yardımcı olacağını umuyoruz. GPUImageFilterGroup'u oluşturdum ve buna filtre ekledim. Resimleri doku olarak eklemek için GPUImageMissEtikateFilter filtresini kullandım. İşte benim kodum:

Bu size yardımcı olacaktır. senin GPUImage başlatılması sonra

+0

Bir parça gölgelendirici kullanmam gerekiyor ve ben de GPUImageLookupFilter işlevi değil, GPUImagePicture işlevini kullanıyorum. – klcjr89

-2

:

GPUImagePicture *sourcePicture1 = [[GPUImagePicture alloc]initWithImage:[UIImage imageNamed:@"FilterBG"]]; 

aramak gerekir:

[sourcePicture1 processImage]; 

etkili bir resim yüklemek ve GPUImage boru hattı için kullanılabilir hale getirmek için.

Aynı şeyi sourcePicture2 ve sourcePicture3 için de yapın.

Güncelleme: film yüklenir ve (GPUImageMovie.m oynamak için hazır, processAsset yöntem zaman ben film ve resimlerle bunu kullanıldığında birkaç yıl önce yapmak için gerekli ne

Bildirim eklemek oldu self.decodeIsAllowed = YES;'dan önce: Sadece film hazır olduğunda, GPUImage boru hattı hedefini ayarlıyorum.