私は、以前に録音したオーディオファイル(.caf)をトリミングする機能を実装したいと考えています。録音部分はすでに機能していますが、Voicememosアプリのトリミング機能に似たトリミング機能を追加するにはどうすればいいですか?リンゴを使用するオーディオトリマー用のAPIはありますか? どんな助けでも大丈夫です...iOSでオーディオをトリム
8
A
答えて
20
AVFoundationの使用はどうですか?オーディオファイルをAVAsset(コンポジションなど)にインポートし、優先時間+期間の設定をファイルにエクスポートすることができます。
しばらく前にアセットをファイルに書き出す在庫機能を書きましたが、audiomixを指定することもできます。下のように、すべてのファイルをエクスポートしますが、exporter.timeRangeにNSTimeRangeを追加してそこに追加することもできます。私はそれをテストしていませんが、動作する必要があります(?)。もう1つの選択肢は、AVAsset +トラックを作成するときの時間範囲を調整することです。もちろん、輸出業者はm4a(AAC)のみを扱います。申し訳ありませんが、これはあなたが望むものではなかった場合。
-(void)exportAsset:(AVAsset*)asset toFile:(NSString*)filename overwrite:(BOOL)overwrite withMix:(AVAudioMix*)mix {
//NSArray* availablePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:asset];
AVAssetExportSession* exporter = [AVAssetExportSession exportSessionWithAsset:asset presetName:AVAssetExportPresetAppleM4A];
if (exporter == nil) {
DLog(@"Failed creating exporter!");
return;
}
DLog(@"Created exporter! %@", exporter);
// Set output file type
DLog(@"Supported file types: %@", exporter.supportedFileTypes);
for (NSString* filetype in exporter.supportedFileTypes) {
if ([filetype isEqualToString:AVFileTypeAppleM4A]) {
exporter.outputFileType = AVFileTypeAppleM4A;
break;
}
}
if (exporter.outputFileType == nil) {
DLog(@"Needed output file type not found? (%@)", AVFileTypeAppleM4A);
return;
}
// Set outputURL
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* parentDir = [NSString stringWithFormat:@"%@/", [paths objectAtIndex:0]];
NSString* outPath = [NSString stringWithFormat:@"%@%@", parentDir, filename];
NSFileManager* manager = [NSFileManager defaultManager];
if ([manager fileExistsAtPath:outPath]) {
DLog(@"%@ already exists!", outPath);
if (!overwrite) {
DLog(@"Not overwriting, uh oh!");
return;
}
else {
// Overwrite
DLog(@"Overwrite! (delete first)");
NSError* error = nil;
if (![manager removeItemAtPath:outPath error:&error]) {
DLog(@"Failed removing %@, error: %@", outPath, error.description);
return;
}
else {
DLog(@"Removed %@", outPath);
}
}
}
NSURL* const outUrl = [NSURL fileURLWithPath:outPath];
exporter.outputURL = outUrl;
// Specify a time range in case only part of file should be exported
//exporter.timeRange =
if (mix != nil)
exporter.audioMix = mix; // important
DLog(@"Starting export! (%@)", exporter.outputURL);
[exporter exportAsynchronouslyWithCompletionHandler:^(void) {
// Export ended for some reason. Check in status
NSString* message;
switch (exporter.status) {
case AVAssetExportSessionStatusFailed:
message = [NSString stringWithFormat:@"Export failed. Error: %@", exporter.error.description];
DLog(@"%@", message);
[self showAlert:message];
break;
case AVAssetExportSessionStatusCompleted: {
/*if (playfileWhenExportFinished) {
DLog(@"playfileWhenExportFinished!");
[self playfileAfterExport:exporter.outputURL];
playfileWhenExportFinished = NO;
}*/
message = [NSString stringWithFormat:@"Export completed: %@", filename];
DLog(@"%@", message);
[self showAlert:message];
break;
}
case AVAssetExportSessionStatusCancelled:
message = [NSString stringWithFormat:@"Export cancelled!"];
DLog(@"%@", message);
[self showAlert:message];
break;
default:
DLog(@"Export unhandled status: %d", exporter.status);
break;
}
}];
}
1
@ジョニーの上記の答えは正しいです。ここでは、オーディオトリミング中にフェードイン効果を追加するためにAudioMixerの使用を追加します。
出力:オーディオ資産は10秒フェードで20秒にトリミング コードスニペットで設定されているトリムは、資産の30秒 マークで行われ、したがって、トラック期間はであるべき少なくとも 50秒。
- (BOOL)exportAssettoFilePath:(NSString *)filePath {
NSString *inputFilePath = <inputFilePath>;
NSURL *videoToTrimURL = [NSURL fileURLWithPath:inputFilePath];
AVAsset *avAsset = [AVAsset assetWithURL:videoToTrimURL];
// we need the audio asset to be at least 50 seconds long for this snippet
CMTime assetTime = [avAsset duration];
Float64 duration = CMTimeGetSeconds(assetTime);
if (duration < 50.0) return NO;
// get the first audio track
NSArray *tracks = [avAsset tracksWithMediaType:AVMediaTypeAudio];
if ([tracks count] == 0) return NO;
AVAssetTrack *track = [tracks objectAtIndex:0];
// create the export session
// no need for a retain here, the session will be retained by the
// completion handler since it is referenced there
AVAssetExportSession *exportSession = [AVAssetExportSession
exportSessionWithAsset:avAsset
presetName:AVAssetExportPresetAppleM4A];
if (nil == exportSession) return NO;
// create trim time range - 20 seconds starting from 30 seconds into the asset
CMTime startTime = CMTimeMake(30, 1);
CMTime stopTime = CMTimeMake(50, 1);
CMTimeRange exportTimeRange = CMTimeRangeFromTimeToTime(startTime, stopTime);
// create fade in time range - 10 seconds starting at the beginning of trimmed asset
CMTime startFadeInTime = startTime;
CMTime endFadeInTime = CMTimeMake(40, 1);
CMTimeRange fadeInTimeRange = CMTimeRangeFromTimeToTime(startFadeInTime,
endFadeInTime);
// setup audio mix
AVMutableAudioMix *exportAudioMix = [AVMutableAudioMix audioMix];
AVMutableAudioMixInputParameters *exportAudioMixInputParameters =
[AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:track];
[exportAudioMixInputParameters setVolumeRampFromStartVolume:0.0 toEndVolume:1.0
timeRange:fadeInTimeRange];
exportAudioMix.inputParameters = [NSArray
arrayWithObject:exportAudioMixInputParameters];
// configure export session output with all our parameters
exportSession.outputURL = [NSURL fileURLWithPath:filePath]; // output path
exportSession.outputFileType = AVFileTypeAppleM4A; // output file type
exportSession.timeRange = exportTimeRange; // trim time range
//exportSession.audioMix = exportAudioMix; // fade in audio mix
// perform the export
[exportSession exportAsynchronouslyWithCompletionHandler:^{
if (AVAssetExportSessionStatusCompleted == exportSession.status) {
NSLog(@"AVAssetExportSessionStatusCompleted");
} else if (AVAssetExportSessionStatusFailed == exportSession.status) {
// a failure may happen because of an event out of your control
// for example, an interruption like a phone call comming in
// make sure and handle this case appropriately
NSLog(@"AVAssetExportSessionStatusFailed");
} else {
NSLog(@"Export Session Status: %ld", (long)exportSession.status);
}
}];
return YES;}
詳細をありがとう
:
https://developer.apple.com/library/ios/qa/qa1730/_index.html
関連する問題
- 1. 録音オーディオiOS
- 2. iOS:サイレントモードでオーディオを再生する
- 3. iOSのコントロールでオーディオを再生する
- 4. iOS:オーディオ録音ファイル形式
- 5. オーディオ輸出は、iOSスウィフトが
- 6. iOS 5のオーディオ出力キュー
- 7. オーディオ値の再生バッファ - iOS
- 8. iOSのバックグラウンドアプリでの(オーディオ)ストリームのキャプチャ
- 9. iOSでオーディオ出力を取得できません
- 10. デバイス(iOS)でオーディオを再生できません
- 11. Trigger.ioでiOSで背景のオーディオを再生するには?
- 12. 2つ以上のiosデバイスでオーディオを同期する方法
- 13. iOSでファイル形式(オーディオまたはビデオ)を取得する
- 14. 明示的なループインポイントとループアウトポイントを持つiOSでのオーディオのループ
- 15. iOSでHDMIオーディオを読む方法はありますか?
- 16. SQLトリムの問題
- 17. PHPトリム文字列
- 18. トリム番号機能
- 19. SQL Serverトリム機能
- 20. トリムを使ったmysql concat
- 21. ; cookie値でasp.netのクッキーをトリム
- 22. iOSでコードネーム1のオーディオ再生がクラッシュする
- 23. AVPlayerでオーディオが再生されない - iOS 9、目的 - C
- 24. iOSでオーディオが再生されないCordova Phonegap app
- 25. SSIS:スクリプトコンポーネントのトリムを除いていくつかの列をトリムする:::::
- 26. オーディオを録音し、iOS 8/9のUIWebView(JavascriptCore)にデータを渡す
- 27. PhoneGapを使用してiOSのドキュメントフォルダにオーディオを録音する
- 28. iOSのAVPlayerを使用してオーディオをバッファする方法は?
- 29. トリムがIE7で動作しません
- 30. トリム/ winsorized標準偏差
しかし、このアプローチは、どのような、音がM4A形式で保存することができますもしmp3やcafファイルをトリミングしてfo rmat? – tommys
m3aフォーマットで保存されたmp3もトリムされます 2年後、あなたはまだ私の人生を保存します:) –