Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android MediaRecorder产生无法播放的MPEG2TS输出_Android_Video Capture_Android Mediarecorder_Mpeg2 Ts - Fatal编程技术网

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

Android MediaRecorder产生无法播放的MPEG2TS输出,android,video-capture,android-mediarecorder,mpeg2-ts,Android,Video Capture,Android Mediarecorder,Mpeg2 Ts,我使用MediaRecorder在三星Galaxy Note 2上使用MPEG2TS容器录制视频。它初始化时没有任何错误,并实际将数据写入文件(文件增长到几MB)。但是,该文件不能在任何媒体播放器中播放 以下是我初始化MediaRecorder的代码: CamcorderProfile profile = null; if(CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_720P)){ profile = CamcorderPro

我使用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时,它会生成无法播放(但不是空的)视频

会发生什么事

编辑:如果有人感兴趣,这是设备上录制的内容。

“任何媒体播放器”都是虚假声明。我发现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 -'

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


这可能就是你的视频无法播放的原因。在您询问时,MPEG_2_TS没有得到官方支持

您是否尝试使用gspot或类似的工具打开视频文件?@DanielMošmondor是的,以及VLC和mplayer。gspot怎么说?未被承认?也许如果你把它上传到某个地方,让有更好工具的人可以看…@DanielMošmondor编辑后添加到视频样本的链接。GSpot只是将其标识为“MPEG-2传输流”,但我知道已经。。。它没有显示任何其他内容。我用流分析器看了一眼,试试看。。。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-我真的做到了。链接提到MPEG_2_TS需要api级别26,我已经说过了。