Вопрос по video, sockets, android – Потоковое видео из MediaRecorder через LocalSocket

6

Я пытаюсь отправить h264 / AAC-видео из Android MediaRecorder через локальный сокет. Цель состоит в том, чтобы отправить видео на сервер WOWZA через RTMP или RTSP, но это доставляет мне много хлопот, и сейчас я просто пытаюсь записать данные в файл из LocalServerSocket.

Вот код Извините, это не совсем чисто, но я потратил часы на тестирование многих вещей, и мой проект сейчас беспорядок.

В разделе «Действия с камерой» настройка выходного файла:

LocalSocket outSocket = new LocalSocket();

try {
    outSocket.connect(new LocalSocketAddress(LOCAL_SOCKET));
} catch (Exception e) {
    Log.i(LOG_TAG, "Error connecting socket: "+e);
}
mMediaRecorder.setOutputFile(outSocket.getFileDescriptor());

Реализация LocalServerSocket:

try {
    mLocalServerSocket = new LocalServerSocket(mName);
} catch (Exception e) {
    Log.e(LOG_TAG, "Error creating server socket: "+e);
    return;
}

while (true) {

    File out = null;
    FileOutputStream fop = null;
    try {
        mLocalClientSocket = mLocalServerSocket.accept();

        InputStream in = mLocalClientSocket.getInputStream();

        out = new File(mContext.getExternalFilesDir(null), "testfile.mp4");
        fop = new FileOutputStream(out);

        int len = 0;
        byte[] buffer = new byte[1024];
        while ((len = in.read(buffer)) >= 0) {

            Log.i(LOG_TAG, "Writing "+len+" bytes");
            fop.write(buffer, 0, len);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    finally{
        try {
            fop.close();
            mLocalClientSocket.close();
        } catch (Exception e2) {}
    }
}

Проблема в том, что файл, полученный в результате этого, не читается любым медиаплеером. Как вы думаете, это из-за проблемы с кодировкой? Этот код должен генерировать двоичный файл, если я хорошо понимаю ?!

Заранее спасибо, ура.

Выходной формат MPEG_4, так что я думаю, что он должен с расширением .mp4. Кроме того, если я записываю напрямую в файл .mp4 в mMediaRecorder.setOutputFile (), он работает отлично. Simon
если вы не получаете ошибок, это, вероятно, вызвано проблемами кодирования / имени файла. КакиеOutputFormat ты установил? Может быть, переименовать его в.3gp или так помогает - смотритеhere zapl
Вы проверили, если что-то вродеmediainfo можно прочитать свойства созданного видео? Вы также можете попробовать двоичный diff (по крайней мере, заголовка) непосредственно сгенерированного файла и файл, отправленный через локальный сокет, чтобы проверить, выглядит ли сгенерированный файл правильно. zapl
Я не пробовал с mediainfo, но никто на моем медиаплеере не может прочитать файл или найти информацию о кодеке (пробовал с VLC, MplayerX и Quicktime). Я тоже пытался сравнить файлы. Рабочий начинается с: ftyp3gp43gp43gp6wideBtmdat Неработающий: ftyp3gp43gp43gp6widemdat В остальном, я работаю над этим, но пока я не могу сказать, есть ли проблема. Simon
В соответствии сmattakis.com/blog/kisg/20090708/… моя проблема должна быть связана с неправильно установленным заголовком, потому что сокеты не доступны для поиска. Пытаюсь найти решение прямо сейчас. Simon

Ваш Ответ

3   ответа
2

я обнаружил, почему файлы не могут воспроизводиться. В файлах MP4 и 3GPP есть заголовок, содержащий байты:

ftyp3gp4 3gp43gp6 wide mdat

в HEX

0000001866747970336770340000030033677034336770360000000877696465000392D86D6461740000

4 байта перед 'mdat' тег представляет положение другого «moov»; тег расположен в конце файла. Положение обычно устанавливается, когда запись заканчивается, но поскольку MediaRecorder не может искать гнезда, он не может установить эти байты на правильное значение в нашем случае.

Моя проблема сейчас состоит в том, чтобы найти способ сделать такой файл пригодным для обработки, так как он требует, чтобы он воспроизводился до окончания записи.

Привет Анкита. Извините, но мы оставили проект на данный момент, поэтому я перестал работать над этим вопросом. Удачи с этим, ура. Simon
Вы нашли решение, чтобы сделать его потрепанным?
Привет, ребята, проверьте это для хорошей реализации потоковой передачи:github.com/fyhertz/libstreaming
Привет Саймон, Вы нашли какое-то решение? Пожалуйста, поделитесь им, я застрял в той же проблеме
1

файла. В окне moov указаны индексы для каждого образца аудио и видео. Если это в конце файла, это затрудняет потоковую передачу.

Это может помочь: http://boliston.wordpress.com/tag/moov-box/

Или это: mp4box -inter 0.5 some_file.mp4

(У меня нет возможности попробовать в настоящее время)

Если вам нужно это для работы с вашим приложением, мне не известны какие-либо действия по переносу mp4box на Android.

Кстати, mp4box является частью проекта GPAC в настоящее время. По крайней мере, в Ubuntu есть пакет для этого.gpac.wp.mines-telecom.fr
0

но mp4 не очень легко транслировать (как было сказано ранее, некоторые части написаны в конце). Я не говорю, что это невозможно, но кажется, по крайней мере, довольно сложно.

Так что обходной путь для новых Android API (4.3) может быть таким:

Set the camera preview to a SurfaceTexture: camera.setPreviewTexture Record this texture using OpenGL and MediaCodex + Muxer

Недостатком этого решения является то, что размер предварительного просмотра камеры может быть меньше, чем размер видео. Это означает, что в зависимости от вашего устройства вы не можете записывать с самым высоким разрешением. Подсказка: некоторые камеры говорят, что они не поддерживают более высокие размеры предварительного просмотра, но они поддерживают, и вы можете попытаться настроить камеру для установки размера предварительного просмотра в соответствии с размером видео. Если вы это сделаете, перехватите RuntimeException для camera.setParameters, а в случае сбоя используйте только поддерживаемые размеры предварительного просмотра.

Некоторые ссылки, как сделать запись из SurfaceTexture:

Bigflage: отличные примеры для MediaCodec.

Класс VideoRecorder от Lablet.

Также может быть полезно: spydroid-ipcamera передает данные из сокета MediaRecorder в виде потоков RTP, но я не нашел способа передать их в MediaCodec. (Я уже застрял, читая правильные размеры блока NAL, как они делают ...)

Похожие вопросы