2

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();

上記のコードは、出力形式を MPEG2-TS ("8") ではなく MP4 ("2") に設定すると問題なく動作しますが、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 に答える