Android MediaCodec录屏时如何获取实时的文件大小
时间: 2023-12-14 18:37:35 浏览: 106
Android 录屏,录音,并通过MediaCodec编码后保存到文件,含全部源码
在使用Android MediaCodec录屏时,可以通过以下方式获取实时的文件大小:
1. 在MediaMuxer中创建一个MuxerRunnable线程,负责将编码后的视频数据和音频数据写入到文件中。
2. 在MuxerRunnable线程中,可以使用File.length()方法获取已经写入文件的大小,即实时的文件大小。
3. 可以在MuxerRunnable线程中定时打印或者通过广播等方式通知主线程实时的文件大小。
示例代码如下:
```java
public class MuxerRunnable implements Runnable {
private MediaMuxer mMuxer;
private boolean mIsStarted;
private boolean mIsVideoTrackAdded;
private boolean mIsAudioTrackAdded;
private int mVideoTrackIndex = -1;
private int mAudioTrackIndex = -1;
private long mLastFileSize = 0;
private File mOutputFile;
private Handler mHandler;
private static final int MSG_UPDATE_FILE_SIZE = 1;
private static final long UPDATE_FILE_SIZE_INTERVAL = 1000; // 1秒更新一次文件大小
public MuxerRunnable(MediaMuxer muxer, File outputFile, Handler handler) {
mMuxer = muxer;
mOutputFile = outputFile;
mHandler = handler;
}
@Override
public void run() {
try {
while (!mIsStarted || !mIsVideoTrackAdded || !mIsAudioTrackAdded) {
Thread.sleep(10);
}
while (mIsStarted) {
long currentFileSize = mOutputFile.length();
if (currentFileSize != mLastFileSize) {
mLastFileSize = currentFileSize;
mHandler.sendEmptyMessage(MSG_UPDATE_FILE_SIZE);
}
Thread.sleep(UPDATE_FILE_SIZE_INTERVAL);
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (mMuxer != null) {
mMuxer.stop();
mMuxer.release();
}
}
}
public void start() {
mIsStarted = true;
new Thread(this).start();
}
public void stop() {
mIsStarted = false;
}
public void addVideoTrack(MediaFormat format) {
if (mMuxer != null) {
mVideoTrackIndex = mMuxer.addTrack(format);
if (mAudioTrackIndex != -1) {
mMuxer.start();
}
mIsVideoTrackAdded = true;
}
}
public void addAudioTrack(MediaFormat format) {
if (mMuxer != null) {
mAudioTrackIndex = mMuxer.addTrack(format);
if (mVideoTrackIndex != -1) {
mMuxer.start();
}
mIsAudioTrackAdded = true;
}
}
}
```
在主线程中,可以创建一个Handler来接收MuxerRunnable线程发送的文件大小更新消息,并更新UI界面。
```java
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == MSG_UPDATE_FILE_SIZE) {
long fileSize = mOutputFile.length();
mFileSizeTextView.setText(String.format(Locale.getDefault(), "文件大小:%d KB", fileSize / 1024));
}
}
};
```
阅读全文