Как передать аудиоданные и видеоданные в MediaMux

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

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

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

Спасибо!


person Brendon Tsai    schedule 07.01.2014    source источник
comment
Каково ваше решение для уровня API ниже 18?   -  person X.Y.    schedule 26.03.2014
comment
Вы можете использовать FFmpeg. Можно, но я не пробовал.   -  person Brendon Tsai    schedule 27.03.2014
comment
Можете ли вы поделиться своим фиксированным кодом? У меня такая же проблема, не могу их синхронизировать.   -  person Diego    schedule 19.12.2018


Ответы (2)


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

person lighty    schedule 08.01.2014
comment
Спасибо! Не могли бы вы рассказать мне, как вы обрабатываете запись звука? Поскольку аудиозапись постоянна, вы продолжаете ее записывать или останавливаете ее между кадрами? Я просматриваю MediaMux API, но похоже, что мы используем addTrack для добавления MediaFormat. Что, если мы хотим предоставить источник звука и источник видео для MediaMux? Кроме того, в writeSampleData есть только одна переменная для inpurbuffer. - person Brendon Tsai; 10.01.2014
comment
Я мультиплексирую видео и аудио, которые я записал ранее, поэтому мой сценарий отличается от вашего. Я использую AudioRecord в AsyncTask и предполагаю, что вы делаете то же самое. Остановка записи звука между кадрами приведет к заиканию звука, поэтому это не идеальный вариант. Вам нужно будет тщательно управлять потоками видео- и аудиозаписи, чтобы обеспечить плавную запись — задача записи/мультиплексирования может иметь более низкий приоритет, поскольку они не повлияют на работу пользователя. Вызовите addTrack один раз, чтобы добавить видеодорожку, и еще раз, чтобы добавить звуковую дорожку. Возвращает индекс добавленного трека. Затем вызовите writeSampleData для каждого трека. - person lighty; 10.01.2014
comment
Спасибо! Поэтому я должен использовать addTrack дважды и получить два индекса. Затем я дважды использую writeSampleData, первая переменная функции — это индекс, который я получаю, вторая — источник сырых данных. Это правильно? - person Brendon Tsai; 13.01.2014
comment
Правильно, и третий параметр writeSampleData — это bufferInfo, который вы можете использовать для чтения или установки времени представления кадра. - person lighty; 13.01.2014
comment
Однако обычно вы устанавливаете время презентации в своих вызовах на queueInputBuffer. - person lighty; 14.01.2014
comment
Спасибо! я проверю это - person Brendon Tsai; 14.01.2014
comment
@BrendonTsai, как вы используете AddTrack, он получает только int. Как я могу добавить в него Track ?? - person Robin Royal; 09.11.2014
comment
У меня такая же проблема в этом посте. Можете ли вы посмотреть этот пост stackoverflow.com/questions/53832469/ - person Diego; 19.12.2018
comment
Убедитесь, что вы используете @Synchronized (Kotlin) в функции, которая обрабатывает фактический вызов writeSampleData. Никогда не вызывайте writeSampleData в двух или более разных местах. Важно, чтобы когда мультиплексор записывает данные с помощью writeSampleData, вы никогда не вызывали его снова во время записи. Это может показаться неочевидным. Легко предположить, что writeSampleData может внутренне асинхронно обрабатывать несколько дорожек, но это не так. - person AndroidDev; 16.05.2021

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

person Gabriel Bursztyn    schedule 19.01.2016