2012-06-11 8 views
8

Estoy escribiendo una aplicación en la que estoy tratando de cambiar el tono del audio cuando estoy grabando una película (.m4v). O modificando el tono de audio de la película después. Quiero que el resultado final sea una película (.m4v) que tenga la longitud original (es decir, visual como el original) pero con un tono de sonido modificado, p. una "voz de ardilla". Una conversión en tiempo real es preferir si es posible.Modificar el tono de audio del clip grabado (m4v)

He leído mucho sobre cómo cambiar el tono de audio en iOS, pero la mayoría de los ejemplos se centran en la reproducción, es decir, reproducir el sonido con un tono diferente.

En mi aplicación, estoy grabando una película (.m4v/AVFileTypeQuickTimeMovie) y guardándola con el estándar AVAssetWriter. Al guardar la película Tengo acceso a los siguientes elementos en los que he intentado manipular el audio (por ejemplo, modificar el terreno de juego):

  • búfer de audio (CMSampleBufferRef)
  • escritor entrada de audio (AVAssetWriterAudioInput)
  • opciones de audio escritor de entrada (por ejemplo AVNumberOfChannelsKey, AVSampleRateKey, AVChannelLayoutKey)
  • escritor activo (AVAssetWriter)

he tratado de enganchar en los objetivos anteriores para modificar el aud io, pero sin éxito.

También he probado con Dirac como se describe aquí: Real Time Pitch Change In iPhone Using Dirac
Y OpenAL con AL_PITCH como se describe aquí: Piping output from OpenAL into a buffer
Y la biblioteca "BASS" de Un4seen: Change Pitch/Tempo In Realtime

no he tenido éxito con cualquiera de las libs anteriores, probablemente porque realmente no sé cómo usarlas, y dónde engancharlas en el código de ahorro de audio.

Parece que hay muchas bibliotecas que tienen efectos similares pero se centran en la reproducción o el código de grabación personalizado. Quiero manipular la transmisión de audio que ya obtuve (AVAssetWriterAudioInput) o modificar el clip de película guardado (.m4v). Quiero que el video no se modifique visualmente, es decir, que se reproduzca a la misma velocidad. Pero quiero que el audio sea más rápido (como una ardilla) o más lento (como un ... monstruo?

¿Tiene alguna sugerencia de cómo puedo modificar el tono en tiempo real (cuando grabo la película) o después? al convertir la película completa (archivo .m4v)? ¿Debo buscar más en Dirac, OpenAL, SoundTouch, BASS o alguna otra biblioteca?

Quiero poder compartir la película con otros con audio modificado, esa es la razón no puedo confiar en modificar el tono de reproducción solamente.

Respuesta

3

bien, puedo decir con seguridad que Dirac será definitivamente hacer el truco. me lo han utilizado y funciona.

No tengo mucha experiencia con el procesamiento de video, pero si en algún punto puede aislar la pista de audio, es pan comido.

  1. si se puede hacer eso, entonces simplemente guardarlo en un archivo y use el código de muestra de Dirac en la expansión de tiempo, que no lo dice, pero tampoco cambio de tono, se establecen tres parámetros para transformar el audio (factor de tiempo de estiramiento, cambio de tono en centavos/tonos * y también desplazamiento de formantes).

  2. si no tiene ganas de guardarlo en un archivo, entonces simplemente conviértalo en PCM y realice un poco de DSP en unidades de audio. para ser sincero, necesitas un poco de conocimiento serio sobre matemática y procesamiento de audio para hacerlo, pero hay un montón de buenos proyectos de muestra (github (AudioGraph de Tom Zic)) que te proporcionarán lo que necesitas, no te olvides de menciona todos los códigos de desarrolladores en tu trabajo.

Por otra parte, si se puede transformar en PCM, en esta etapa se puede, alternativamente, aplicar Dirac para el audio sin comprimir ya sea en vivo en el gráfico de unidades de audio o utilizando su código de ejemplo y en lugar de utilizar utiliza el EAFReader Dirac, simplemente pase los datos de su búfer al búfer que usa para realizar el cambio de tono. es posible que necesite hacer un poco de magia allí, pero no tan dramático como escribir su propia implementación DSP de cambio de tono.

En pocas palabras, si puede pedirle a AVFoundation que se encargue del video solo entonces puede hacer el procesamiento en vivo de las unidades de audio y establecer una devolución de llamada para que cada vez que lo procese puede pasar los datos procesados ​​a un archivo o probablemente a usted avassetwriter, no estoy seguro de si esta última pieza es posible. Si no es posible, la solución es sincronizar y guardar el video y el audio por separado, aunque me puedo imaginar que es un gran problema, ya que ambos intentarán escribir en el disco al mismo tiempo. Por favor, hágame saber cómo va, estoy intrigado ahora.

1
  • Lo primero que hay que hacer es demux de audio de la corriente de mp4. Necesitará un demultiplexor (demuxer en corto) para lograr esto. Eche un vistazo a MainConcept SDKs, admiten varios formatos.
  • En segundo lugar necesita decodificar su audio comprimido desde cualquier formato, en PCM en bruto.
  • Luego use alguna biblioteca para cambio de tono el audio en bruto.
  • Luego necesita codificar audio de tono desplazado volver al formato comprimido.
  • Y mux de nuevo en mp4.

Perderá algo de calidad de audio en el proceso debido a la decodificación de la codificación. Tu video se mantendrá igual.

Cuestiones relacionadas