您的位置:首页 > 移动开发 > Android开发

Android如何录制视频过程中切换保存路径?【已解决】

2016-03-24 13:25 429 查看
有一个需求,在录像过程中,满1分钟后,保存为另一个文件,而且要求不许丢秒。

这个问题看似简单,是现实来好难,难点是切换保存路径。

我做了一些尝试:

1、使用Anroid自带的MediaRecorder,录制过程中不允许调用setOutputFile切换路径。

2、MediaRecorder录制过程中瞬间stop、setOutputFile、start,可是中间丢了1.5秒

3、通过查资料得知,MediaRecorder有个这个方法,public void setOutputFile(FileDescriptor fd),可以绑定socket,然后接受数据。可是接受的数据如何编码?如何保存为可播放的视频文件?即使从socket中得到了视频数据,那音频数据还要从其他方式采集,最后合并?找了好久也没找到解决办法。

4、ffmpeg方案,在github和csdn寻找相关demo(下载点击这里)发现所有demo都一样,出于一个作者,原理是,

在Camera的回调函数public void onPreviewFrame(byte[] data, Camera camera),可以拿到每一帧的数据,把data矫正一下角度

然后初始化一个FFmpegRecorder,,一帧一帧的写入文件,与此同时,开启一个线程记录声音,记录声音和记录帧是同时进行的。

我又把帧数据和声音数据放到队列里,分别开线程遍历队列进行保存帧数据和声音数据,遍历队列的时候就有时间去切换路径了。

但是。。。。。出现问题了,录制过程中有些报出帧编码失败异常,声音和视频不同步,而且声音听起来有噪声,如果只写视频倒是问题不大,这个方案目前还处于失败的状态。

目前还没有解决这个问题,如果谁有好想法可以告诉一下我,纠结中。

2016.03.29

用另一个方式解决了,来记录一下。

办法是:切换到下一个文件,重启FrameRecorder,中间仅仅丢掉0.1秒,这样还是可以忍受的。

大问题解决了,还有一些小问题,那就是在onPreviewFrame方法里做编码,会导致丢帧,每秒才7帧。

如果先放到 缓存里也不行,先不谈音频同步问题,加入1秒产生24帧,同时放到缓存,有另外一个线程从缓存取出将编码操作,那么仍然无法在1秒钟完成24帧的编码,内存缓存过多的帧数据,会造成内存溢出,需要用多线程,有要管理音频,难度太大了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: