Modifique el tono de audio del clip grabado (m4v)

Estoy escribiendo una aplicación en la que bash cambiar el tono del audio cuando grabo 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, la misma image visual que el original), pero con tono de sonido modificado, por ejemplo, una "voz de ardilla". Una conversión en time real es preferir, si es posible.

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

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

  • búfer de audio (CMSampleBufferRef)
  • Escritor de input de audio (AVAssetWriterAudioInput)
  • opciones de escritura de input de audio (por ejemplo, AVNumberOfChannelsKey, AVSampleRateKey, AVChannelLayoutKey)
  • escritor de activos (AVAssetWriter)

Intenté conectarme a los objects anteriores para modificar el tono de audio, pero sin éxito.

También he intentado con Dirac como se describe aquí: cambio de tono en time real en iPhone usando Dirac
Y OpenAL con AL_PITCH como se describe aquí: Salida de tuberías de OpenAL en un búfer
Y la biblioteca "BASS" de un4seen: Cambiar tono / tempo en time real

No encontré éxito con ninguna de las libs anteriores, probablemente porque realmente no sé cómo usarlas, y dónde conectarlas en el código de ahorro de audio.

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

¿Tiene alguna sugerencia de cómo puedo modificar el tono en time real (al grabar la película) o después convirtiendo toda la película (file .m4v)? ¿Debo mirar más a Dirac, OpenAL, SoundTouch, BASS o alguna otra biblioteca?

Quiero poder compartir la película con otras personas con audio modificado, esa es la razón por la que no puedo confiar en modificar el tono solo para la reproducción.

De acuerdo, puedo decir con security que dirac definitivamente hará el truco. Lo he usado y funciona.

No tengo mucha experiencia con el procesamiento de video, pero si en algún momento puede aislar la pista de audio, es un pedazo de pastel.

  1. si puede hacer eso, simplemente guárdelo en un file y use el código de ejemplo de dirac en el estiramiento de time, no lo dice, pero también cambia de tono, configure tres parameters para transformar su audio (factor de estirado de time, desplazamiento de tono en centavos / tonos * y también cambio de formante).

  2. si no tiene ganas de savelo en un file, entonces simplemente conviértalo a PCM y haga un poco de DSP en unidades de audio. para ser honesto, necesita un conocimiento serio sobre matemáticas y procesamiento de audio para hacer eso, pero hay un montón de buenos proyectos de ejemplo por ahí (github (AudioGraph por Tom Zic)) que le proporcionará lo que necesita, no se olvide de Menciona todos esos códigos devs en tu trabajo.

Además, si puede transformarse en PCM, en esta etapa, puede aplicar alternativamente dirac al audio no comprimido, ya sea en vivo en el gráfico de unidades de audio o utilizando su código de ejemplo y, en lugar de usar EAFReader Dirac, simplemente pase los datos del búfer al Buffer que usa para realizar el cambio de tono. es posible que deba hacer un poco de magia allí, pero no tan dramático como escribir su propia implementación DSP de cambio de tono.

En resumidas counts, si puede solicitar a AVFoundation que se encargue únicamente del video, puede procesar las unidades de audio en vivo y establecer una callback para que cada vez que la procese pueda pasar los datos procesados ​​a un file o, probablemente, a usted, avassetwriter, soy No estoy seguro si esta última pieza es posible. Si no es posible, la solución es sincronizar y save 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 time. Por favor, hágamelo saber cómo va, estoy intrigado ahora.

  • Lo primero que debe hacer es demux audio de la transmisión mp4. Necesitará un demultiplexor (demuxer en resumen) para lograr esto. Eche un vistazo a los SDK de MainConcept , admiten varios formattings.
  • En segundo lugar, necesita decodificar su audio comprimido desde el formatting que sea, hasta el PCM sin formatting.
  • Luego usa alguna biblioteca para cambiar el tono del audio sin procesar.
  • A continuación, necesita codificar el audio desplazado de tono nuevamente en formatting comprimido.
  • Y mux de nuevo en mp4.

Perderá algo de calidad de audio en el process debido a decodificar-codificar. Tu video seguirá igual.