我正在尝试播放一个MP3传递给UIView前一个文件的文件UIView(存储在一个NSURL *fileURL变量中).
我正在初始化一个AVPlayer:
player = [AVPlayer playerWithURL:fileURL];
NSLog(@"Player created:%d",player.status);
Run Code Online (Sandbox Code Playgroud)
我想的NSLog印刷品Player created:0,意味着它尚未准备好播放.
当我点击播放时UIButton,我运行的代码是:
-(IBAction)playButtonClicked
{
NSLog(@"Clicked Play. MP3:%@",[fileURL absoluteString]);
if(([player status] == AVPlayerStatusReadyToPlay) && !isPlaying)
// if(!isPlaying)
{
[player play];
NSLog(@"Playing:%@ with %d",[fileURL absoluteString], player.status);
isPlaying = YES;
}
else if(isPlaying)
{
[player pause];
NSLog(@"Pausing:%@",[fileURL absoluteString]);
isPlaying = NO;
}
else {
NSLog(@"Error in player??");
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我总是进入Error in player??控制台.然而,如果我用一个简单的...... 替换if检查是否 …
AVCaptureVideoPreviewLayer *avLayer =
[AVCaptureVideoPreviewLayer layerWithSession:session];
avLayer.frame = self.view.frame;
[self.view.layer addSublayer:avLayer];
Run Code Online (Sandbox Code Playgroud)
我使用AVCaptureVideoPreviewLayer在视图上显示视频.但视频的视图并没有填满整个iPhone4的屏幕.(右侧和左侧有两个灰色条)
我希望视频能够全屏显示.我怎么处理它?非常感谢你!

我正在使用AVPlayerHTTP直播的无线电应用程序.现在我想为该音频流实现一个电平表.最好的水平仪显示不同的频率,但简单的左/右解决方案将是一个很好的起点.
我发现了几个使用的例子AVAudioPlayer.但我无法找到解决所需信息的解决方案AVPlayer.
有人能想到我的问题的解决方案吗?
编辑我想创建这样的东西(但更好)

编辑二
一个建议是用于MTAudioProcessingTap获取原始音频数据.我可以使用[[[_player currentItem] asset] tracks]数组找到的例子,在我的例子中,是一个空数组.另一个建议是使用[[_player currentItem] audioMix]哪个null适合我.
编辑III
经过多年,似乎仍然没有解决方案.我确实取得了进步,所以我正在分享它.
在设置过程中,我正在向playerItem添加一个键值观察器:
[[[self player] currentItem] addObserver:self forKeyPath:@"tracks" options:kNilOptions context:NULL];
//////////////////////////////////////////////////////
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)changecontext:(void *)context
if ([keyPath isEqualToString:@"tracks"] && [[object tracks] count] > 0) {
for (AVPlayerItemTrack *itemTrack in [object tracks]) {
AVAssetTrack *track = [itemTrack assetTrack];
if ([[track mediaType] isEqualToString:AVMediaTypeAudio]) {
[self addAudioProcessingTap:track];
break;
}
}
}
- …Run Code Online (Sandbox Code Playgroud) 我正在开发一个需要使用AVFoundation框架播放声音的iOS应用程序.Xcode 4中的工作区结构包含两个项目:
构建实用程序库之后,它会生成一个静态库,该库在主应用程序中用作框架.
因此,当尝试使用下面的代码在主应用程序内播放声音时,它会按预期工作.
NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
NSString *path = [NSString stringWithFormat:@"%@/sound.mp3", resourcePath];
NSURL *url = [NSURL fileURLWithPath:path];
NSError *error = nil;
AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url
error:&error];
[audioPlayer play];
Run Code Online (Sandbox Code Playgroud)
相反,当尝试使用与上面相同的代码在实用程序库中播放完全相同的声音(或任何其他声音)时,即使错误为nil且audioPlayer属性值为正确,也不会播放任何声音(数字)频道,持续时间).
我确保AVFoundation框架在两个项目中.
此外,我的类使用AVAudioPlayerDelegate协议并实现这两个方法:
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag;
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error;
Run Code Online (Sandbox Code Playgroud)
尝试播放声音后,这些方法都不会被调用.
如果我使用AudioToolbox框架,那么它会播放声音.但AVFoundation由于几个原因,我对使用感兴趣.
怎么知道发生了什么?我错过了什么AVFoundation吗?它可能与AVAudioPlayer在静态库中使用有关吗?
提前致谢.
audio objective-c avfoundation xcode4 automatic-ref-counting
我想将fMP4片段转换为TS段(用于HLS),因为片段是在iOS设备上使用FFmpeg编写的.
我正在尝试在iOS上实现实时上传,同时在本地保持无缝的高清副本.
滚动AVAssetWriters,每次写入8秒,然后通过FFmpeg连接MP4.
出了什么问题 - 音频和视频有时会出现问题.我已经确定了3个原因.
1)为AAC编码器写入的音频启动帧,从而产生间隙.
2)由于视频帧长33.33ms,音频帧长0.022ms,因此它们可能不在文件末尾排队.
3)Mac OS上缺少帧精确编码,但iOS 详细信息不适用于此
FFmpeg将具有原始音频的大视频MP4文件复用到TS段中.这项工作基于Kickflip SDK
什么是错的 - 每隔一段时间,只有一个音频文件会上传,没有任何视频.永远不能在内部重现它,但当他们没有记录他们认为他们做的事情时,它对我们的用户来说非常令人沮丧.在最后一段上也存在准确搜索的问题,几乎就像TS段的时间戳错误一样.
苹果公司今年(2016年)正在WWDC推动fMP4,在此之前我还没有对它进行太多调查.由于fMP4文件可以在写入时读取和播放,我认为FFmpeg也可以在写入时对文件进行转码,只要我们阻止将字节发送到FFmpeg直到每个片段内文件完成了.
但是,我对FFmpeg C API并不熟悉,我只是在尝试#2中简单地使用它.
AVFoundation已经完成在文件中写一个片段,以便我可以将它管道输入FFmpeg?我有一个应用程序,允许用户录制视频,UIImagePickerController然后将其上传到YouTube.问题是UIImagePickerController创建的视频文件是巨大的,即使视频只有5秒长.例如,5秒长的视频是16-20兆字节.我想保持540或720质量的视频,但我想减少文件大小.
我一直在尝试AVFoundation并AVAssetExportSession试图获得更小的文件大小.我试过以下代码:
AVAsset *video = [AVAsset assetWithURL:videoURL];
AVAssetExportSession *exportSession = [AVAssetExportSession exportSessionWithAsset:video presetName:AVAssetExportPresetPassthrough];
exportSession.shouldOptimizeForNetworkUse = YES;
exportSession.outputFileType = AVFileTypeMPEG4;
exportSession.outputURL = [pathToSavedVideosDirectory URLByAppendingPathComponent:@"vid1.mp4"];
[exportSession exportAsynchronouslyWithCompletionHandler:^{
NSLog(@"done processing video!");
}];
Run Code Online (Sandbox Code Playgroud)
但这并没有减少文件大小.我知道我正在做的事情是可能的,因为在Apple的照片应用程序中,当您选择"在YouTube上分享"时,会自动处理视频文件,因此它的小到可以上传.我想在我的应用程序中做同样的事情.
我怎么能做到这一点?
我的应用只是风景.我将这样呈现AVCaptureVideoPreviewLayer:
self.previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
[self.previewLayer setBackgroundColor:[[UIColor blackColor] CGColor]];
[self.previewLayer setVideoGravity:AVLayerVideoGravityResizeAspect];
NSLog(@"previewView: %@", self.previewView);
CALayer *rootLayer = [self.previewView layer];
[rootLayer setMasksToBounds:YES];
[self.previewLayer setFrame:[rootLayer bounds]];
NSLog(@"previewlayer: %f, %f, %f, %f", self.previewLayer.frame.origin.x, self.previewLayer.frame.origin.y, self.previewLayer.frame.size.width, self.previewLayer.frame.size.height);
[rootLayer addSublayer:self.previewLayer];
[session startRunning];
Run Code Online (Sandbox Code Playgroud)
self.previewView的框架为(0,0,568,320),这是正确的.self.previewLayer记录一个(0,0,568,320)的帧,这在理论上是正确的.但是,相机显示在横向屏幕中间显示为纵向矩形,并且相机预览图像的方向错误90度.我究竟做错了什么?我需要相机预览层出现在全屏幕,在横向模式下,图像应正确导向.
我正在开发一个有集合视图的应用程序,集合视图的单元格可以包含视频.现在我正在用AVPlayer和显示视频AVPlayerLayer.不幸的是,滚动性能很糟糕.看起来AVPlayer,AVPlayerItem和AVPlayerLayer做了很多工作的主线上.他们不断拿出锁,等待信号量等,这阻碍了主线程并导致严重的帧丢失.
有没有办法告诉AVPlayer停止在主线程上做这么多事情?到目前为止,我所尝试的一切都没有解决问题.
我也试过使用构建一个简单的视频播放器AVSampleBufferDisplayLayer.使用它我可以确保一切都发生在主线程之外,我可以在滚动和播放视频时达到~60fps.不幸的是,这种方法的级别要低得多,而且它不提供开箱即用的音频播放和时间擦除等功能.有没有办法获得类似的表现AVPlayer?我更愿意使用它.
编辑:
在进一步研究之后,看起来在使用时可能无法实现良好的滚动性能AVPlayer.创建一个AVPlayer并与一个AVPlayerItem实例关联开始了一大堆蹦床到主线程的工作,然后它在信号量上等待并尝试获取一堆锁.随着滚动视图中视频数量的增加,停止主线程的时间量会急剧增加.
AVPlayerdealloc似乎也是一个巨大的问题.Dealloc'ing an AVPlayer也尝试同步一堆东西.再次,当你创造更多的球员时,这会非常糟糕.
这非常令人沮丧,它AVPlayer几乎无法用于我正在尝试的事情.阻止像这样的主线程这样做是一件非常业余的事情,很难相信苹果工程师会犯这种错误.无论如何,希望他们能尽快解决这个问题.
当通过AVAssetImageGenerator获取视频的UIImage时,当视频以纵向方向拍摄时,我会返回旋转的图像(技术上它们不是).如何判断视频的拍摄方向,然后正确旋转图像?
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil];
AVAssetImageGenerator *generate = [[AVAssetImageGenerator alloc] initWithAsset:asset];
NSError *err = NULL;
CMTime time = CMTimeMake(0, 60);
CGImageRef imgRef = [generate copyCGImageAtTime:time actualTime:NULL error:&err];
[generate release];
UIImage *currentImg = [[UIImage alloc] initWithCGImage:imgRef];
Run Code Online (Sandbox Code Playgroud) 要在静音模式下播放声音我使用以下方法.但它是如何不起作用的.
// Works on Swift 3
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
} catch {
print(error)
}
Run Code Online (Sandbox Code Playgroud)
如何让它在4.2/iOS 12中运行?
在较新的版本中,我们需要设置模式和选项.
try AVAudioSession.sharedInstance().setCategory(
<#T##category:AVAudioSession.Category##AVAudioSession.Category#>,
mode: <#T##AVAudioSession.Mode#>,
options: <#T##AVAudioSession.CategoryOptions#>)`
Run Code Online (Sandbox Code Playgroud) avfoundation ×10
ios ×7
objective-c ×4
avplayer ×3
iphone ×3
video ×2
audio ×1
avcapture ×1
ffmpeg ×1
file-upload ×1
fmp4 ×1
ios4 ×1
media-player ×1
orientation ×1
swift ×1
xcode4 ×1