2014-01-07 3 views
5

Я пытаюсь получить видео необработанные данные с помощью Preview, получить аудио исходные данные AudioRecord. Затем я отправлю их в MediaCodec (я установлю два экземпляра Codec). После этого я отправлю видеоданные и аудиоданные в MediaMux, чтобы получить файл mp4. У меня есть два вопроса:Как обеспечить как аудиоданные, так и видеоданные MediaMux

1) Я использовал MediaMux для обработки видеоданных раньше. Для видеоданных MediaMux обрабатывает его по кадрам, но видеозапись непрерывна. Как MediaMux может обрабатывать видео и аудио в синхронизации.

2) Я нашел только переменную для ввода буфера в функции writeSampleData. Хороший парень на StackOverflow также предоставил демо-версию MediaMux. Но у этой демонстрации только одна переменная для исходных данных. Как эта переменная может содержать как видеоданные, так и аудиоданные?

Спасибо!

+0

Каково ваше решение для уровня api ниже 18? –

+0

Вы можете использовать FFmpeg. Это возможно, но я не пробовал. –

ответ

8

У меня был некоторый успех, передавая синхронизированное аудио и видео на MediaMuxer. Я вычислил количество аудиокассет, которые должны воспроизводиться для каждого кадра видео: на основе частоты дискретизации аудио и частоты кадров видео. Затем у меня был цикл, в котором на каждой итерации был написан один видеокадр и один блок аудио. Используйте время презентации, чтобы убедиться, что они будут синхронизированы при воспроизведении. Используйте индекс треков от addTrack при звонках до writeSampleData, чтобы разрешить запись видео и аудио на две отдельные дорожки.

+0

Спасибо! Не могли бы вы рассказать мне, как вы справляетесь с записью звука? Поскольку запись звука постоянна, вы держите ее в записи или останавливаете ее между кадрами? Я просматриваю API MediaMux, но, похоже, мы используем addTrack для добавления MediaFormat. Что делать, если мы хотим предоставить источник аудио и видео в MediaMux? Кроме того, в writeSampleData для inpurbuffer имеется только одна переменная. –

+0

Я мультиплексирую видео и аудио, которые я записал ранее, поэтому мой сценарий отличается от вашего. Я использую 'AudioRecord' в' AsyncTask' и предполагаю, что вы сделаете то же самое. Остановка записи звука между кадрами приведет к заиканию звука, поэтому не идеальна. Вам нужно будет управлять потоками записи видео и аудио, чтобы получить плавную запись - задача записи/мультиплексора может иметь более низкий приоритет, так как они не будут влиять на работу пользователя. Вызовите 'addTrack' один раз, чтобы добавить видеодорожку и снова добавить звуковую дорожку. Он возвращает индекс добавленного трека. Затем вызовите 'writeSampleData' для каждого трека. – lighty

+0

Спасибо! Поэтому я должен использовать addTrack дважды и получить два индекса. Затем я дважды использую writeSampleData, первая переменная функции - indexI get, вторая - источник необработанных данных. Это правильно? –

1

В совокупности, чтобы ответить на @ robin-royal, чтобы кодировать как видео, так и аудио, нужно дважды вызывать метод Addtrack для MediaMuxer, индекс One track (int) для каждого из них. , поэтому при вызове WriteSampleData в MediaMuxer первый параметр указывает индекс дорожки, e. г. если audioTrackIndex = 2 и videoTrackIndex = 1, если вы вызываете WriteSampleData с первым параметром равным 1, вы будете записывать видео. (Извините, у меня нет никаких прав, чтобы ответить на него в комментарии) спасибо