我正在尝试使用iFrameExtractor示例中的make和build文件来编译ffmpeg .首先,我试图遵循github上的自述文件,该文件只表示./build_universal
在ffmpeg文件夹中运行.那没起效
然后,我尝试按照INSTALL中的信息进行操作,但没有成功.然后我尝试在INSTALL中执行这些操作,然后执行该操作./build_universal
.导入到项目的所有*.a文件都存在,直到构建序列结束.当运行build_universal中的lipo命令时,我想连接不同体系结构的.a文件(?).无论如何这些都会留下以下错误:
lipo: specifed architecture type (armv6) for file (armv6/libavcodec.a) does not match it's cputype (16777223) and cpusubtype (3) (should be cputype (12) and cpusubtype (6))
lipo: specifed architecture type (armv6) for file (armv6/libavdevice.a) does not match it's cputype (16777223) and cpusubtype (3) (should be cputype (12) and cpusubtype (6))
lipo: specifed architecture type (armv6) for file (armv6/libavformat.a) does not match it's cputype (16777223) and cpusubtype (3) (should be cputype (12) …
Run Code Online (Sandbox Code Playgroud) 好的,就是这种情况,我实际上想解析一个mov文件中的帧.获取编码的h264帧.并且我已经设法通过使用ffmpeg这样做,但当我尝试再次使用ffmpeg -i test* test.mov
我得到一个电影,test00: Invalid data found when processing input
所以有一些不正确的框架结构.据我所知,一个框架应具有以下外观:
00 00 00 01 XX数据-------------
其中XX表示它是I帧,P帧还是B帧.或者更具体地说type(XX) = 0x0F && XX
是否是I(类型(XX)= 5?),P(类型(XX)= 7?)或B(类型(XX)= 8?)帧.我不确定这些数字,我一直在寻找它,但没有找到好的来源.这是第一个问题,NALU对于不同的帧应该是多少?
无论如何,当我在mov文件上使用av_read_frame时,我得到的帧看起来像这样:
4B =大小,1B = XX,然后是数据.(至少这是我认为我得到的)
其中i存储帧的文件总是尺寸长,当我在一个16进制软件(否则也当然)看着他们.并且XX在第一个中始终为65(即,类型(XX)= 5),然后在一帧中为61(即,类型(XX)= 1),然后在一帧中返回到65,依此类推.
我猜这些帧是这样的:IPPPPPPIPPPPPPPIPPPPP PP ....然而,我对不同帧类型的类型号的假设是错误的,这很有可能.(关于这个的任何建议?除了ISO/IEC 14496-10,我真的不明白).
我试图删除大小并在XX字节和数据之前附加00 00 00 01但没有成功.关于如何将帧修改为有效的H264编码帧的任何提示?
我正在尝试从.mov文件解析H.264帧.我想我已经得出结论,来自AVFormat的mov.c - FFMPEG的一部分是要走的路.但mov.c是未注释代码旁边约2600行.我正在寻找FFMPEG的使用示例,尤其是解析任何文件类型的结构.无论是MPEG4还是Quicktime Movie都没关系,因为它们在结构上非常相似.
如果没有现有的例子(我找不到)可能有人使用过它并且可以给我几行代码,或者解释如何开始?
我正在尝试做的事情:我使用AVCaptureSession从摄像机捕获样本,然后在H264中对这些样本进行编码,并借助AVAssetsWriter,AVAssetsWriterInput和AVAssetsWriterInputPixelBufferAdaptor将其写入文件.原因是我无法直接访问硬件H264编码,因为苹果不允许这样做.我现在需要做的事情(我认为不确定)是解析出来的:
.mov文件中的" mdat "-atom(电影数据,我认为可能不止一个).那么" 视频 "-atom然后在视频原子内(视频数据样本,可能有不止一个).我想我会相信几个原子是帧.这些将是"avc1"类型(这是H264的类型).请纠正我,因为我很确定我还没有正确地完成这一切.
我的问题是,我将如何解析单帧.我一直在阅读文档并查看了iFrameExtractor(由于它对帧进行解码,因此不是很有帮助).我想我理解正确的话时,我应该使用mov.c从FFMPEG-AVFormat,但我不知道.
编辑:我现在正在尝试这样:
我运行稍微减少的init函数i iFrameExtractor,它在.mov文件中找到了视频流.
我得到框架的数据,如下所示:
AVPacket packet;
av_read_frame(pFormatCtx, &packet);
NSData *frame;
if(packet.stream_index == videoStream){
frame = [NSData dataWithBytes:packet.data length:packet.size];
}
videoStream++;
av_free_packet(&packet);
return frame;
Run Code Online (Sandbox Code Playgroud)然后我将它传递给NSOperation的子类,在那里保留等待上传.但我收到一个EXC_BAD_ACC,从框架中复制数据时我做错了什么?有任何想法吗.当我尝试NSData* frame
使用其(非原子,保留)属性设置类变量时,我得到了EXC _... (它在合成行上说EXC_BAD_ACC)
我遇到了MessageBoxes的问题.当弹出MessageBox并进入另一个窗口/程序时,MessageBox有时会在父对话框后面结束.因此,我无法丢弃MessageBox,因为父对话框已禁用,我无法移动它.
有什么方法可以在单击父对话框或类似时将MessageBox弹出到前面?我正在使用C#.
最好的祝福
我已经将NSOperation子类化了 - (void)main是正确的,(因为它在使用NSOperation之前工作),我还逐步完成了init方法,并且变量被正确初始化.在( - id)initWithSampleBuffer:完成之后所有的艰难,我正在尝试将uploadOperation添加到NSOperationQueue:
UploadOperation *ulOp = [[UploadOperation alloc] initWithSampleBuffer:sampleBuffer];
[queue addOperation:ulOp]; //here i get exc_bad_access
[ulOp release];
Run Code Online (Sandbox Code Playgroud)
我得到了exc_bad_access.我已经尝试过断点,我可以看到队列存在,ulOp也是如此.我无法弄清楚我做错了什么,因为根据我的理解,当你试图将"消息"传递给已经解除分配的东西时,会发生exc_bad_access,显然,没有一个是.
- (id)initWithSampleBuffer:(CMSampleBufferRef) aSampleBuffer {
sampleBuffer = aSampleBuffer;
VideoStreamViewController *vc = [VideoStreamViewController shared];
ul = [[Uploader alloc] initWithURL:[NSURL alloc] filePath:@"" delegate:vc doneSelector:@selector(didFinishUpload:) errorSelector:@selector(uploadFailed:)];
return self;
}
Run Code Online (Sandbox Code Playgroud)
然而上传者的东西,不是问题(我删除它,仍然得到相同的结果).从我可以看到CMSampleBuffer对象没有问题,它被初始化!
队列初始化:
在.h:
NSOperationQueue *queue;
@property (nonatomic, retain) NSOperationQueue *queue;
Run Code Online (Sandbox Code Playgroud)
在.m:
@synthesize queue;
self.queue = [[NSOperationQueue alloc] init];
[queue setMaxConcurrentOperationCount:1];
Run Code Online (Sandbox Code Playgroud)