- 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/
最近,开始注意到从照片库导入某些 Assets 时未显示它们。有问题的 Assets 存储在 iCloud 中,不会缓存在设备上。 我相信这是 iOS 14 的问题,因为我从未在 iOS 13 上遇到
有没有办法将数据转换为 AVAsset/AVURLAsset 或更好的 AVPlayerItem? 我找到了一个将 Data 转换为 PHAsset 并需要先将其保存到桌面的答案。 有没有更好的办法?
我有一个适用于 iOS6 及更高版本的音乐播放器应用程序。我的音乐播放器工作正常,它可以在线(流媒体)和离线(本地 mp3 文件)播放音乐。 当我将蓝牙耳机连接到我的设备(iPad 或 iPhone)
给定从 Assets 读取的 CMSampleBuffers 列表,我想调整 Assets 的持续时间,使其长度为原始 Assets 的一半(速度的两倍)。 目前我用于生成新时间戳的函数如下所示: f
我在我的应用程序中使用 AVAsset 并遇到了下一个问题。当我写这样的东西时: AVAsset *audioAsset = [AVAsset assetWithURL:[NSURL fileURLW
我正在我的应用程序中下载和缓存(使用 https://github.com/vdugnist/DVAssetLoaderDelegate )视频。当应用程序启动时,我检查下载的文件,如果它存在,我用本
我想创建像视频 View 一样的照片,在页脚中会有一秒的视频帧。 为此我正在使用这段代码 var imgs : [UIImage] = [] let assetImgGenerate : AVAsse
我有一些简单的 AVFoundation 代码可以将一堆四秒长的 mp4 文件连接在一起,如下所示: func compose(parts inParts: [Part], progress inPr
我已经尝试了很多东西,我也浏览了互联网,但我找不到解决以下问题的方法。Xcode 向我显示此错误: Use of unresolved identifier 'AVAsset' 即使我已经导入了 AV
NSURL* fileURL=[_musicListViewModel fileURLWithModel:model]; NSData* assetData=[NSData dataWithConte
我只想使用 native API(UIKit、AVFoundation、Core Image 等)来过滤 AVAsset,同时在 AVPlayerLayer 或等效的 UI 组件中显示它。我不会使用
我在 Mac 播放器中有视频,视频时长为 31 秒。当我在我的应用程序中使用它并加载该文件时,AVAsset 的持续时间为“28.03”。 AVAsset *videoAsset = [AVAsset
本质上,我希望连接 AVAsset 文件。我大致知道该怎么做,但我正在努力加载音频文件。 我可以使用 AVAudioPlayer 播放文件,我可以通过我的终端在目录中看到它们,但是当我尝试使用 AVA
我正在尝试使用 AVFoundation 一起编辑视频和图像。然而,AVAsset 似乎无法从图像文件创建?有人给我一些建议吗? 最佳答案 好的,我很确定 AVAsset 是为媒体准备的,所以 AVA
我正在处理一个需要对大量短(1-5 秒)进行排序的项目(问题在 n = 30 或更少时可见)AVAsset s。我能找到的所有引用资料和示例项目都指向使用范围 CMTimeRange(start: .
我想使用AVAssetExportSession合成两个音频。当我使用AVAsset来通过'tracksWithMediaType:AVMediaTypeAudio'进行跟踪时,我得到了一个空数组。
我正在开发一个播放视频并允许用户在视频中向前和向后滑动的应用程序。擦洗必须顺利进行,所以我们总是用 SDAVAssetExportSession 重写视频具有视频压缩属性 AVVideoMaxKeyF
我有兴趣获取 AVAsset 的资源名称(又名文件名) ,特别是mp4视频。 Assets 是使用资源名称创建的,我只是想在将来只有 AVAsset 时获得相同的字符串资源实例。在这种情况下,我怎样才
我正在尝试根据声音文件渲染音频波形。我找到了很多教程来展示如何做到这一点,但我没有找到太多涵盖 AVAsset 的文档。 .我查看了苹果文档,但我发现它有点含糊。 我真的很想了解基础知识而不是跳来跳去
当应用程序进入后台时,我的[AVAssetWriter startWriting]被调用,并且由于以下错误而失败: Error Domain = AVFoundationErrorDomain代码=
我是一名优秀的程序员,十分优秀!