2013-07-26 3 views
1

Я использую MediaRecorder для записи видео с контейнером MPEG2TS на Samsung Galaxy Note 2. Он инициализирует без каких-либо ошибок и фактически записывает данные в файл (файл увеличивается до нескольких МБ). Однако файл не воспроизводится на любом медиаплеере.Android MediaRecorder создает невоспроизводимый выход MPEG2TS

Вот мой код для инициализации MediaRecorder:

CamcorderProfile profile = null; 
if(CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_720P)){ 
    profile = CamcorderProfile.get(CamcorderProfile.QUALITY_720P); 
}else if(CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_480P)){ 
    profile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P); 
}else{ profile = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW); } 

myMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
myMediaRecorder.setOutputFormat(8); 
myMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); 
myMediaRecorder.setVideoFrameRate(profile.videoFrameRate); 
myMediaRecorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight); 
myMediaRecorder.setVideoEncodingBitRate(profile.videoBitRate); 

String f = Environment.getExternalStorageDirectory().toString() + "/video.ts"; 
myMediaRecorder.setOutputFile(f); 
myMediaRecorder.setPreviewDisplay(previewHolder.getSurface()); 
myMediaRecorder.prepare(); 
myMediaRecorder.start(); 

Приведенный выше код работает нормально, когда я установить выходной формат MP4 ("2"), а не в формате MPEG2-TS ("8"), но когда он установлен в 8, он создает неиграбельное (но не пустое) видео!

Что может быть?

Редактировать: здесь sample video записан на устройстве, если кому-то это интересно.

+0

Вы пытались открыть видеофайл с помощью gspot или чего-то подобного? –

+0

@ DanielMošmondor Да, а также с VLC и mplayer. –

+0

Что говорит gspot? непризнанный? Возможно, если вы загрузите его где-нибудь и сделаете его доступным для кого-то с лучшими инструментами для просмотра ... –

ответ

0

«Любой медиаплеер» является ложным заявлением. Я обнаружил, что VLC не смог воспроизвести потоки MPEG2TS, но ffplay умеет их воспроизводить (ffplay video.ts). Для отладки vlc, можно увеличить подробность:

$ vlc -vvv video.ts 
... 
[0x7ffe34c01728] ts demux debug: eof ? 
[0x7ffe34c01728] ts demux warning: lost synchro 
[0x7ffe34c01728] ts demux debug: skipping 76 bytes of garbage 
[0x7ffe34c01728] ts demux debug: Force Seek Per Percent: Seeking failed at 10%. 
[0x7ffe34c01728] ts demux error: libdvbpsi (misc PSI): Bad CRC_32 table 0x0 !!! 
[0x7ffe34c01728] ts demux error: libdvbpsi (PAT decoder): invalid section (section_syntax_indicator == 0) 
[0x7ffe34c01728] ts demux error: libdvbpsi (PAT decoder): invalid section (section_syntax_indicator == 0) 
... 

Для тех, кто хотел бы использовать этот формат для потоковой передачи, не забудьте понизить первоначальный буфер зонда, который используется для определения формата файла. 8K отлично работает для меня:

nc -l -p 1337 | ffplay -probesize 8192 - 

Или, если поток не закрывается должным образом:

socat TCP-LISTEN:1337,fork,reuseaddr SYSTEM:'killall ffplay; ffplay -probesize 8192 -' 
0

документация из Android говорит MPEG_2_TS требует уровень апи 26

https://developer.android.com/reference/android/media/MediaRecorder.OutputFormat.html#MPEG_2_TS

, которые могли бы почему ваше видео не воспроизводится. Как и во время вашего запроса, MPEG_2_TS официально не поддерживается

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/17482608) –

+0

Я действительно сделал. В ссылках упоминается, что MPEG_2_TS требует уровня 26 api, о котором я говорил. –

Смежные вопросы