Android MediaRecorder产生无法播放的MPEG2TS输出

时间:2013-07-26 15:33:49

标签: android video-capture android-mediarecorder mpeg2-ts

我正在使用MediaRecorder在Samsung Galaxy Note 2上使用MPEG2TS容器录制视频。它初始化时没有任何错误,并且实际上将数据写入文件(文件增长到几MB)。但是,该文件无法在任何媒体播放器中播放。

这是我的初始化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

2 个答案:

答案 0 :(得分: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 -'

答案 1 :(得分:0)

来自Android的文档说MPEG_2_TS要求api等级26

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

这可能是您的视频无法播放的原因。在您提问时,MPEG_2_TS不受官方支持