R语言调用you-get及FFmpeg工具实现多P视频下载及FLV格式转MP4、MP3格式

寒假又双叒叕延长了,闲来无事(其实是不想学习)又捯饬起了用命令行来下载视频

希望这场瘟疫快点过去,再不让我去学校学习我就要疯啦!武汉加油!中国加油!

1 思路

  • 下载指定URL的视频文件至创建的临时文件夹

  • 如果该链接包含多P视频,可根据需要选择是否全P下载

  • 如果下载的是FLV格式的视频的话,则先转码为MP4格式;

  • 根据需要可以选择是否将MP4格式文件转码为MP3格式;

  • 分别保存MP4文件和MP3文件至指定路径,并删除临时文件夹。

2 实现

2.1 工具

  • R
  • Python(用于pip安装you-get)
  • you-get(推荐使用pip命令安装,详见该文档)
  • FFmpeg

2.1 编写脚本

# accept parameters
options   = commandArgs(trailingOnly = TRUE)
mp4Folder = options[1]
mp3Folder = options[2]
list      = options[3]
URL       = options[4]

# download video file(s)
if(!dir.exists("tempFolder")){dir.create("tempFolder", recursive = TRUE)}
setwd("tempFolder")
if(list == "list"){
    system(paste("you-get -l --no-caption ", URL))
}else{
    system(paste("you-get --no-caption ", URL))
}

# transcode flv file(s) to mp4 file(s) if necessary
flvFile = gsub(" ", "_", list.files())
file.rename(list.files(), flvFile)
mp4File = gsub(".flv", ".mp4", flvFile)
for(i in 1:length(mp4File)){
    if(!flvFile[i] == mp4File[i]){
        cat("\ntranscoding", flvFile[i], "to", mp4File[i], "\n\n")
        system(paste("ffmpeg -i", flvFile[i], mp4File[i]))
    }
}
cat("\ncopping" , mp4File, "from tempFolder to", mp4Folder, "\n\n")
file.copy(mp4File, mp4Folder)

# transcode mp4 file(s) to mp3 file(s) if necessary
if(!mp3Folder == "no_mp3"){
  mp3File = gsub(".mp4", ".mp3", mp4File)
  for(i in 1:length(mp3File)){
    cat("\ntranscoding", mp4File[i], "to", mp3File[i], "\n\n")
    system(paste("ffmpeg -i", mp4File[i], "-vn", mp3File[i]))
  }
  cat("\ncopping" , mp3File, "from tempFolder to", mp3Folder, "\n\n")
  file.copy(mp3File, mp3Folder)
}

# clear tempFolder
cat("\nclearing tempFolder\n\n")
setwd("../")
unlink("tempFolder", recursive = TRUE, force = TRUE)
cat("done")

2.3 用法:

Windows系统安装R后,将R下的bin文件夹C:\Program Files\R\R-3.6.1\bin添加到环境变量PATH中(忘了是不是默认添加的了,反正可以手动添加),之后打开命令提示符面板(快捷键win + x + c),输入以下格式的内容。

Rscript bilidown.R mp4SaveFolder mp3SaveFolder list URL 

一个一个地介绍上面的格式:

  • Rscript

    调用R的Rscript命令以运行R脚本

  • bilidown.R

    该脚本的命名,这个可以自定义

  • mp4SaveFolder
    下载或转码的MP4文件存放路径,必须使用绝对路径

  • mp3SaveFolder

    转码的MP3文件存放路径,必须使用绝对路径

    <u>若不需要转码为MP3格式</u>,则必须使用no_mp3代替

  • list

    选择是否下载所有分P视频,对于所有可分P网站都适用

    <u>若只需要下载单个视频</u>,则必须使用no_list代替

  • URL
    视频链接,注意链接中不能含有字符&,否则会影响该命令行的运行,把URL中&后面的内容都删掉,只留下视频的原链接即可。

注意

​ 该脚本的四个参数一个都不能少,不要问为什么(因为我太菜了|\——/|)

3 示例

3.1 单个视频下载

为了便于展示,MP3和MP4文件保存路径我均设为E:/badai/test

下载需求是需要转MP3且视频分P视频,因此参数使用自定义的MP3saveFolderno_list

C:\Users\Jay Chou>Rscript E:/badai/bilidown.R E:/badai/test E:/badai/test no_list https://www.bilibili.com/video/av33508491
site:                Bilibili
title:               【鬼畜素材】汤家凤,你能睡得着觉,你有点出息没有!
stream:
    - format:        dash-flv720
      container:     mp4
      quality:       高清 720P
      size:          1.3 MiB (1387328 bytes)
    # download-with: you-get --format=dash-flv720 [URL]

Downloading 【鬼畜素材】汤家凤,你能睡得着觉,你有点出息没有!.mp4 ...
 100% (  1.3/  1.3MB) ├████████████████████████████████████████┤[2/2]  156 kB/s
Merging video parts... Merged into 【鬼畜素材】汤家凤,你能睡得着觉,你有点出息没有!.mp4

Skipping captions or danmaku.
[1] 0
[1] TRUE

copping .mp4 from tempFolder to E:/badai/test

[1] TRUE

transcoding .mp4 to .mp3

ffmpeg version 2.7 Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 4.9.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libdcadec --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-lzma --enable-decklink --enable-zlib
  libavutil      54. 27.100 / 54. 27.100
  libavcodec     56. 41.100 / 56. 41.100
  libavformat    56. 36.100 / 56. 36.100
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 16.101 /  5. 16.101
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.100 /  1.  2.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '銆愰鐣滅礌鏉愩€戞堡瀹跺嚖锛屼綘鑳界潯寰楃潃瑙夛紝浣犳湁鐐瑰嚭鎭病鏈夛紒.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.36.100
    description     : Packed by Bilibili XCoder v2.0.2
  Duration: 00:00:15.58, start: 0.000000, bitrate: 714 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 960x544, 653 kb/s, 24 fps, 24 tbr, 16k tbn, 48 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 53 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
Output #0, mp3, to '銆愰鐣滅礌鏉愩€戞堡瀹跺嚖锛屼綘鑳界潯寰楃潃瑙夛紝浣犳湁鐐瑰嚭鎭病鏈夛紒.mp3':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    description     : Packed by Bilibili XCoder v2.0.2
    TSSE            : Lavf56.36.100
    Stream #0:0(und): Audio: mp3 (libmp3lame), 44100 Hz, stereo, fltp (default)
    Metadata:
      handler_name    : SoundHandler
      encoder         : Lavc56.41.100 libmp3lame
Stream mapping:
  Stream #0:1 -> #0:0 (aac (native) -> mp3 (libmp3lame))
Press [q] to stop, [?] for help
size=     244kB time=00:00:15.54 bitrate= 128.4kbits/s
video:0kB audio:243kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.165393%

copping .mp3 from tempFolder to E:/badai/test

[1] TRUE
clearing tempFolder
done
C:\Users\Jay Chou>

结果展示:


3.2 多P视频下载

下载需求是需要转MP3且下载链接里的全P视频,因此参数使用自定义的MP3saveFolderlist

该链接总共有13P视频,但只有前三集可以免费看,因此只能下载前三集


C:\Users\Jay Chou>Rscript E:/badai/bilidown.R E:/badai/test E:/badai/test list https://www.bilibili.com/bangumi/play/ep30134
you-get: Extracting 1 of 13 videos ...
site:                Bilibili
title:               夏目友人帐:第1话 猫和友人帐
stream:
    - format:        flv
      container:     flv
      quality:       高清 1080P
      size:          143.2 MiB (150119613 bytes)
    # download-with: you-get --format=flv [URL]

Downloading 夏目友人帐:第1话 猫和友人帐.mp4 ...
 100% (143.2/143.2MB) ├████████████████████████████████████████┤[4/4]    3 MB/s
Merging video parts... you-get: Extracting 2 of 13 videos ...
Merged into 夏目友人帐:第1话 猫和友人帐.mp4

Skipping captions or danmaku.
site:                Bilibili
title:               夏目友人帐:第2话 露神之祠
stream:
    - format:        flv
      container:     flv
      quality:       高清 1080P
      size:          126.3 MiB (132417588 bytes)
    # download-with: you-get --format=flv [URL]

  ##############################################
    ############# 此处省略好多字 ###############
  ##############################################

Stream mapping:
  Stream #0:1 -> #0:0 (aac (native) -> mp3 (libmp3lame))
Press [q] to stop, [?] for help
size=     244kB time=00:00:15.54 bitrate= 128.4kbits/s
video:0kB audio:243kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.165393%

copping .mp3 from tempFolder to E:/badai/test

[1] TRUE
clearing tempFolder
done
C:\Users\Jay Chou>

结果展示:

4 vip视频下载方法

经测试,对于B站来说:

  • 非VIP视频的可获取的文件格式有MP4和FLV两种,分辨率与B站上的类别数相同,you-get默认下载最清晰的MP4格式的文件
  • 对于VIP视频来说,可获得的视频格式只有FLV,且清晰度只有480P这一种,而且用以上方法只能下载免费试看的部分,B站是6分钟试看时间,所以对于那些视频本来就少于6分钟的来说,可以完全下载下来的;而时长大于6分钟就不行了

因此,想下载高清晰度的全长的VIP视频就要使用以下方法了:

加载cookie

并非所有视频可供任何人观看。如果需要登录以观看 (例如, 私密视频), 可能必须将浏览器cookie通过--cookies/-c 加载入 you-get.

注意:

  • 目前我们支持两种cookie格式:Mozilla cookies.sqlite 和 Netscape cookies.txt

以上是you-get的官方中文教程,至于到底怎么使用cookie,俺也没搞清楚,网上没有详细的教程。

不过可以确定的是,首先你要有一个对应网站的VIP账号才行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容