You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

录制视频过程中如何获取已录制时长?

视频录制中获取已录制时长的方案

根据不同开发平台,获取实时录制时长的实现方式有所不同,以下是主流场景的具体方案:

浏览器端(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:15:13