Estou com um problema sério: tenho um NSArray
com vários UIImage
objetos. O que agora quero fazer é criar filmes a partir deles UIImages
. Mas não tenho ideia de como fazê-lo.
Espero que alguém possa me ajudar ou me enviar um trecho de código que faça algo como eu quero.
Edit: Para referência futura - Depois de aplicar a solução, se o vídeo parecer distorcido, verifique se a largura das imagens / área que você está capturando é múltipla de 16. Encontrada após muitas horas de luta aqui:
Por que o meu filme da UIImages fica distorcido?
Aqui está a solução completa (verifique se a largura é múltipla de 16)
http://codethink.no-ip.org/wordpress/archives/673
AVFoundation
e para o FFmpeg. Se você estava procurando informações relacionadas ao AVFoundation, não gostaria de ver este tópico? (Ou isso é um consenso de Meta?)Respostas:
Dê uma olhada no AVAssetWriter e no restante da estrutura do AVFoundation . O gravador possui uma entrada do tipo AVAssetWriterInput , que por sua vez possui um método chamado appendSampleBuffer: que permite adicionar quadros individuais a um fluxo de vídeo. Essencialmente, você terá que:
1) Ligue o escritor:
2) Inicie uma sessão:
3) Escreva algumas amostras:
4) Termine a sessão:
Você ainda precisará preencher muitos espaços em branco, mas acho que a única parte restante realmente difícil é obter um buffer de pixel de um
CGImage
:frameSize
é umCGSize
descrevendo o tamanho do quadro alvo eframeTransform
é umaCGAffineTransform
que permite transformar as imagens quando você desenhá-los em quadros.fonte
CGImage
só para tirar isso em umCGBitmapContext
apoiado porCVPixelBuffer
um desperdício. Da mesma forma, em vez de criar um deCVPixelBuffer
cada vez,AVAssetWriterInputPixelBufferAdaptor
ospixelBufferPool
devem ser usados para reciclar buffers.appendSampleBuffer:
? BTW, eu estou usando AVFoundation no OS X.Aqui está o código de trabalho mais recente no iOS8 no Objective-C.
Tivemos que fazer vários ajustes na resposta do @ Zoul acima para que ele funcionasse na versão mais recente do Xcode e iOS8. Aqui está o nosso código de trabalho completo que pega uma matriz de UIImages, as transforma em um arquivo .mov, salva em um diretório temporário e depois o move para o rolo da câmera. Reunimos o código de várias postagens diferentes para que isso funcionasse. Destacamos as armadilhas que precisávamos resolver para que o código funcionasse em nossos comentários.
(1) Crie uma coleção de UIImages
Este é o método principal que cria seu AssetWriter e adiciona imagens para gravação.
(2) Conecte um AVAssetWriter
(3) Inicie uma sessão de escrita (NOTA: o método continua de cima)
(4) Finalize a sessão (Nota: o método continua de cima)
(5) Converta suas UIImages em um CVPixelBufferRef
Este método fornecerá uma referência de buffer de pixel CV necessária para o AssetWriter. Isso é obtido em um CGImageRef que você obtém da UIImage (acima).
(6) Mova seu vídeo para o rolo da câmera Como o AVAssetWriter não pode gravar diretamente no rolo da câmera, isso move o vídeo de "tmp / temp.mov" (ou qualquer nome de arquivo que você nomeou acima) para o rolo da câmera.
A resposta de Zoul acima fornece um bom esboço do que você fará. Nós comentamos extensivamente esse código para que você possa ver como foi feito usando o código de trabalho.
fonte
NOTA: Esta é uma solução Swift 2.1 (iOS8 +, XCode 7.2) .
Na semana passada, comecei a escrever o código do iOS para gerar um vídeo a partir de imagens. Eu tive um pouco de experiência com a AVFoundation, mas nunca tinha ouvido falar de um CVPixelBuffer. Encontrei as respostas nesta página e também aqui . Demorou vários dias para dissecar tudo e juntar tudo em Swift de uma maneira que fazia sentido para o meu cérebro. Abaixo está o que eu vim com.
NOTA: Se você copiar / colar todo o código abaixo em um único arquivo Swift, ele deverá ser compilado. Você só precisará ajustar
loadImages()
osRenderSettings
valores.Parte 1: Configurando as coisas
Aqui, agrupo todas as configurações relacionadas à exportação em uma única
RenderSettings
estrutura.Parte 2: O ImageAnimator
A
ImageAnimator
classe conhece suas imagens e usa aVideoWriter
classe para executar a renderização. A idéia é manter o código de conteúdo de vídeo separado do código de baixo nível da AVFoundation. Também adicioneisaveToLibrary()
aqui como uma função de classe que é chamada no final da cadeia para salvar o vídeo na Biblioteca de Fotos.Parte 3: O VideoWriter
A
VideoWriter
classe faz todo o trabalho pesado da AVFoundation. É principalmente um invólucroAVAssetWriter
eAVAssetWriterInput
. Ele também contém um código sofisticado escrito por mim que sabe como traduzir uma imagem em aCVPixelBuffer
.Parte 4: Faça acontecer
Quando tudo estiver no lugar, estas são suas três linhas mágicas:
fonte
images = [image, image]
obras, mas uma única imagem não. Digamos que mude o tempo para 10s, depois vejo uma tela preta até o último quadro. Muito estranho.Peguei as idéias principais de Zoul e incorporei o método AVAssetWriterInputPixelBufferAdaptor e fiz dele o início de um pouco de estruturas.
Sinta-se livre para conferir e melhorar! CEMovieMaker
fonte
Aqui está uma versão do Swift 2.x testada no iOS 8. Ele combina respostas de @Scott Raposa e @Praxiteles junto com o código de @acj contribuiu para outra pergunta. O código do @acj está aqui: https://gist.github.com/acj/6ae90aa1ebb8cad6b47b . O @TimBull também forneceu o código.
Como @ Scott Raposa, eu nunca tinha ouvido falar
CVPixelBufferPoolCreatePixelBuffer
e várias outras funções, muito menos entender como usá-las.O que você vê abaixo foi feito em grande parte por tentativa e erro e pela leitura dos documentos da Apple. Por favor, use com cautela e forneça sugestões se houver erros.
Uso:
Código:
fonte
Aqui está a versão swift3 de como converter o array de imagens no vídeo
Eu o uso junto com a captura de tela, para basicamente criar um vídeo de captura de tela, aqui está a história completa / exemplo completo .
fonte
Acabei de traduzir a resposta de @Scott Raposa para swift3 (com algumas mudanças muito pequenas):
fonte
Bem, isso é um pouco difícil de ser implementado em puro Objective-C .... Se você estiver desenvolvendo para dispositivos jailbroken, uma boa idéia é usar a ferramenta de linha de comando ffmpeg de dentro do seu aplicativo. é muito fácil criar um filme a partir de imagens com um comando como:
Observe que as imagens precisam ser nomeadas sequencialmente e também ser colocadas no mesmo diretório. Para mais informações, consulte: http://electron.mit.edu/~gsteele/ffmpeg/
fonte
Use AVAssetWriter para gravar imagens como filme. Já respondi aqui: - https://stackoverflow.com/a/19166876/1582217
fonte