赖永胜 發表於 2025-5-20 08:26:47

在iOS中截取和分割音视频的代码示例

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>核心思路</li><li>视频截取示例(Objective-C)</li><ul class="second_class_ul"><li>使用方法</li></ul><li>音频截取示例(Objective-C)</li><ul class="second_class_ul"><li>使用方法</li></ul><li>注意事项</li><ul class="second_class_ul"></ul><li>扩展建议</li><ul class="second_class_ul"></ul><li>总结</li><ul class="second_class_ul"></ul></ul></div><p class="maodian"></p><h2>核心思路</h2>
<p>截取或分割音视频的核心步骤如下:</p>
<ul><li><strong>加载原始音视频文件</strong>(<code>AVURLAsset</code>)</li><li><strong>设置时间范围</strong>(<code>CMTimeRange</code>)指定要截取的起始时间与持续时间</li><li><strong>创建导出会话</strong>(<code>AVAssetExportSession</code>)</li><li><strong>导出目标文件</strong>(支持 <code>.mp4</code>、<code>.m4a</code> 等格式)</li><li><strong>处理异步导出完成回调</strong></li></ul>
<p class="maodian"></p><h2>视频截取示例(Objective-C)</h2>
<div class="jb51code"><pre class="brush:java;">- (void)trimVideoFromURL:(NSURL *)inputURL startTime:(NSTimeInterval)startTime duration:(NSTimeInterval)duration completion:(void (^)(NSURL *outputURL, NSError *error))completion {
    AVURLAsset *asset = ;
   
    // 1. 创建导出会话
    AVAssetExportSession *exportSession = [ initWithAsset:asset presetName:AVAssetExportPresetHighestQuality];
   
    // 2. 设置输出路径和文件格式
    NSString *outputPath = ;
    exportSession.outputURL = ;
    exportSession.outputFileType = AVFileTypeMPEG4;
   
    // 3. 设置时间范围(start ~ start + duration)
    CMTime startCMTime = CMTimeMakeWithSeconds(startTime, 600);
    CMTime durationCMTime = CMTimeMakeWithSeconds(duration, 600);
    CMTimeRange timeRange = CMTimeRangeMake(startCMTime, durationCMTime);
    exportSession.timeRange = timeRange;
   
    // 4. 异步导出
    [exportSession exportAsynchronouslyWithCompletionHandler:^{
      if (exportSession.status == AVAssetExportSessionStatusCompleted) {
            NSLog(@"视频截取成功: %@", outputPath);
            if (completion) completion(, nil);
      } else {
            NSError *error = exportSession.error;
            NSLog(@"视频截取失败: %@", error.localizedDescription);
            if (completion) completion(nil, error);
      }
    }];
}
</pre></div>
<p class="maodian"></p><p class="maodian"></p><h3>使用方法</h3>
<div class="jb51code"><pre class="brush:java;">NSURL *videoURL = pathForResource:@"myVideo" ofType:@"mp4"]];
[self trimVideoFromURL:videoURL startTime:5.0 duration:10.0 completion:^(NSURL *outputURL, NSError *error) {
    if (outputURL) {
      NSLog(@"截取后的视频路径: %@", outputURL.path);
    }
}];
</pre></div>
<p class="maodian"></p><h2>音频截取示例(Objective-C)</h2>
<div class="jb51code"><pre class="brush:java;">- (void)trimAudioFromURL:(NSURL *)inputURL startTime:(NSTimeInterval)startTime duration:(NSTimeInterval)duration completion:(void (^)(NSURL *outputURL, NSError *error))completion {
    AVURLAsset *asset = ;
   
    AVAssetExportSession *exportSession = [ initWithAsset:asset presetName:AVAssetExportPresetAppleM4A];
   
    NSString *outputPath = ;
    exportSession.outputURL = ;
    exportSession.outputFileType = AVFileTypeAppleM4A;
   
    CMTime startCMTime = CMTimeMakeWithSeconds(startTime, 600);
    CMTime durationCMTime = CMTimeMakeWithSeconds(duration, 600);
    CMTimeRange timeRange = CMTimeRangeMake(startCMTime, durationCMTime);
    exportSession.timeRange = timeRange;
   
    [exportSession exportAsynchronouslyWithCompletionHandler:^{
      if (exportSession.status == AVAssetExportSessionStatusCompleted) {
            NSLog(@"音频截取成功: %@", outputPath);
            if (completion) completion(, nil);
      } else {
            NSError *error = exportSession.error;
            NSLog(@"音频截取失败: %@", error.localizedDescription);
            if (completion) completion(nil, error);
      }
    }];
}
</pre></div>
<h3>使用方法</h3>
<div class="jb51code"><pre class="brush:java;">NSURL *audioURL = pathForResource:@"myAudio" ofType:@"mp3"]];
[self trimAudioFromURL:audioURL startTime:3.0 duration:5.0 completion:^(NSURL *outputURL, NSError *error) {
    if (outputURL) {
      NSLog(@"截取后的音频路径: %@", outputURL.path);
    }
}];
</pre></div>
<p class="maodian"></p><h2>注意事项</h2>
<table><tbody><tr><th>项目</th><th>说明</th></tr><tr><td><strong>时间单位</strong></td><td>使用 <code>CMTimeMakeWithSeconds</code> 将秒数转换为 <code>CMTime</code></td></tr><tr><td><strong>输出路径</strong></td><td>使用 <code>NSTemporaryDirectory()</code> 可避免存储问题</td></tr><tr><td><strong>输出格式</strong></td><td>视频推荐 <code>.mp4</code>,音频推荐 <code>.m4a</code> 或 <code>.caf</code></td></tr><tr><td><strong>导出性能</strong></td><td>使用 <code>AVAssetExportPresetLowQuality</code> 可提升处理速度</td></tr><tr><td><strong>错误处理</strong></td><td>检查 <code>exportSession.status</code> 和 <code>exportSession.error</code></td></tr></tbody></table>
<p class="maodian"></p><h2>扩展建议</h2>
<ul><li><strong>多片段拼接</strong>:可结合 <code>AVMutableComposition</code> 实现多段裁剪后的内容拼接。</li><li><strong>后台导出</strong>:大文件建议在后台线程执行,避免阻塞主线程。</li><li><strong>第三方库</strong>:如需更复杂剪辑功能,可使用 <strong>FFmpeg-iOS</strong> 或 <strong>GPUImage</strong>。</li></ul>
<p class="maodian"></p><h2>总结</h2>
<p>通过 <code>AVAssetExportSession</code> 的 <code>timeRange</code> 属性,你可以轻松地从音视频文件中截取任意时间段的内容。这个方法既适用于音频也适用于视频,具有良好的兼容性和性能表现,是 iOS 音视频处理中的基础技能之一。</p>
<p>以上就是在iOS中截取和分割音视频的代码示例的详细内容,更多关于iOS截取和分割音视频的资料请关注琼殿技术社区其它相关文章!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>iOS中实现音视频合并的完整代码</li><li>iOS仿抖音视频加载动画效果的实现方法</li><li>iOS实现视频边播放边缓存的解决方案</li><li>iOS中tableView cell分割线的一些设置技巧</li><li>IOS 基础之设置 tableview 的分割线</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: 在iOS中截取和分割音视频的代码示例