¿Cómo construir y enlazar FFMPEG a iOS?

¡todos!

Sé que hay muchas preguntas aquí sobre FFMPEG en iOS, pero ninguna respuesta es apropiada para mi caso :( Algo extraño sucede en cada caso cuando intento vincular FFMPEG en mi proyecto, así que por favor, ¡ayúdenme!

Mi tarea es escribir la aplicación de video chat para iOS, que utiliza el protocolo RTMP para publicar y leer secuencias de video desde / hacia Flash Media Server personalizado.

Decidí usar rtmplib, una biblioteca de código abierto gratuita para transmitir videos FLV a través de RTMP, ya que es la única biblioteca adecuada.

Muchos problemas aparecieron cuando comencé a buscarlo, pero luego comprendí cómo debería funcionar.

Ahora puedo leer la transmisión en vivo de video FLV (desde url) y enviarlo de vuelta al canal, con la ayuda de mi aplicación.

Mi problema ahora es enviar video DESDE la cámara. La secuencia de operaciones básicas, como entendí, debería ser la siguiente:

Utilizando AVFoundation, con la ayuda de secuencia (Device-AVCaptureSession-AVVideoDataOutput-> AVAssetWriter) escribo esto en un archivo (si lo necesita, puedo describir este flujo más detallado, pero en el contexto de la pregunta no es importante). Este flujo es necesario para realizar la conversión acelerada por hardware de video en vivo de la cámara al códec H.264. Pero está en formato contenedor MOV. (Esto se completa paso)

Leí este archivo temporal con cada muestra escrita y obtengo el flujo de bytes de datos de video (codificado en H.264, en el contenedor de QuickTime). (Este paso ya está completado)

Necesito convertir los videodatos del formato contenedor QuickTime a FLV. Y todo en tiempo real. (Paquete por paquete)

Si tengo los paquetes de video-datos, contenidos en formato contenedor FLV, podré enviar paquetes a través de RTMP usando rtmplib.

Ahora, la parte más complicada para mí, es el paso 3.

Creo que necesito usar ffmpeg lib para esta conversión (libavformat). Incluso encontré el código fuente, que muestra cómo descodificar los paquetes de datos h.264 del archivo MOV (buscando en libavformat, encontré que es posible extraer estos paquetes incluso desde el flujo de bytes, lo que es más apropiado para mí). Y una vez completado esto, tendré que codificar paquetes en FLV (usando ffmpeg o manualmente, de manera de agregar encabezados FLV a los paquetes h.264, no es un problema y es fácil, si estoy en lo cierto).

FFMPEG tiene una gran documentación y es una biblioteca muy poderosa, y creo que no habrá ningún problema para usarla. PERO el problema aquí es que no puedo hacerlo funcionar en un proyecto iOS.

He pasado 3 días leyendo documentación, apilando flujos y buscando en Google la respuesta a la pregunta "Cómo crear FFMPEG para iOS" y creo que mi primer ministro me despedirá si pasaré una semana más tratando de compilar esta biblioteca :))

Intenté usar muchos scripts de creación y configurar archivos, pero cuando compilo FFMPEG, obtuve libavformat, libavcodec, etc. para la arquitectura x86 (incluso cuando especifico armv6 arch en build-script). (Yo uso "lipo -info libavcodec.a" para mostrar arquitecturas)

Así que no puedo compilar estas fuentes, y decidí buscar FFMPEG pre-compilado, que es una compilación para la arquitectura armv7, armv6, i386.

He descargado iOS Comm Lib de MidnightCoders de github, y contiene un ejemplo de uso de FFMPEG, contiene archivos .a precreados de avcodec, avformat y otras bibliotecas de FFMPEG.

Reviso su arquitectura:

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

¡Y encontré que es apropiado para mí! Cuando intenté agregar estas bibliotecas y encabezados al proyecto xCode, se compila bien (e incluso no tengo advertencias como "La biblioteca está compilada para otra arquitectura"), y puedo usar estructuras de los encabezados, pero cuando intento llamar a C -función desde libavformat (av_register_all ()), el compilador me muestra el mensaje de error "No se encontraron símbolos para la arquitectura armv7: av_register_all".

Pensé, que tal vez no hay símbolos en lib, y traté de mostrarlos:

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

Ahora estoy atrapado aquí, no entiendo, por qué xCode no puede ver estos símbolos y no puede avanzar.

Corríjame si me equivoco en la comprensión del flujo para publicar RTMP-stream desde iOS, y ayúdeme a construir y vincular FFMPEG para iOS.

Tengo iPhone 5.1. SDK y xCode 4.2.

Respuestas a la pregunta(2)

Su respuesta a la pregunta