我需要为OpenGL框架获取CMSampleBuffer.我正在使用这个:
int s = 1;
UIScreen * screen = [UIScreen mainScreen];
if ([screen respondsToSelector:@selector(scale)]){
s = (int)[screen scale];
}
const int w = viewController.view.frame.size.width/2;
const int h = viewController.view.frame.size.height/2;
const NSInteger my_data_length = 4*w*h*s*s;
// allocate array and read pixels into it.
GLubyte * buffer = malloc(my_data_length);
glReadPixels(0, 0, w*s, h*s, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
// gl renders "upside down" so swap top to bottom into new array.
GLubyte * buffer2 = malloc(my_data_length);
for(int y = 0; y < h*s; y++){ …Run Code Online (Sandbox Code Playgroud) 我需要从内存中的captureSession中保存一些视频帧,并在"某事"发生时将它们写入文件.
与此解决方案类似,我使用此代码将帧放入NSMutableArray:
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection*)connection
{
//...
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
uint8 *baseAddress = (uint8*)CVPixelBufferGetBaseAddress(imageBuffer);
NSData *rawFrame = [[NSData alloc] initWithBytes:(void*)baseAddress length:(height * bytesPerRow)];
[m_frameDataArray addObject:rawFrame];
[rawFrame release];
//...
}
Run Code Online (Sandbox Code Playgroud)
这就是写视频文件:
-(void)writeFramesToFile
{
//...
NSDictionary *outputSettings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:640], AVVideoWidthKey,
[NSNumber numberWithInt:480], AVVideoHeightKey,
AVVideoCodecH264, AVVideoCodecKey,
nil ];
AVAssetWriterInput *bufferAssetWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:outputSettings];
AVAssetWriter *bufferAssetWriter = [[AVAssetWriter alloc]initWithURL:pathURL fileType:AVFileTypeQuickTimeMovie error:&error];
[bufferAssetWriter addInput:bufferAssetWriterInput];
[bufferAssetWriter startWriting];
[bufferAssetWriter startSessionAtSourceTime:startTime];
for (NSInteger i = 1; i < m_frameDataArray.count; …Run Code Online (Sandbox Code Playgroud) 我正在开发一个需要修改音频文件元数据的应用程序.我玩过Apple的官方演示AVReaderWriterOSX.我试图设置的元数据AVAssetWriterInput和AVAssetWriter,但我仍然不能使它工作,将元数据写入到输出文件.有没有人有这方面的例子?
先感谢您.
试图开始使用真正伟大的GPUImage框架,由Brad Larson亲切地分享,但有一个问题.
运行SimpleVideoFileFilter示例时,它总是在完成时崩溃并出现以下错误:
[AVAssetWriterInput markAsFinished]状态为2时无法调用方法
有谁知道如何纠正这个?
在模拟器中运行时也看不到视频,它对模拟器不起作用吗?
运行iOS 6.1和Xcode 4.6
谢谢!
我注意到finishRecordingWithCompletionHandler被调用了两次,它在第二次调用时崩溃了
我成功地将AVFoundation Framework的AVCaptureVideoPreviewLayer捕获的一系列图像编码为使用AVAssetWriter和AVAssetWriterInput的视频.
但是视频的大小太大了,在这种情况下,你们中的任何人都可以向我推荐一个教程或者至少是直接的我,或者给我正确的视频压缩视频输出设置.
我正在使用以下VideoOutputSetting.
videoOutputSettings = @{
AVVideoCodecKey: AVVideoCodecH264,
AVVideoWidthKey: [NSNumber numberWithInt:width],
AVVideoHeightKey: [NSNumber numberWithInt:height],
AVVideoCompressionPropertiesKey: @{
AVVideoAverageBitRateKey: [NSNumber numberWithInt:bitrate],
AVVideoMaxKeyFrameIntervalKey: @(150),
AVVideoProfileLevelKey: AVVideoProfileLevelH264BaselineAutoLevel,
AVVideoAllowFrameReorderingKey: @NO,
AVVideoH264EntropyModeKey: AVVideoH264EntropyModeCAVLC,
AVVideoExpectedSourceFrameRateKey: @(30),
AVVideoAverageNonDroppableFrameRateKey: @(30)
}
};
videoWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoSettings];
_videoWriterInput.expectsMediaDataInRealTime = YES;
Run Code Online (Sandbox Code Playgroud) 我正在尝试AVCaptureSession并编码为mp4.看起来这应该是直截了当的,我正在尝试编码单个960x540视频流; 出于此问题的目的,我并不担心音频问题.
当我运行以下代码并out2.mp4使用Xcode 抓取文档容器时,我会在快速时间内获得黑屏,持续时间为46小时.至少分辨率看起来正确.这是从的输出ffmpeg -i out2.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'out2.mp4':
Metadata:
major_brand : mp42
minor_version : 1
compatible_brands: mp41mp42isom
creation_time : 2015-11-18 01:25:55
Duration: 46:43:04.21, start: 168178.671667, bitrate: 0 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, smpte170m/bt709/bt709), 960x540, 1860 kb/s, 27.65 fps, 29.97 tbr, 600 tbn, 1200 tbc (default)
Metadata:
creation_time : 2015-11-18 01:25:55
handler_name : Core Media Video
Run Code Online (Sandbox Code Playgroud)
为什么我不能AVAssetWriterInput在此方案中添加样本缓冲区?
var videoInput: AVAssetWriterInput?
var assetWriter: AVAssetWriter?
override func viewDidLoad() {
super.viewDidLoad() …Run Code Online (Sandbox Code Playgroud) 我想录制一系列片段,通过视频播放器一起播放或ffmpeg -f concat无缝播放.
在任何一种情况下,我都会在每个分段连接点处得到非常明显的音频打嗝.
我目前的策略是维持2个AssetWriter实例.在每个截止点,我开始一个新的作家,等到它准备好,然后开始给它样品.当视频和音频样本在特定时间点完成时,我关闭最后一个作者.
如何修改此项以获得连续剪辑录制?根本原因是什么问题?
import Foundation
import UIKit
import AVFoundation
class StreamController: UIViewController, AVCaptureAudioDataOutputSampleBufferDelegate, AVCaptureVideoDataOutputSampleBufferDelegate {
@IBOutlet weak var previewView: UIView!
var closingVideoInput: AVAssetWriterInput?
var closingAudioInput: AVAssetWriterInput?
var closingAssetWriter: AVAssetWriter?
var currentVideoInput: AVAssetWriterInput?
var currentAudioInput: AVAssetWriterInput?
var currentAssetWriter: AVAssetWriter?
var nextVideoInput: AVAssetWriterInput?
var nextAudioInput: AVAssetWriterInput?
var nextAssetWriter: AVAssetWriter?
var previewLayer: AVCaptureVideoPreviewLayer?
var videoHelper: VideoHelper?
var startTime: NSTimeInterval = 0
override func viewDidLoad() {
super.viewDidLoad()
startTime = NSDate().timeIntervalSince1970
createSegmentWriter()
videoHelper = VideoHelper()
videoHelper!.delegate = self …Run Code Online (Sandbox Code Playgroud) 我正在编写一个MOV文件,其中提供了许多CMSampleBuffers传递给AVAssetWriterInput对象。进行此操作时,我正在跟踪CMSampleBuffers中压缩数据的字节大小,以写入系统上的日志文件。我唯一缺少的是MOV标头大小。
我的数量和保存的文件大小之间的差异通常是大约2000字节左右的数据。我不知道如何从AVAssetWriter写入文件系统的确切大小。
现在,我可以在关闭MOV文件后找到文件大小,但是由于某种原因,我在bash shell中查看文件时,NSFileSystemManager“ attributesOfItemAtPath”“ NSFileSize”从未匹配字节数。
欢迎提出建议!
鲍勃
我正在创建我的这个应用程序,并以120和240 fps拍摄视频.
当我在Mac上观看这些视频时,我会在时间轴下方看到这些标记.
这些标记是可编辑的,代表慢动作区域.因此,视频以正常帧速率开始,以慢动作进入并在结束时返回正常帧速率.iOS没有把那些标记放在那里.在那种情况下,我想知道是否有办法删除它们,使视频完全慢动作.
我只是AVAssetWriter正常初始化,就像我对视频非慢动作一样.
此外,我注意到这些"慢动作"视频并不是真正的慢动作,但它们是慢动作的"配方",只能在使用QuickTime X的iOS设备和Mac上正常播放.甚至QuickTime 7都没有正确播放它们.
无论如何要使这个东西成为可以在任何玩家,任何计算机上播放的真正的慢动作?
我正在录制视频(用户也可以只切换到音频)AVAssetWriter.我在应用程序启动时开始录制.但是第一帧是黑色(或非常暗).当我从音频切换到视频时也会发生这种情况.感觉就像AVAssetWriter和/或AVAssetWriterInput尚未准备好记录.我怎么能避免这个?
我不知道这是否有用,但我也用a GLKView来显示视频.
func start_new_record(){
do{
try self.file_writer=AVAssetWriter(url: self.file_url!, fileType: AVFileTypeMPEG4)
if video_on{
if file_writer.canAdd(video_writer){
file_writer.add(video_writer)
}
}
if file_writer.canAdd(audio_writer){
file_writer.add(audio_writer)
}
}catch let e as NSError{
print(e)
}
}
func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!){
guard is_recording else{
return
}
guard CMSampleBufferDataIsReady(sampleBuffer) else{
print("data not ready")
return
}
guard let w=file_writer else{
print("video writer nil")
return
}
if w.status == .unknown && start_recording_time==nil{
if (video_on && …Run Code Online (Sandbox Code Playgroud) avassetwriter ×10
avfoundation ×5
ios ×5
swift ×3
avasset ×2
iphone ×2
objective-c ×2
cocoa ×1
compression ×1
core-motion ×1
filesize ×1
gpuimage ×1
metadata ×1
opengl-es ×1
reduce ×1
video ×1