Я удалил свой комментарий, я понимаю, что вы собираетесь после второго прочтения.
Это довольно просто, используя rleid()
из data.table
library(data.table)
## Note: store times as POSIXct instead of POSIXlt for drastic performance improvement
time <- c(as.POSIXct("2017-02-03 09:00:01"),
as.POSIXct("2017-02-03 09:00:03"),
as.POSIXct("2017-02-03 09:00:06"),
as.POSIXct("2017-02-03 09:00:09"),
as.POSIXct("2017-02-03 09:00:10"),
as.POSIXct("2017-02-03 09:00:20"),
as.POSIXct("2017-02-03 09:00:23"),
as.POSIXct("2017-02-03 09:00:34"),
as.POSIXct("2017-02-03 09:00:44"),
as.POSIXct("2017-02-03 09:01:07"))
price <- c(100, 100, 100, 99, 98, 99, 100, 101, 101, 100)
data <- data.frame(time, price)
## Convert to a data.table
setDT(data)
## Create a summary using a generated counter on the fly with
## the `rleid` function from data.table to group consecutive
## sequences together and then operate by group. the `.N`
## operator is another special symbol in data.table
## that we can use to return the number of rows in each group
## here. See ?special-symbols to learn more
Summary <- data[, .(start = first(time),
end = last(time),
nbr_records = .N,
duration_sec = as.numeric(last(time)) - as.numeric(first(time))
), by = .(Counter = data.table::rleid(price))]
## Drop the Counter variable assuming you don't need it
Summary[,Counter := NULL]
## Results
print(Summary)
# start end nbr_records duration_sec
# 1: 2017-02-03 09:00:01 2017-02-03 09:00:06 3 5
# 2: 2017-02-03 09:00:09 2017-02-03 09:00:09 1 0
# 3: 2017-02-03 09:00:10 2017-02-03 09:00:10 1 0
# 4: 2017-02-03 09:00:20 2017-02-03 09:00:20 1 0
# 5: 2017-02-03 09:00:23 2017-02-03 09:00:23 1 0
# 6: 2017-02-03 09:00:34 2017-02-03 09:00:44 2 10
# 7: 2017-02-03 09:01:07 2017-02-03 09:01:07 1 0
Я знаю, что это не.NET C#, но ffmpeg является большим инструментом, чтобы сделать точно это. Может быть выполнен как инструмент командной строки с любого языка.
Вот маленькое учебное руководство для запущения Вас.
Я сделал это несколько лет назад, но я, кажется, потерял источник. Так или иначе route-of-least-resistance, который я нашел, должен был использовать DirectShow, существует interop обертка для управляемого кода, а именно, directshow.net. Вы захотите использовать GetBitmapBits IMediaDet от SDK Windows Media Format.
На CodeProject существует пример: Кадры Извлечения из Видеофайлов