- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试从 .mp4
视频文件中提取音轨,并使用 使用此
类outputSettings
转换为 .m4a
音频文件AVAssetWriter
AudioChannelLayout channelLayout;
memset(&channelLayout, 0, sizeof(AudioChannelLayout));
channelLayout.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo;
NSDictionary *outputSettings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey,
[NSNumber numberWithFloat:44100.0], AVSampleRateKey,
[NSNumber numberWithInt:2], AVNumberOfChannelsKey,
[NSNumber numberWithInt:128000], AVEncoderBitRateKey, // 128 kbps
[NSData dataWithBytes:&channelLayout length:sizeof(AudioChannelLayout)], AVChannelLayoutKey,
nil];
案例 1: 带有音轨参数的 .mp4 视频文件(使用 CMFormatDescriptionRef
打印):
mediaType:'soun'
mediaSubType:'aac '
mSampleRate: 44100.000000
mFormatID: 'aac '
mChannelsPerFrame: 2
ACL: {Stereo (L R)}
结果:成功创建具有已定义输出参数的.m4a
输出文件
案例 2: 带有音轨参数的 .mp4 视频文件(使用 CMFormatDescriptionRef
打印):
mediaType:'soun'
mediaSubType:'aac '
mSampleRate: 48000.000000
mFormatID: 'aac '
mChannelsPerFrame: 6
ACL: {5.1 (C L R Ls Rs LFE)}
结果转换失败,当添加示例缓冲区[AVAssetWriter appendSampleBuffer: ...]
时出现未知错误
:
Error Domain: NSOSStatusErrorDomain
code: -12780
description: The operation could not be completed
为了将视频转换为音频,我使用了此处描述的相同算法:https://github.com/rs/SDAVAssetExportSession/blob/master/SDAVAssetExportSession.m
我还尝试使用 kAudioChannelLayoutTag_MPEG_5_1_D
设置 channelLayout.mChannelLayoutTag
,并使用 6
值更新 AVNumberOfChannelsKey
,但是它对我不起作用。
任何人都可以帮助我理解我做错了什么吗?可能没有仅使用 iOS AVFoundation 框架来执行此任务的解决方案吗?我应该为 5.1 aac 6 声道的音轨使用不同的 outputParams
吗?
最佳答案
我还没有尝试过使用 5.1 音频,但是当从视频中提取音频时,我喜欢在纯音频 AVMutableComposition
上使用直通 AVAssetExportSession
,因为这样可以避免转码这会很慢并且会降低音频质量。像这样的东西:
AVMutableComposition* newAudioAsset = [AVMutableComposition composition];
AVMutableCompositionTrack* dstCompositionTrack;
dstCompositionTrack = [newAudioAsset addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
AVAsset* srcAsset = [AVURLAsset URLAssetWithURL:srcURL options:nil];
AVAssetTrack* srcTrack = [[srcAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
CMTimeRange timeRange = srcTrack.timeRange;//CMTimeRangeMake(kCMTimeZero, srcAsset.duration);
NSError* error;
if(NO == [dstCompositionTrack insertTimeRange:timeRange ofTrack:srcTrack atTime:kCMTimeZero error:&error]) {
NSLog(@"track insert failed: %@\n", error);
return 1;
}
__block AVAssetExportSession* exportSesh = [[AVAssetExportSession alloc] initWithAsset:newAudioAsset presetName:AVAssetExportPresetPassthrough];
exportSesh.outputFileType = AVFileTypeAppleM4A;
exportSesh.outputURL = dstURL;
[exportSesh exportAsynchronouslyWithCompletionHandler:^{
AVAssetExportSessionStatus status = exportSesh.status;
NSLog(@"exportAsynchronouslyWithCompletionHandler: %i\n", status);
if(AVAssetExportSessionStatusFailed == status) {
NSLog(@"FAILURE: %@\n", exportSesh.error);
} else if(AVAssetExportSessionStatusCompleted == status) {
NSLog(@"SUCCESS!\n");
}
}];
我手头没有任何 5.1 文件,所以如果这不起作用,您可能需要更仔细地查看该行
AVAssetTrack* srcTrack = [[srcAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
附注这段 2012 年的代码“刚刚好用”,这很好。
关于ios - AVAssetWriter 从 AVAsset 转换 aac 5.1 音轨在 appendSampleBuffer 上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46669257/
我正在使用 LLSimpleCamera 录制视频。我用后置摄像头录制的很好,但是当我切换到前置摄像头时,应用程序崩溃,报告的错误是 * Terminating app due to uncaught
我正在尝试使用 AVAssetWriter 进行屏幕录制,它也接受音频输入。但是,我一直坚持这个错误,在 appendSampleBuffer: (在 encodeAudioFrame: 内)几次调用
从 iOS 12.4 beta 版本开始,在 AVAssetWriterInput 上调用 appendSampleBuffer 会记录以下错误: CMSampleBufferGetSampleSiz
AVAssetWriterInput appendSampleBuffer 我有一个奇怪的内存“泄漏”。我同时编写视频和音频,所以我有一个带有两个输入的 AVAssetWriter,一个用于视频,一个
我正在尝试将 CMSampleBufferRefs 附加到 AVAssetWriterInput,但我一直遇到错误崩溃: [AVAssetWriterInput appendSampleBuffer:
我正在尝试从 .mp4 视频文件中提取音轨,并使用 使用此 outputSettings 转换为 .m4a 音频文件AVAssetWriter 类 AudioChannelLayout channel
我是一名优秀的程序员,十分优秀!