65.9K
CodeProject 正在变化。 阅读更多。
Home

复制 AVI 块的一个周期

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.89/5 (5投票s)

2006年5月23日

1分钟阅读

viewsIcon

43088

downloadIcon

757

如何通过复制数据块来复制一段 AVI 视频。

引言

通常,我们有两种方法来复制一段 AVI 视频。

  • 使用 AVIStreamGetFrameAVIStreamWriteData。这种方法的缺点是它会花费很长时间并生成一个非常大的输出文件(未压缩),尤其是在复制较长的一段时。
  • 使用 EditStreamCopyEditStreamPaste。这可以让用户选择一个编码器,并使用该编码器压缩输出文件。尽管如此,输出文件总是大于输入文件的相同段的 10 倍以上,而且这也会花费很长时间。

如何复制 AVI 数据块

基本上,AVI 文件的格式应该如下所示

RIFF                   RIFF HEADER
|-AVI                  AVI CHUNK  
  |-hdrl               MAIN AVI HEADER
  | |- ......          OTHER HEADER INFORMATION
  |-movi               MOVIE DATA
  | |-chunk1           chunk data
  | |- ......          chunk data
  | |-chunkn           chunk data
  |-idx1               AVI INDEX
    |-[index data]     DATA

因此,我们可以通过以下步骤将特定时间段的数据块复制到输出文件

  • 复制头部。
  • 复制数据块。
  • 重建索引数据。
  • 更正头部的一些数据,例如文件长度和数据长度。

优点和缺点

这种方法可以运行得非常快,并且输出文件的大小与输入文件相对应。但缺点也很明显。这个类依赖于编解码器,可能对某些类型的 AVI 文件不起作用。

如何使用

使用这个类所需的唯一代码是
CCopyAVIChunk copier;
copier.CopyFile("C:\\tests\\test1.avi", "C:\\tests\\test2.avi", 123, 765);

注释

我将这个类用于某些项目,所以我只关心它是否能与“那些”类型的 AVI 文件一起工作。但我没有机会测试通用的 AVI 文件。如果您对这个类感兴趣并且发现它不起作用,请随时通过 yinglong_w@hotmail.com 与我联系。

版本历史

  • 版本 1.0 - 发布于 2006 年 5 月 23 日至 CodeProject。
© . All rights reserved.