我有以下代码,适用于iOS 6和7.x。
在iOS 8.1中,我有一个奇怪的问题,如果你捕获大约13秒或更长时间的会话,则生成的AVAsset只有一个轨道(视频),音频轨道不存在。
如果您录制较短的时间,AVAsset将如预期一样具有2个轨道(视频和音频)。我有足够的磁盘空间,应用程序已被授予使用相机和麦克风的权限。
我创建了一个具有最少代码的新项目,它重现了这个问题。
非常感谢任何想法。
在iOS 8.1中,我有一个奇怪的问题,如果你捕获大约13秒或更长时间的会话,则生成的AVAsset只有一个轨道(视频),音频轨道不存在。
如果您录制较短的时间,AVAsset将如预期一样具有2个轨道(视频和音频)。我有足够的磁盘空间,应用程序已被授予使用相机和麦克风的权限。
我创建了一个具有最少代码的新项目,它重现了这个问题。
非常感谢任何想法。
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
{
enum RecordingState { Recording, Stopped };
enum RecordingState recordingState;
AVCaptureSession *session;
AVCaptureMovieFileOutput *output;
AVPlayer *player;
AVPlayerLayer *playerLayer;
bool audioGranted;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self setupAV];
recordingState = Stopped;
}
-(void)setupAV
{
session = [[AVCaptureSession alloc] init];
[session beginConfiguration];
AVCaptureDevice *videoDevice = nil;
for ( AVCaptureDevice *device in [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo] ) {
if ( device.position == AVCaptureDevicePositionBack ) {
videoDevice = device;
break;
}
}
AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
if (videoDevice && audioDevice)
{
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:nil];
[session addInput:input];
AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:nil];
[session addInput:audioInput];
NSURL *recordURL = [self tempUrlForRecording];
[[NSFileManager defaultManager] removeItemAtURL:recordURL error:nil];
output= [[AVCaptureMovieFileOutput alloc] init];
output.maxRecordedDuration = CMTimeMake(45, 1);
output.maxRecordedFileSize = 1028 * 1028 * 1000;
[session addOutput:output];
}
[session commitConfiguration];
}
- (IBAction)recordingButtonClicked:(id)sender {
if(recordingState == Stopped)
{
[self startRecording];
}
else
{
[self stopRecording];
}
}
-(void)startRecording
{
recordingState = Recording;
[session startRunning];
[output startRecordingToOutputFileURL:[self tempUrlForRecording] recordingDelegate:self];
}
-(void)stopRecording
{
recordingState = Stopped;
[output stopRecording];
[session stopRunning];
}
- (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error
{
AVAsset *cameraInput = [AVAsset assetWithURL:[self tempUrlForRecording]];
//DEPENDING ON HOW LONG RECORDED THIS DIFFERS (<14 SECS - 2 Tracks, >14 SECS - 1 Track)
NSLog(@"Number of tracks: %i", cameraInput.tracks.count);
}
-(id)tempUrlForRecording
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectoryPath = [paths objectAtIndex:0];
NSString *path = @"camerabuffer.mp4";
NSString *pathCameraInput =[documentsDirectoryPath stringByAppendingPathComponent: path];
NSURL *urlCameraInput = [NSURL fileURLWithPath:pathCameraInput];
return urlCameraInput;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
CMTime fragmentInterval = CMTimeMake(5,1); [movieOutput setMovieFragmentInterval:fragmentInterval];
- Si-NmaxRecordedDuration
并在 45 秒后手动停止录制,会发生什么? - Ja͢ckffmpeg
转码流并明确设置音量(即ffmpeg -i movie.mp4 -vol 256 movie2.mp4
),您可以恢复声音。 - mvds