ARRI阿莱MXF修复方法

ARRI阿莱是世界上知名的影视级产品供应商,其高清摄像机是国内外各种剧组的最爱。ARRI阿莱一般常见的视频格式是MOV,但是也有部分采用MXF结构的,最近我们连续处理了两个这方面的案例,全部都是正常拍摄,正常备份后发现文件无法打开。我们先来看看下边这个案例.

故障文件: ARRI专用MXF文件,大小35.1G

故障现象:

这个文件是众多素材中的一条,客户描述所有一切都是正常操作,结果发现此文件在达芬奇编辑软件中无法导入,直接了报错。

故障分析:

MXF类视频文件本来就是为了影视级而推出的,MXF是英文Material Exchange Format(素材交换格式)的缩语。MXF是SMPTE(美国电影与电视工程师学会)组织定义的一种专业音视频媒体文件格式。MXF主要应用于影视行业媒体制作、编辑、发行和存储等环节。目前索尼、佳能、松下一些日系品牌会在消费级产品中发布了MXF类摄像机,但是需要指出的是这一类厂商的MXF编码上完全向QT类(mov、mp4)看齐,索尼甚至引入了264类视频编码,所以这一类可以看成是通用编码类。而ARRI的视频编码和音频编码是专用的,ARRI自己对视频编码做了设计和优化,所以常见的FFMPEG类的播放器根本不支持解码。ARRI的MXF需要官方的播放器才能解码,同样像达芬奇一类的专业视频编辑软件也是支持ARRI的MXF的。

而在底层分析中同样也发现ARRI的MXF和常见的MXF在结构上也有差异,最奇特的就是RIP,其竟然采用了512对齐的方式。这个是普通MXF结构上看不到的。

另外,处理的两个案例似乎都是MINI类的机型:ARRI ALEXA mini,因为从客户反馈的信息看,基本上都是正常操作,因为尚不清楚是否是机器的软件BUG,使用此机型的朋友们可以关注下。

故障处理:

STEP1:先来看看报错的情况,使用ARRI官方的转换程序,打开文件报错”视频片段打开出错”

STEP2:WINHX分析发现前23952扇区全部为00

 

STEP3:对比正常的素材文件,发现

  1. 此文件使用3个分区的结构,头分区并不存储EC类数据,而是在BODY分区中
  2. 此文件视频和音频编码为ARRI专用,并非通用编码
  3. RIP采用512对齐

通过这些分析,再结合变成00的23952扇区,发现这部分正好是头部和BODY两个分区所在,涵盖了元数据和索引类数据和部分EC。没有元数据,就无法知道音视频编码、速率、时长这些重要的参数信息;没有索引数据就不清楚EC类的结构;这些全部是解码的基本信息,所以程序报错也就很正常了。

 

STEP4:对比分析后手工重建元数据,索引数据由于基数大,所以在搞清楚编码结构后编写程序,通过样本文件建立EC模型,再遍历损坏文件就可以得到EC索引数据,然后重新生成即可。通过处理后文件完美修复,客户非常满意!

可以看到已经可以正常解码了,时长和内容都正常。注意解码画面已经做了马赛克处理,并非原始画面。

​​​​​​​

 

这就是ARRI阿莱MXF文件损坏的修复方法,自定义的音视频编码+结构很值得记录!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是实现上述业务的VBA代码: Sub SplitAndMatch() Dim lastRow As Long Dim i As Long, j As Long Dim arri As Variant Dim ws As Worksheet Dim ws1 As Worksheet Dim arrA As Variant Dim arrN As Variant Dim found As Boolean Set ws = ActiveSheet '或者指定要处理的工作表,比如Set ws = Worksheets("Sheet1") Set ws1 = Workbooks("xxx.xlsx").Worksheets("Sheet1") '指定要匹配的工作簿和工作表 '获取M列最大行数 lastRow = ws.Cells(ws.Rows.Count, 13).End(xlUp).Row '循环处理每一行 For i = 6 To lastRow '按/分割M列单元格内字符串成数组 arri = Split(ws.Cells(i, 13).Value, "/") '遍历数组arri For j = LBound(arri) To UBound(arri) '在xxx工作簿的A列中查找当前数组元素的值,找到则设置N列对应行的值 arrA = ws1.Range("A1", ws1.Cells(ws1.Rows.Count, 1).End(xlUp)).Value arrN = ws.Range("N1", ws.Cells(ws.Rows.Count, 14).End(xlUp)).Value found = False For k = LBound(arrA) To UBound(arrA) If arrA(k, 1) = arri(j) Then arrN(i, 1) = arrA(k, 1) found = True Exit For End If Next k If Not found Then arrN(i, 1) = "" End If Next j Next i '将结果写入N列 ws.Range("N1", ws.Cells(lastRow, 14)).Value = arrN End Sub 上述代码中,我们首先获取了M列最大行数,然后对于每一行,按/分割M列单元格内字符串成数组,然后遍历数组arri,按照在xxx工作簿的A列中查找当前数组元素的值的方式,找到则设置N列对应行的值,最后将结果写入N列。注意,上述代码中的xxx.xlsx和Sheet1需要根据实际情况进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值