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文件存放路径,必须使用绝对路径

    若不需要转码为MP3格式则必须使用no_mp3代替

  • list

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

    若只需要下载单个视频则必须使用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账号才行。

你可能感兴趣的:(R语言调用you-get及FFmpeg工具实现多P视频下载及FLV格式转MP4、MP3格式)