Исправить файл 3GP после потоковой передачи с Android Media Recorder
Я пытаюсь потоковое видео с камеры Android через локальный сокет Unix и записать файл из потока на SDCard. Все отлично работает, кроме файла не воспроизводится ни на одном плеере. Это потому, что Android не заполняет некоторые пробелы в файле, потому что сокет не доступен для поиска. Как я понимаю, мне нужно внести некоторые изменения после окончания видеопотока. Я прочитал несколько статейВот, Вот а такжеВот, но никто из них не помог мне. Я играю с шестнадцатеричным редактором, чтобы научиться делать это вручную, поэтому после этого будет тривиально сделать то же самое в коде Android.
Вот пример файла, который был сохранен из потока:https://dl.dropbox.com/u/17510473/sample_not_playable.3gp
Может кто-нибудь исправить, чтобы сделать его играбельным и рассказать как он это сделал?
EDIT: Я удаляю заголовок файла 3gp и пишу новый следующим образом:
00 00 00 18 66 74 79 70 33 67 70 34 00 00 03 00 33 67 70 34 33 67 70 36 00 00 00 00
Затем я нахожу начальное местоположение атомов mdat и moov с помощью следующей команды:
grep -aobE "ftyp|mdat|moov" sample_not_playable.3gp
И это дает мне следующий вывод:
4:ftyp
28:mdat
1414676:moov
Тогда сделай1414676 - 28 = 1,414,648 = 0x1595F8
Затем я пишу 0x1595F8 как 25-28 байт, как раз перед атомом mdat. Так что мой заголовок теперь выглядит так:
00 00 00 18 66 74 79 70 33 67 70 34 00 00 03 00 33 67 70 34 33 67 70 36 00 15 95 F8
И когда я пытаюсь воспроизвести его с помощью mplayer, я получаю несколько поврежденных видео и аудио выходов. Вот некоторая часть из вывода mplayer:
[amrwb @ 0x7f72ad652380]Frame too small (33 bytes). Truncated file?
[amrwb @ 0x7f72ad652380]Encountered a bad or corrupted frame
[amrwb @ 0x7f72ad652380]Encountered a bad or corrupted frame
[amrwb @ 0x7f72ad652380]Frame too small (33 bytes). Truncated file?
[amrwb @ 0x7f72ad652380]Encountered a bad or corrupted frame
[amrwb @ 0x7f72ad652380]Encountered a bad or corrupted frame
[amrwb @ 0x7f72ad652380]Encountered a bad or corrupted frame
A: 11.0 V: 1.4 A-V: 9.650 ct: 0.023 0/ 0 10% 1% 1.6% 0 0
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7f72adeafc40]stream 1, offset 0x15e62b: partial file
[h263 @ 0x7f72ad652380]Bad picture start code
[h263 @ 0x7f72ad652380]header damaged
Error while decoding frame!
[h263 @ 0x7f72ad652380]Bad picture start code
[h263 @ 0x7f72ad652380]header damaged
Error while decoding frame!
[h263 @ 0x7f72ad652380]Bad picture start code
[h263 @ 0x7f72ad652380]header damaged
Error while decoding frame!
A: 11.1 V: 1.5 A-V: 9.558 ct: 0.027 0/ 0 9% 1% 1.4% 0 0
[h263 @ 0x7f72ad652380]Bad picture start code
[h263 @ 0x7f72ad652380]header damaged
Error while decoding frame!
Что я делаю не так?