ffmpeg -i source.mp4 -t 1:30:00 -c copy part1.mp4
ffmpeg -ss 1:30:00 -i source.mp4 -c copy part2.mp4
www.youtube.com/get_video_info?video_id=XXXXXX
XXXXXX
подставьте хэш видео, который в ссылке на ролик, типа youtu.be/BWCiWZtrWXU
после слеша.url_encoded_fmt_stream_map
. Его значение опять надо распаковать как URL-параметры. И из результата вытащить параметр url
– это ссылка на единый скачивабельный видеофайл.function getUrlParams(search) {
let hashes = search.slice(search.indexOf('?') + 1).split('&')
let params = {}
hashes.map(hash => {
let [key, val] = hash.split('=')
params[key] = decodeURIComponent(val)
})
return params
}
var s = '------'; // здесь длиннющая строка из ответа /get_video_info
var a = getUrlParams(s);
var b = getUrlParams(a.url_encoded_fmt_stream_map);
console.log(b.url); // эту ссылку открываем в браузере - это скачиваемый видеофайл
$('.parent div:last-child').addClass('div2');
Замыкание — это комбинация функции и лексического окружения, в котором эта функция была определена.
A closure is the combination of a function and the lexical environment within which that function was declared.
function makeCounter() {
// далее ваш код:
let count = 0;
function counter() {
return count += 1;
}
// конец вашего кода.
return counter; // вернули Функцию (с её окружением)
}
var myCounter = makeCounter();
// вот теперь к значению count не добраться - приватность!
// зато
console.log(myCounter()); // 1
console.log(myCounter()); // 2
console.log(myCounter()); // 3
aom
/ av1
, который упорно показывал свою версию как 0.1.0
, а не требуемую 1.0.0
. Создал тикет. Эта мелочь вылечилась отказом от кодека aom - в 376-й строке скрипта build-ffmpeg
заменил --enable-libaom
на --disable-libaom
const digits = [1,2,3,4,5,6,7,8,9];
const arr = [];
for (let i=0; i<4; i++) {
const n = Math.floor(Math.random() * digits.length);
arr.push( digits.splice(n, 1)[0] );
}
// arr == [2,9,8,1] и каждый раз по-разному )
$(document).ready(function() {
$('.services-link').each( function(){
if ($(this).hasClass('active')){
$('.blackimg', this).hide();
$('.whiteimg', this).show();
} else {
$('.blackimg', this).show();
$('.whiteimg', this).hide();
}
})
});
.services-link .blackimage {display: block}
.services-link.active .blackimage {display: none}
.services-link .whiteimage {display: none}
.services-link.active .whiteimage {display: block}
let WIDTH=640
let HEIGHT=480
let MID=$WIDTH/2
let BUFFER=16
let FRAMERATE=30
let XRATE=$BUFFER\*$FRAMERATE
let DURATION=8
let FPERIOD=$XRATE\*$DURATION
ffmpeg \
-filter_complex \
" \
color=white:${WIDTH}x${HEIGHT}:d=$DURATION:r=$XRATE,format=rgb24[bg]; \
color=black:8x${HEIGHT}:d=$DURATION:r=$XRATE,format=rgb24[bar]; \
[bg][bar]overlay=x='$MID + $MID * sin(8 * PI * n / $FPERIOD)':y=0:format=yuv444,format=yuv420p[motion]; \
[motion]tmix=frames=$BUFFER \
" \
-c:v libx264 \
-r $FRAMERATE \
-an \
-hide_banner \
-y \
output.mp4