我目前正在尝试将Android用作Skype端点.在这个阶段,我需要将视频编码为H.264(因为它是Skype支持的唯一格式)并将其封装在RTP中以使流式传输工作.
显然,MediaRecorder出于各种原因,它并不适合这种情况.一个是因为它在完成后添加了MP4或3GP标头.另一个原因是为了将延迟降至最低,硬件加速可能会派上用场.这就是为什么我想利用最近的低级别增列和框架,是MediaCodec,MediaExtractor等
目前,我计划如下工作.相机将其视频写入缓冲区.MediaCodec使用H264对视频进行编码,并将结果写入另一个缓冲区.此缓冲区由RTP封装器读取,后者将流数据发送到服务器.这是我的第一个问题:这个计划听起来对你有用吗?
现在我已经陷入第一步了.由于互联网上关于使用相机的所有文档都使用了MediaRecorder,我找不到在编码之前将原始数据存储到缓冲区的方法.是addCallbackBuffer适合呢?任何人都有一个例子的链接?
接下来,我找不到很多关于MediaCodec的文档(因为它相当新).有固定教程的人吗?
最后:关于RTP库的任何建议?
非常感谢提前!
我正在尝试MediaRecorder不使用Camera实例而是使用Surface视频源进行录制(是的,这是可能的,但事实证明它并不完美)-mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
我只写什么问题:
下一个代码仅适用于某些设备,并在最近的设备重新启动后在某些设备上临时工作或根本不起作用
如果它不起作用 okMediaRecorder.stop()方法失败并出现下一个错误
E/MediaRecorder:停止失败:-1007 W/System.err:
java.lang.RuntimeException:停止失败。在
android.media.MediaRecorder.stop(本机方法)
录音机 mp4 文件太小(千字节),无法播放
测试设备:
适用于联想 P2、小米 A1
不适用于小米红米 5、索尼 Xperia、小米红米 4 Prime
您也可以阅读我的代码中的注释以更好地理解问题
new Thread(() -> {
MediaRecorder mediaRecorder = new MediaRecorder();
File file = new File(Environment.getExternalStorageDirectory()
+ File.separator + "test_media_recorder_surface_source.mp4");
if (file.exists()) {
file.delete();
}
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setOutputFile(file.getAbsolutePath());
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mediaRecorder.setVideoSize(1280, 720);
mediaRecorder.setCaptureRate(24);
try {
mediaRecorder.prepare();
int sleepTime = 1000 / 24;
Surface surface = mediaRecorder.getSurface();
mediaRecorder.start();
// record something (we can …Run Code Online (Sandbox Code Playgroud) android surface android-canvas mediarecorder android-mediarecorder