我正在尝试录制一段10秒钟的视频进行监控.在Android中使用MediaRecorder非常简单.我所要做的就是打电话
mediaRecorder.setMaxDuration(10000);
Run Code Online (Sandbox Code Playgroud)
但是,我想连续覆盖相同的10秒视频.同样,这是一项微不足道的任务.
@Override
public void onInfo(MediaRecorder mr, int what, int extra) {
switch (what) {
case MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED:
stopRecording();
startRecording();
break;
}
}
Run Code Online (Sandbox Code Playgroud)
停止和启动(重新设定)MediaRecorder大约需要两秒钟.如果在这两秒钟内发生了重要事情,我就不会记录下来.
因此,我通过使用LocalSocket跟踪其他几个具有相同问题的人,并将其描述符传递给MediaRecorder
mediaRecorder.setOutputFile(sender.getFileDescriptor());
Run Code Online (Sandbox Code Playgroud)
然后是一个包含LocalServerSocket和接收器LocalSocket的AyncTask
public class VirtualServer extends AsyncTask<Void, Void, Void> {
...
server = new LocalServerSocket(SOCKET_ADDRESS);
while (true) {
receiver = server.accept();
...
int len = 0;
byte[] data = new byte[1024];
while ((len = input.read(data)) >= 0) {
...
Run Code Online (Sandbox Code Playgroud)
看看这是怎么回事?一旦解决了,就会出现一个新问题,在StackOverflow上也会多次解决.问题是传递给MediaRecorder的文件描述符不可搜索.
对我而言,这是我的理解停止的地方.不幸的是,没有明确的问题描述.如果有人可以向我描述问题,我可以开始寻找解决方案.有些地方提到"moot"必须重新定位,但随后讨论会转向一般的mp4编码,我迷失在所有细节中.
我希望我的问题得到明确说明.我不想播放任何形式的视频.深入研究打包成RTP并尝试提取我真正需要的部分的代码让我更加困惑.
我已经看过的链接:
干杯.
android video-encoding mpeg-4 mediarecorder android-mediarecorder
我想只用android4格式录制视频.我希望容器和编解码器是MPEG4.所以这就是我为此所做的.
Thread video = new Thread(new Runnable() {
public void run() {
videoRecorder = new MediaRecorder();
videoRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
videoRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
videoRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
videoRecorder.setVideoEncodingBitRate(56 * 8 * 1024);
videoRecorder.setVideoSize(176, 144);
videoRecorder.setVideoFrameRate(12);
videoRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
videoRecorder.setOutputFile("/sdcard/video.m4e");
try {
videoRecorder.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
videoRecorder.start();
}
});
video.start();
Run Code Online (Sandbox Code Playgroud)
现在,录制完成后,我将视频录制到video.m4e文件中.但是当我检查它的信息时,我得到了以下信息:

同时我使用以下内容录制音频:
Thread audio = new Thread(new Runnable() {
public void run() {
audioRecorder = new MediaRecorder();
audioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
audioRecorder.setOutputFile("/sdcard/audio.amr");
try {
audioRecorder.prepare();
} catch (IllegalStateException e) { …Run Code Online (Sandbox Code Playgroud)