Nothing
context("Convert Video")
test_that("Set log level", {
av_log_level(16)
expect_equal(av_log_level(), 16)
})
q <- 1
n <- 50
framerate <- 10
width <- 640 * q
height <- 480 * q
png_path <- file.path(tempdir(), "frame%03d.png")
png_files <- sprintf(png_path, 1:n)
wonderland <- system.file('samples/Synapsis-Wonderland.mp3', package='av', mustWork = TRUE)
# If libx264 is available, it is usually the default.
# Note that it is not available for libavfilter-free-devel in Fedora
has_libx264 <- "libx264" %in% av_muxers()$video
test_that("convert images into video formats", {
png(png_path, width = width, height = height, res = 72 * q)
par(ask = FALSE)
for(i in 1:n){
hist(rnorm(100, mean = i), main = paste("histogram with mean", i))
}
dev.off()
for(ext in c("mkv", "mp4", "mov", "flv", "gif")){
filename <- paste0("test.", ext)
av::av_encode_video(png_files, filename, framerate = framerate, verbose = FALSE)
expect_true(file.exists(filename))
info <- av_media_info(filename)
expect_equal(info$video$width, width)
expect_equal(info$video$height, height)
if(has_libx264){
expect_equal(info$video$codec, switch(ext, gif='gif', flv='flv', 'h264'))
}
expect_equal(info$video$framerate, framerate)
# Gif doesn't have video metadata (duration)
if(ext != 'gif'){
expect_equal(info$duration, n / framerate)
# Test converting video to video
av_video_convert(filename, 'test2.mp4', verbose = FALSE)
info <- av_media_info('test2.mp4')
unlink('test2.mp4')
expect_equal(info$video$width, width)
expect_equal(info$video$height, height)
expect_equal(info$video$framerate, framerate)
expect_null(info$audio)
}
unlink(filename)
}
})
test_that("audio sampling works", {
for(ext in c("mkv", "mp4", "mov", "flv")){
filename <- paste0("test.", ext)
av::av_encode_video(png_files, filename, framerate = framerate, verbose = FALSE, audio = wonderland)
expect_true(file.exists(filename))
info <- av_media_info(filename)
expect_equal(info$video$width, width)
expect_equal(info$video$height, height)
if(has_libx264){
expect_equal(info$video$codec, switch(ext, flv='flv', 'h264'))
}
expect_equal(info$video$framerate, framerate)
expect_equal(info$audio$channels, 2)
expect_equal(info$audio$sample_rate, 44100)
# Audio stream may slightly alter the duration, 5% margin
expect_equal(info$duration, n / framerate, tolerance = 0.05)
# Test converting video to video
av_video_convert(filename, 'test2.mp4', verbose = FALSE)
info <- av_media_info('test2.mp4')
unlink('test2.mp4')
expect_equal(info$video$width, width)
expect_equal(info$video$height, height)
expect_equal(info$video$framerate, framerate)
expect_equal(info$audio$channels, 2)
expect_equal(info$audio$sample_rate, 44100)
# Audio stream may slightly alter the duration, 5% margin
expect_equal(info$duration, n / framerate, tolerance = 0.05)
# Cleanup
unlink(filename)
}
})
test_that("fractional framerates work", {
framerate <- 1/5
av::av_encode_video(png_files, 'test.mp4', framerate = framerate, verbose = FALSE)
info <- av_media_info('test.mp4')
unlink('test.mp4')
expect_equal(info$video$framerate, framerate)
expect_equal(info$duration, length(png_files) / framerate)
})
test_that("speed up/down filters", {
for (x in c(0.1, 0.5, 2, 10)){
framerate <- 25
filter <- sprintf("setpts=%s*PTS", as.character(x))
av::av_encode_video(png_files, 'speed.mp4', framerate = framerate, vfilter = filter, verbose = FALSE)
info <- av_media_info('speed.mp4')
unlink('speed.mp4')
expect_equal(info$video$framerate, (framerate / x))
expect_equal(info$duration, length(png_files) / (framerate / x))
}
})
test_that("test error handling", {
wrongfile <- system.file('DESCRIPTION', package='av')
file.copy(wrongfile, tmp <- tempfile(fileext = '.png'))
unlink("video.mp4")
expect_error(av_encode_video(wrongfile, verbose = FALSE), "input")
expect_false(file.exists("video.mp4"))
expect_error(av_encode_video(tmp, verbose = -8), "input")
expect_false(file.exists("video.mp4"))
expect_error(av_encode_video(png_files, vfilter = "doesnontexist", verbose = -8), "filter")
expect_false(file.exists("video.mp4"))
# Test missing stream
expect_error(av_encode_video(png_files, audio = png_files[1]), "audio")
expect_false(file.exists("video.mp4"))
expect_error(av_encode_video(wonderland), "video")
expect_false(file.exists("video.mp4"))
# Test time limit
setTimeLimit(cpu = 2, transient = TRUE)
timings <- system.time(expect_error(av_encode_video(rep(png_files, 100), verbose = FALSE), "time"))
setTimeLimit()
expect_lt(timings[['sys.self']], 2.5)
expect_equal(get_open_handles(), 0)
})
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.