我正在使用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。
答案 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不受官方支持