Android Mediarecorder: получение 3GP вместо MPEG4 - PullRequest
1 голос
/ 02 февраля 2012

Я хочу записывать видео только в Android с форматом MPEG4. Я хочу, чтобы контейнер и кодек были MPEG4. Вот что я сделал для этого.

Thread video = new Thread(new Runnable() {
    public void run() {
        videoRecorder = new MediaRecorder();
        videoRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
        videoRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
        videoRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        videoRecorder.setVideoEncodingBitRate(56 * 8 * 1024);
        videoRecorder.setVideoSize(176, 144);
        videoRecorder.setVideoFrameRate(12);
        videoRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
        videoRecorder.setOutputFile("/sdcard/video.m4e");
        try {
            videoRecorder.prepare();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        videoRecorder.start();
    }
});
video.start();

Теперь, после записи, я записал видео в файл video.m4e. Но когда я проверяю его информацию, я получаю следующее:

enter image description here

В то же время я использовал следующее для записи звука:

Thread audio = new Thread(new Runnable() {              
    public void run() {
        audioRecorder = new MediaRecorder();
        audioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
        audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        audioRecorder.setOutputFile("/sdcard/audio.amr");
        try {
            audioRecorder.prepare();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        audioRecorder.start();
    }
});
audio.start();

и я получил формат контейнера и кодек как AMR, как я и предполагал:

enter image description here

Итак, что заставляет MediaRecorder записывать видео в формате 3GP? Я не указал 3GP нигде в моей программе. Я тестирую этот код на своей вкладке Samsung Galaxy под управлением Android 2.2

Ответы [ 3 ]

7 голосов
/ 02 февраля 2012

MPEG-4 - это метод определения сжатия аудио- и визуальных (AV) цифровых данных.

Формат файла для хранения мультимедийного контента на основе времени. Это общий формат, формирующий основу для ряда других более специфических форматов файлов (например, 3GP, Motion JPEG 2000, MPEG-4 Part 14).

Таким образом, в результате, который вы получили, нет никакого заговора, Метод сжатия (ИЛИ «Кодек»), который вы использовали, был MPEG4, а формат видео, сгенерированный вашим телефоном, равен 3gp, что в действительности является частью видеоформатов пакета схемы сжатия MPEG4 для мультимедиа.

0 голосов
/ 14 марта 2013

Я не понимаю объяснения Аккилиса.

В официальном учебнике по Android "MediaRecorder.OutputFormat" , MPEG_4 - это одна из опций «форматов медиафайлов», параллельная THREE_GPP. INT AAC_ADTS Формат файла AAC ADTS формат файла int AMR_NB AMR NB int AMR_WB AMR WB формат файла int DEFAULT
int MPEG_4 MPEG4 медиа формат файла int RAW_AMR Эта константа устарела на уровне API 16. Устаревший в пользу MediaRecorder.OutputFormat.AMR_NB int THREE_GPP 3GPP формат мультимедийного файла

Существует еще один параметр для указания формата кодировки: "MediaRecorder.VideoEncoder"

int DEFAULT
int H263
int H264
int MPEG_4_SP

В коде ОП он указал как формат файла, так и формат кодирования.

videoRecorder.setOutputFormat (MediaRecorder.OutputFormat.MPEG_4); videoRecorder.setVideoEncoder (MediaRecorder.VideoEncoder.MPEG_4_SP);

Так что, похоже, объяснение Аккилиса не работает для этого примера.

0 голосов
/ 02 февраля 2012

Это определяется рамками.В частности, он имеет набор параметров, которые находятся в классе MediaRecorder, которые определяют, что все поддерживается.

...