2

我正在使用 MediaRecorder 在三星 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 时,它会产生一个无法播放(但不是空的)视频!

会发生什么?

编辑:如果有人感兴趣,这是设备上录制的示例视频。

4

2 回答 2

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 -'
于 2014-06-04T10:13:49.767 回答
0

Android 的文档说 MPEG_2_TS 需要 api 级别 26

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

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

于 2017-09-29T10:02:25.290 回答