GPUImageMovieWriter录制视频问题

1、两个movie叠加的时候,每个movie解码出一帧都会走到GPUImageTwoInputFilter的newFrameReadyAtTime

- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex;

{

// You can set up infinite update loops, so this helps to short circuit them

if (hasReceivedFirstFrame && hasReceivedSecondFrame)

{

return;

}

BOOL updatedMovieFrameOppositeStillImage = NO;

if (textureIndex == 0)

{

hasReceivedFirstFrame = YES;

firstFrameTime = frameTime;

if (secondFrameCheckDisabled)

{

hasReceivedSecondFrame = YES;

}

if (!CMTIME_IS_INDEFINITE(frameTime))

{

if CMTIME_IS_INDEFINITE(secondFrameTime)

{

updatedMovieFrameOppositeStillImage = YES;

}

}

}

else

{

hasReceivedSecondFrame = YES;

secondFrameTime = frameTime;

if (firstFrameCheckDisabled)

{

hasReceivedFirstFrame = YES;

}

if (!CMTIME_IS_INDEFINITE(frameTime))

{

if CMTIME_IS_INDEFINITE(firstFrameTime)

{

updatedMovieFrameOppositeStillImage = YES;

}

}

}

// || (hasReceivedFirstFrame && secondFrameCheckDisabled) || (hasReceivedSecondFrame && firstFrameCheckDisabled)

if ((hasReceivedFirstFrame && hasReceivedSecondFrame) || updatedMovieFrameOppositeStillImage)

{

CMTime passOnFrameTime = (!CMTIME_IS_INDEFINITE(firstFrameTime)) ? firstFrameTime : secondFrameTime;

[super newFrameReadyAtTime:passOnFrameTime atIndex:0]; // Bugfix when trying to record: always use time from first input (unless indefinite, in which case use the second input)

hasReceivedFirstFrame = NO;

hasReceivedSecondFrame = NO;

}

}

因为两个movie在不同的线程,如果2个movie帧率不一样,因为录制的时候是全速的,这样可能movie1已经来到上面方法很多次,而movie2才来一帧,这样就导致movie1

丢失了帧。解决方法:

- (BOOL)readNextVideoFrameFromOutput:(AVAssetReaderOutput *)readerVideoTrackOutput;

{

if (reader.status == AVAssetReaderStatusReading && ! videoEncodingIsFinished)

{

CMSampleBufferRef sampleBufferRef = [readerVideoTrackOutput copyNextSampleBuffer];

if (sampleBufferRef)

{

if (_playAtActualSpeed)

{

...

}else{

//这里判断另外一个movie是否准备,没准备就等一下

}

__unsafe_unretained GPUImageMovie *weakSelf = self;

runSynchronouslyOnVideoProcessingQueue(^{

[weakSelf processMovieFrame:sampleBufferRef];

CMSampleBufferInvalidate(sampleBufferRef);

CFRelease(sampleBufferRef);

});

return YES;

}

else

{

if (!keepLooping) {

videoEncodingIsFinished = YES;

if( videoEncodingIsFinished && audioEncodingIsFinished )

[self endProcessing];

}

}

}

else if (synchronizedMovieWriter != nil)

{

if (reader.status == AVAssetReaderStatusCompleted)

{

[self endProcessing];

}

}

return NO;

}

2、使用GPUImageMovieWriter的processAudioBuffer写音频时,如果是写太快,可能导致音频丢失,可以在线程中sleep一下。

When expectsMediaDataInRealTime is YES, readyForMoreMediaData will become NO only when the input cannot process media samples as quickly as they are being provided by the client. If readyForMoreMediaData becomes NO for a real-time source, the client may need to drop samples or consider reducing the data rate of appended samples.

3、使用GPUImageThreeInput,需要自己写fragment shafer,init的时候传入。

GPUImageMovieWriter录制视频问题相关推荐

  1. iOS三种录制视频方式详细对比

    先附上参考资料 http://www.jianshu.com/p/16cb14f53933 https://developer.apple.com/library/content/samplecode ...

  2. 使用WebEx录制视频并转换为MP4

    1.下载并安装WebEx http://www.question-defense.com/wp-content/uploads/2010/05/ateditor-version-3.0.zip 2.打 ...

  3. android开发,静音录制视频,在一般清晰度的前提下保证文件大小越小越好

    public void startRecord() {mediarecorder = new MediaRecorder();// 创建mediarecorder对象mCamera = getCame ...

  4. python opencv 录制视频_OpenCV Python 录制视频

    学到实用OpenCV调用笔记本电脑的摄像头,并录制视频保存到本地硬盘的时候,出现了一点故障,那就是获取到的文件总是为0KB.经过一番查找,终于找到了解决办法. 调用摄像头 调用摄像头作为本实验的基础是 ...

  5. OpenCV+python调用本地摄像头并录制视频

    1.调用摄像头并录制视频 from cv2 import cv2 #捕获摄像头帧 cameraCapture = cv2.VideoCapture(0) fps = 30 size=(int(came ...

  6. android 美颜录像,Android 关于美颜/滤镜 利用PBO从OpenGL录制视频

    前言 上次我写了一遍文章<Android 关于美颜/滤镜 从OpenGl录制视频的一种方案>,里面利用ImageReader来从获取Surface上获取数据,但是经过@熊皮皮的提醒,我发现 ...

  7. android 视频录制小例子,android 录制视频实例 VideoRecordDemo

    [实例简介] [实例截图] [核心代码] package com.example.videorecorddemo; import java.io.IOException; import java.ut ...

  8. 实时录制视频,实时去除人_录制实时演示,第2部分:软件设置

    实时录制视频,实时去除人 如果您是进行现场会议的团队的一员,则有可能要录制发言人的演讲并在网上发布. 幸运的是,这要归功于开源软件和现成的硬件,这在今天是容易且相对便宜的. 有关录制实时演示文稿的本系 ...

  9. vs中实现声音录制并保存到指定文件_别人直播怎么录制视频?这三种方法你可以不知道...

    在网络科技发展迅速的今天,直播成为了当前最为火热的娱乐方式.不管您是上班族还是自由职业者,在闲暇时除了打游戏以外,直播或许也是最好的选择了.所以,这之中就会产生一些需求,例如:需要将一些自己喜欢的一些 ...

最新文章

  1. rsyslog的配置文件使用方法
  2. JavaScript 开发者数量暴涨、C# 超越 PHP,揭晓全球开发最新趋势!
  3. 利用ESP32驱动控制步进电机驱动器:MS2806
  4. python web shell
  5. ArrayList分析
  6. 手动整合ssh框架时的各种错误
  7. httpclient 调取接口_HttpClient调用接口发送文件
  8. 八十一、Python | Leetcode 二叉树系列(下篇)
  9. [CF791D]Bear and Tree Jumps
  10. React开发(157):一级直接用getFieldDecorator
  11. js对浏览器内部及外部窗口宽度及高度使用测试
  12. 03-24 CPU 统计
  13. [AX]AX2012 C#使用IIS宿主AIF服务的一些问题
  14. Java 语言结构【转】
  15. 自由曲面透镜设计matlab,实现LED台灯均匀照明的自由曲面透镜仿真设计
  16. 【maya】模型学习
  17. 什么是智能家电?消费者不知判定标准
  18. 无限城app为什么服务器繁忙,鬼灭之刃:无惨为什么敢一人前往无限城,其实他最大底牌就是上五...
  19. 计算机最简单的爱情音乐,音乐里那些最动人的情话,适合一个人在家静静聆听...
  20. UE4 回合游戏项目 14- 添加敌人攻击

热门文章

  1. 【转载】spring mvc 使用session
  2. pythonUI---ttk.Treeview使用心得(内含表格形式加垂直水平滚轮方法)
  3. 解决AndroidStudio更新后在 Building gradle project info 一直卡住
  4. java创建gitlab账户_GitLab不会创建新的存储库
  5. Javascript第六章JavaScript用new创建对象第一课
  6. 重庆理工大学图像处理实验三:图像分割
  7. linux压缩比,Linux下各压缩方式测试(压缩率和使用时间)
  8. oracle+imp部分数据,ORACLE数据库IMP逻辑导入出现ORA-00910的处理案例
  9. python中 和 的区别_举例子让你明白python中is和==的区别
  10. android http 图片上传,Android okHttp上传图片