c# - Monotouch - CMSampleBufferGetSampleTimingInfoArray

标签 c# ios xamarin.ios xamarin

我目前正在开发一个用 monotouch 编写的可以录制视频的概念验证应用程序。我需要调整 CMSampleBuffer 的时间,我找到了一个可以做到这一点的代码,但是它是用 Objective-C 编写的。我试着翻译下面的代码,但我找不到任何映射到这个函数 - CMSampleBufferGetSampleTimingInfoArray,我们如何在 monotuch 中调用这个函数?下面是调整时间的完整代码,但是在 Objective-C 中:

- (CMSampleBufferRef) adjustTime:(CMSampleBufferRef) sample by:(CMTime) offset
{
    CMItemCount count;
    CMSampleBufferGetSampleTimingInfoArray(sample, 0, nil, &count);
    CMSampleTimingInfo* pInfo = malloc(sizeof(CMSampleTimingInfo) * count);
    CMSampleBufferGetSampleTimingInfoArray(sample, count, pInfo, &count);
    for (CMItemCount i = 0; i < count; i++)
    {
        pInfo[i].decodeTimeStamp = CMTimeSubtract(pInfo[i].decodeTimeStamp, offset);
        pInfo[i].presentationTimeStamp = CMTimeSubtract(pInfo[i].presentationTimeStamp, offset);
    }
    CMSampleBufferRef sout;
    CMSampleBufferCreateCopyWithNewTiming(nil, sample, count, pInfo, &sout);
    free(pInfo);
    return sout;
}

最佳答案

这是未经测试的,但我相信它应该能让你走上正轨:

[DllImport(Constants.CoreMediaLibrary)]
int CMSampleBufferGetSampleTimingInfoArray (
    IntPtr sbuf,
    int timingArrayEntries,
    CMSampleTimingInfo [] timingArrayOut,
    out int timingArrayEntriesNeededOut
);

[DllImport(Constants.CoreMediaLibrary)]
int CMSampleBufferCreateCopyWithNewTiming (
    IntPtr allocator,
    IntPtr originalSBuf,
    int numSampleTimingEntries,
    CMSampleTimingInfo []sampleTimingArray,
    out IntPtr sBufCopyOut
);

CMSampleBuffer AdjustTime (CMSampleBuffer sample, CMTime offset)
{
    int count;
    CMSampleBufferGetSampleTimingInfoArray (sample.Handle, 0, null, out count);
    CMSampleTimingInfo [] pInfo = new CMSampleTimingInfo [count];
    CMSampleBufferGetSampleTimingInfoArray (sample.Handle, count, pInfo, out count);
    for (int i = 0; i < count; i++) {
        pInfo [i].DecodeTimeStamp = CMTime.Subtract (pInfo [i].DecodeTimeStamp, offset);
        pInfo [i].PresentationTimeStamp = CMTime.Subtract (pInfo [i].PresentationTimeStamp, offset);
    }
    IntPtr sout;
    CMSampleBufferCreateCopyWithTiming (IntPtr.Zero, sample, count, pInfo, out sout);
    // Unfortunately the constructor we need is internal, but that can be fixed
    // for a future version of Xamarin.iOS.
    return (CMSampleBuffer) typeof (CMSampleBuffer).GetConstructor (BindingFlags.Instance | BindingFlags.NonPublic, null, new Type [] { typeof (IntPtr), typeof (bool) }, null).Invoke (new object [] { sout, true });
}

更新

我现在已经在 Xamarin.iOS 中实现了一些必需的 API,因此在未来的版本中您将能够执行此操作:

CMSampleBuffer AdjustTime (CMSampleBuffer sample, CMTime offset)
{
    var info = sample.GetSampleTimingInfo ();
    for (int i = 0; i < info.Length; i++) {
        info [i].DecodeTimeStamp = CMTime.Subtract (info [i].DecodeTimeStamp, offset);
        info [i].PresentationTimeStamp = CMTime.Subtract (info [i].PresentationTimeStamp, offset);
    }
    return CMSampleBuffer.CreateWithNewTiming (sample, info)
}

关于c# - Monotouch - CMSampleBufferGetSampleTimingInfoArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16921400/

相关文章:

c# - 方法返回任务的接口(interface)命名约定

ios - 如何在不使用按钮的情况下直接点击将显示地址的单元格?

tableview 单元格内的 ios 文本字段

ios - ld : library not found for -lobjc

xamarin - Visual Studio App Center Android 构建项目找不到解决方案文件

android - 地理坐标转屏幕坐标算法

C# Crystal 报表参数超出范围异常

c# - 覆盖 Dictionary<Datetime,int> 的 ContainsKey

c# - System.ValueType 的一个实例在堆上还是在栈上?

windows - 是否可以在 Visual Studio 中构建 Monotouch 应用程序?