录制视频过程中如何获取已录制时长?
视频录制中获取已录制时长的方案
根据不同开发平台,获取实时录制时长的实现方式有所不同,以下是主流场景的具体方案:
浏览器端(Web API)
使用MediaRecorder时,API本身没有直接暴露录制时长属性,可通过时间戳差值计算:
- 启动录制时记录当前时间戳
- 需要获取时长时,用当前时间减去启动时间戳,转换为秒单位
let mediaRecorder; let startTimestamp; // 初始化并启动录制 async function startRecording(stream) { mediaRecorder = new MediaRecorder(stream); startTimestamp = Date.now(); mediaRecorder.start(); } // 获取当前已录制时长(返回秒数,保留小数) function getRecordedDuration() { if (!startTimestamp) return 0; return (Date.now() - startTimestamp) / 1000; }
如果需要精确到录制片段的实际编码时长,可以将已录制的Blob加载到<video>元素中读取duration属性,但这种方式更适合片段结束后计算,实时场景优先用时间戳方案。
Android 平台
Android原生MediaRecorder提供getCurrentPosition()方法,直接返回当前已录制时长(单位:毫秒):
val mediaRecorder = MediaRecorder().apply { // 配置音视频源、输出格式等参数 setAudioSource(MediaRecorder.AudioSource.MIC) setVideoSource(MediaRecorder.VideoSource.CAMERA) setOutputFormat(MediaRecorder.OutputFormat.MPEG_4) setAudioEncoder(MediaRecorder.AudioEncoder.AAC) setVideoEncoder(MediaRecorder.VideoEncoder.H264) setOutputFile("/sdcard/recorded_video.mp4") prepare() start() } // 获取已录制时长(毫秒) fun getCurrentRecordedDuration(): Long { return mediaRecorder.currentPosition }
注意:录制暂停时,currentPosition会停止增长,恢复录制后自动累加。
iOS 平台
结合AVCaptureSession与AVAssetWriter开发时,可通过采样缓冲的时间戳差值计算时长:
var assetWriter: AVAssetWriter? var recordingStartTime: CMTime? // 处理采样缓冲时记录开始时间 func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) { if recordingStartTime == nil { recordingStartTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer) assetWriter?.startWriting() assetWriter?.startSession(atSourceTime: recordingStartTime!) } // 写入缓冲数据逻辑... } // 获取已录制时长(秒) func getRecordedDuration() -> Double { guard let startTime = recordingStartTime, let latestSampleBuffer = getLatestSampleBuffer() // 需自行实现获取最新采样缓冲的逻辑 else { return 0 } let currentTime = CMSampleBufferGetPresentationTimeStamp(latestSampleBuffer) return CMTimeGetSeconds(CMTimeSubtract(currentTime, startTime)) }
若使用ReplayKit进行屏幕录制,可通过计时器结合录制状态(开始/暂停)来维护时长。
FFmpeg SDK(libavformat)
基于FFmpeg开发录制功能时,可通过跟踪数据包的时间戳计算时长:
- 记录第一个数据包的时间基准和时间戳
- 后续每个数据包的时间戳减去初始时间戳,再结合时间基准转换为秒单位
核心逻辑示例:
AVStream* video_stream = ...; // 获取视频流 int64_t start_pts = -1; // 处理录制的数据包时 if (start_pts == -1) { start_pts = packet->pts; } // 计算已录制时长(秒) double duration = av_rescale_q(packet->pts - start_pts, video_stream->time_base, AV_TIME_BASE_Q); duration /= AV_TIME_BASE;
内容的提问来源于stack exchange,提问作者Project SmNeo
相关产品推荐
相关产品推荐

