Как записывать видео в формате MPEG-2 TS и кодировании звука ACC

Когда я устанавливаю формат видео MPEG-2 (постоянное значение 8) TS и аудиоформат ACC (постоянное значение 3), он записывает только видео без звука в формате ACC. Но никакой ошибки не выдает. Пробовал на Samsung Galaxy Tab(Honeycomb). Потому что MPEG-2TS поддерживает Android версии 3.0+. Если я использую формат видео и аудио по умолчанию, все работает нормально. Как я могу это сделать. Пожалуйста помоги.

if(mCamera == null) {
    mCamera = Camera.open();
    mCamera.unlock();
}


if(mMediaRecorder == null) mMediaRecorder = new MediaRecorder();

mMediaRecorder.setPreviewDisplay(surface);
mMediaRecorder.setCamera(mCamera);
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);   
mMediaRecorder.setOutputFormat(8);
mMediaRecorder.setOutputFile("/mnt/sdcard/temp.ts");
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mMediaRecorder.setVideoSize(640, 480);

mMediaRecorder.setVideoEncodingBitRate(500000);
mMediaRecorder.setAudioEncodingBitRate(44100);
mMediaRecorder.setVideoFrameRate(30);
mMediaRecorder.setMaxDuration(-1);   
mMediaRecorder.prepare();

person Suvam Roy    schedule 24.03.2012    source источник
comment
Как ты проверяешь, что нет звука? Вы демультиплексируете файл .TS?   -  person freeone3000    schedule 25.04.2012
comment
Когда я использую все форматы по умолчанию, я получаю звук. Но когда я устанавливаю этот формат, я не получаю звука.   -  person Suvam Roy    schedule 25.04.2012
comment
Привет @SuvamRoy. Я попробовал ваш код, но с mMediaRecorder.setOutputFormat(8); Вариант, я не могу сохранить файл. Ничего не записывает даже видео. Я использую андроид 4.1.2. У тебя есть успехи??   -  person sachy    schedule 13.06.2013
comment
Я столкнулся с той же проблемой. Я попытался использовать модифицированное приложение командной строки audioloop. Используя это приложение, когда AACWriter используется для кодирования звука, оно выводит правильно, но когда я пытаюсь использовать MPEG2TSWriter, вывода нет. Я считаю, что кодировщик AAC не является проблемой, но мультиплексор MPEG2TS при использовании со звуком AAC или звуком AMR является проблемой.   -  person Nishit Jain    schedule 02.09.2013


Ответы (3)


Похоже, ваша проблема связана с кодировщиками аудио. До Android 2.3.3 (GingerBread) вы должны установить кодировщик на AMR_NB. Начиная с версии 2.3.3 вы также можете использовать AMR_WB и AAC в качестве аудиокодеков.

person Gaurav Agarwal    schedule 21.04.2012
comment
вы не понимаете моего требования. Он не может мультиплексировать аудио и видео в mpeg2ts и aac. - person Suvam Roy; 21.04.2012
comment
На самом деле мое требование состоит в том, что я хочу записывать видео в выходном формате MERG-2TS, и для этого формата поддерживает только аудиокодер ACC в соответствии с руководством разработчика Android. Так что я могу записывать видео в этом формате без звука. Если я меняю свой аудиокодер, это дает исключение. Если я использую все кодировщики видео и аудио по умолчанию, он может записывать видео и аудио. - person Suvam Roy; 22.04.2012

mMediaRecorder.setAudioEncodingBitRate(44100): 44100 не является хорошей скоростью передачи аудио. Скорее всего это частота дискретизации. 128000 чаще всего является битрейтом аудио.

Сказав это, у меня также есть проблемы с записью в формате m2ts на Samsung Galaxy S3.

    mediaRecorder = new MediaRecorder();
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mediaRecorder.setOutputFormat(/*MediaRecorder.OutputFormat.OUTPUT_FORMAT_MPEG2TS*/8);
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
    mediaRecorder.setAudioSamplingRate(48000);
    mediaRecorder.setAudioEncodingBitRate(128000);

Параметр OutputFormat.OUTPUT_FORMAT_MPEG2TS на самом деле скрыт в Android 4.2.2 SDK. Отсюда и использование «8». Это может быть признаком того, что этот формат на самом деле не поддерживается.

person Jerry F    schedule 02.12.2013

Решение заключается в применении патча в M2ts Writer. Создайте libstagefright.so и отправьте на устройство. Также установите ниже в приложении

recorder.setAudioSamplingRate(48000); 
recorder.setAudioEncodingBitRate(128000);

иначе он не запишет клип полностью. Однако я не вникал в причину установки вышеуказанных параметров.

Патч для M2tsWriter в libstagefright:

diff --git a/media/libstagefright/MPEG2TSWriter.cpp b/media/libstagefright/MPEG2TSWriter.cpp

index c9ed5bb..a42371f 100644

--- a/media/libstagefright/MPEG2TSWriter.cpp

+++ b/media/libstagefright/MPEG2TSWriter.cpp

@@ -411,6 +411,7 @@ void MPEG2TSWriter::SourceInfo::onMessageReceived(const sp<AMessage> &msg) { 
                            (const uint8_t *)buffer->data() 
                             + buffer->range_offset(), 
                            buffer->range_length()); 
+                    readMore(); 
                 } else if (buffer->range_length() > 0) {
                     if (mStreamType == 0x0f) { 
                         if (!appendAACFrames(buffer)) { 
person sdh    schedule 26.09.2014