Como construir e vincular o FFMPEG ao iOS?

todos!

Eu sei, há muitas perguntas aqui sobre o FFMPEG no iOS, mas nenhuma resposta é apropriada para o meu caso :( Algo estranho acontece a cada caso quando estou tentando linkar o FFMPEG em meu projeto, então, por favor, me ajude!

Minha tarefa é escrever um aplicativo de bate-papo por vídeo para iOS, que usa o protocolo RTMP para publicar e ler o fluxo de vídeo de / para o Flash Media Server personalizado.

Eu decidi usar o rtmplib, biblioteca livre de código aberto para streaming de vídeo FLV sobre RTMP, já que é a única biblioteca apropriada.

Muitos problemas apareceram quando comecei a pesquisar sobre isso, mas depois entendi como deveria funcionar.

Agora eu posso ler a transmissão ao vivo do vídeo FLV (do url) e enviá-lo de volta ao canal, com a ajuda do meu aplicativo.

Meu problema agora é enviar um vídeo da câmera. Sequência de operações básicas, como eu entendi, deve ser o seguinte:

Usando AVFoundation, com a ajuda da seqüência (Device-AVCaptureSession-AVVideoDataOutput-> AVAssetWriter) eu escrevo isso em um arquivo (Se você precisar, eu posso descrever esse fluxo mais detalhado, mas no contexto da pergunta não é importante). Esse fluxo é necessário para fazer a conversão acelerada por hardware de vídeo ao vivo da câmera para o codec H.264. Mas é no formato de contêiner MOV. (Este é o passo concluído)

Eu li este arquivo temporário com cada amostra escrita e obter o fluxo de bytes de dados de vídeo, (H.264 codificado, no contêiner do QuickTime). (esta é a etapa já concluída)

Eu preciso converter videodata do formato de contêiner do QuickTime para FLV. E tudo em tempo real (pacote por pacote)

Se eu tiver os pacotes de dados de vídeo, contidos no formato de contêiner FLV, poderei enviar pacotes por RTMP usando o rtmplib.

Agora, a parte mais complicada para mim é o passo 3.

Eu acho que preciso usar o ffmpeg lib para essa conversão (libavformat). Eu até encontrei o código-fonte, mostrando como decodificar pacotes de dados h.264 a partir do arquivo MOV (procurando em libavformat, descobri que é possível extrair esses pacotes mesmo do fluxo de bytes, o que é mais apropriado para mim). E, tendo isso completo, precisarei codificar os pacotes para o FLV (usando o ffmpeg ou manualmente, de forma a adicionar os cabeçalhos FLV aos pacotes h.264, isso não é problema e é fácil, se eu estiver correto).

O FFMPEG tem uma ótima documentação e é uma biblioteca muito poderosa, e eu acho que não haverá problema em usá-lo. Mas o problema aqui é que eu não consegui trabalhar no projeto iOS.

Eu passei 3 dias lendo documentação, stackoverflow e pesquisando a resposta na pergunta "Como construir o FFMPEG para iOS" e acho que meu PM vai me demitir se eu gastar mais uma semana tentando compilar esta biblioteca :))

Eu tentei usar muitos scripts de compilação diferentes e configurar arquivos, mas quando eu construo o FFMPEG, eu tenho libavformat, libavcodec, etc para arquitetura x86 (mesmo quando eu especificar armv6 em build-script). (Eu uso "lipo-info libavcodec.a" para mostrar arquiteturas)

Então eu não posso construir este fontes, e decidi encontrar FFMPEG pré-construído, que é construído para arquitetura armv7, armv6, i386.

Eu baixei o iOS Comm Lib do MidnightCoders do github, e ele contém um exemplo de uso do FFMPEG, ele contém arquivos .a pré-construídos de avcodec, avformat e outras bibliotecas do FFMPEG.

Eu confiro a arquitetura deles:

iMac-2:MediaLibiOS root# lipo -info libavformat.a
Architectures in the fat file: libavformat.a are: armv6 armv7 i386 

E achei que é apropriado para mim! Quando eu tentei adicionar este bibliotecas e cabeçalhos ao projeto xCode, ele compila bem (e eu ainda não tenho avisos como "Biblioteca é compilada para outra arquitetura"), e eu posso usar estruturas de cabeçalhos, mas quando estou tentando chamar C -funcionamento de libavformat (av_register_all ()), o compilador mostra-me a mensagem de erro "Símbolo (s) não encontrado para arquitetura armv7: av_register_all".

Eu pensei, que talvez não haja símbolos em lib, e tentei mostrá-los:

root# nm -arch armv6 libavformat.a | grep av_register_all
00000000 T _av_register_all

Agora eu estou preso aqui, eu não entendo, porque xCode não pode ver esses símbolos, e não pode seguir em frente.

Por favor, corrija-me se eu estiver errado no entendimento do fluxo para publicar RTMP-stream a partir do iOS, e me ajude a construir e ligar o FFMPEG para iOS.

Eu tenho o iPhone 5.1. SDK e xCode 4.2.

questionAnswers(2)

yourAnswerToTheQuestion