Я пытаюсь передать видео с камеры 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 atom. Итак, заголовок теперь выглядит следующим образом:
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!
Что я делаю неправильно?