Объединить два файла .m4a или преобразовать файл .wav в m4a

Искал способ записи в мпег-4 с возможностью паузы и возобновления, но вроде такого нет. Поэтому я решил записать в необработанном формате wave и преобразовать в .m4a. Есть ли способ конвертировать файл .wav в файл .m4a в android. Я искал порт mencoder для Android, но ничего не нашел, были сообщения о переносе ffmpeg на Android на linux, но не совсем понятно, как я могу использовать его в Android для объединения двух файлов .m4a или преобразования файла .wav в .m4a.


person Pannu    schedule 07.11.2011    source источник


Ответы (2)


Есть две возможные вещи, которые вы могли бы иметь в виду под объединением аудиофайлов, и два разных способа сделать это с помощью ffmpeg:

Помещение двух отдельных звуковых дорожек в один файл

Как на DVD, где есть обычная звуковая дорожка и другая звуковая дорожка, например комментарий или дублированный язык. Чтобы сделать это с помощью ffmpeg и двух файлов m4a, используйте команду ffmpeg -i in-1.m4a -acodec copy out.m4a -i in-2.m4a -acodec copy -newaudio. Порядок опций важен, так что не путайтесь с ним.

Объединение двух аудиофайлов

Воспроизведение второго файла сразу после первого. Самый простой способ сделать это — использовать программу, предназначенную для обработки аудио, например SoX. Похоже, существует недавний, но нестабильный порт SoX для Android.

Если вы хотите сделать конкатенацию строго в ffmpeg, то можно сделать следующее:

  1. ffmpeg -i in-1.m4a -f s16le in-1.raw
    Это выводит аудиофайл в необработанный формат PCM. Вам нужно обратить внимание на частоту дискретизации и количество каналов, потому что эта информация не будет храниться в необработанном файле PCM и понадобится вам позже. ffmpeg покажет вам информацию об аудиопотоке по мере его перекодирования. Он будет выглядеть примерно как Audio: aac, 44100 Hz, stereo, s16, 63 kb/s, что означает, что ваша частота дискретизации составляет 44100, а количество каналов — 2 (стерео). Чаще всего вы будете иметь дело с частотой дискретизации 22050, 44100 или 48000; и 1 (моно), 2 (стерео) или 6 (5.1) каналов.

  2. ffmpeg -i in-2.m4a -f s16le in-1.raw
    Теперь декодируйте второй файл в необработанный PCM.

  3. ffmpeg -f s16le -ar 44100 -ac 2 -i 'concat:in-1.raw|in-2.raw' -acodec libfaac out.m4a
    Опять же, порядок параметров очень важен. Измените параметры частоты дискретизации (-ar) и каналов (-ac) в соответствии с вашим вводом.

person stharward    schedule 08.11.2011
comment
Разве эти команды не должны запускаться в командной строке. Я портировал ffmpeg на Android, теперь мне нужно знать, как я могу сделать то же самое, используя JNI или что-то в этом роде. - person Pannu; 09.11.2011
comment
@Pannu: ну, вы можете просто запустить ffmpeg как внешнюю программу из Java. Если вы хотите вызывать libavcodec с помощью JNI, я не могу помочь вам с примером кода, потому что я не знаю Java и плохо знаком с API libavcodec. Но из того немногого, что я сделал с обработкой звука, конкатенация двух аудиофайлов очень проста, потому что это просто добавление одного массива к другому, а затем передача результата в кодировщик и мультиплексор. - person stharward; 09.11.2011

Предполагая, что вы создаете ffmpeg с соответствующими форматами и кодеками, преобразование wav в m4a выполняется так же просто, как:

ffmpeg -i in.wav out.m4a

Если вы работаете со звуком, возможно, вам больше повезет с SoX.

person blahdiblah    schedule 08.11.2011
comment
как я могу конвертировать с помощью NDK и jni я портировал ffmpeg на андроид - person Pannu; 09.11.2011