如何从 Python 中的视频链接下载音频

Posted

技术标签:

【中文标题】如何从 Python 中的视频链接下载音频【英文标题】:How to download audio from a video link in Python 【发布时间】:2021-01-16 09:26:09 【问题描述】:

我有一个我正在迭代的链接列表,如下所示

https://www.loc.gov/item/2015669100/
https://www.loc.gov/item/2015669101/
https://www.loc.gov/item/2015669102/
https://www.loc.gov/item/2015669103/
https://www.loc.gov/item/2015669104/
https://www.loc.gov/item/2015669105/
https://www.loc.gov/item/2015669106/
https://www.loc.gov/item/2015669107/
https://www.loc.gov/item/2015669108/
https://www.loc.gov/item/2015669109/

如果您查看这些链接,您会发现它有一个视频和一个可下载的 XML 文件。我的任务是从视频中下载音频,并从一个页面一起下载 XML 文件。

我的问题是,我如何从这些音频文件中获取音频?

下面是我目前的代码。

from bs4 import BeautifulSoup
from urllib.request import Request, urlopen

base_html = "https://www.loc.gov/collections/civil-rights-history-project/?sp="

for i in range(1,8):
    html = base_html.format(i)
    req = Request(html, headers='User-Agent': 'Mozilla/5.0')
    soup = BeautifulSoup(urlopen(req).read(), 'html.parser')
    
    pages = soup.findAll('div', attrs='class' : 'item-description')
    for div in pages:
            crawl_p = div.find('a')['href']
            #some logic here

【问题讨论】:

欢迎来到 Stack Overflow!请花一分钟阅读How do I ask a good question?你的研究工作在哪里?您是否尝试过在谷歌上搜索解决方案?如果是,您尝试过实施什么?哪里出了问题? 【参考方案1】:

查看该站点,它看起来像通过传输段(.ts 文件)流式传输的视频和音频文件形成 m3u8 url。

<source> 包含 m3u8 流的 url。使用标签中的属性来标识标签。(这里是类型属性)。

import subprocess
from bs4 import BeautifulSoup
import requests as r

sess = r.session()
site_url = "https://www.loc.gov/item/2015669100/"
request = sess.get(site_url)
#print(request.content)

soup = BeautifulSoup(request.content, 'html5lib')
m3u8_url = soup.find('source',attrs='type' : 'application/x-mpegURL')['src']
print(str(m3u8_url))

这会废弃 m3u8 网址,https://tile.loc.gov/streaming-services/iiif/service:afc:afc2010039:afc2010039_crhp0001:afc2010039_crhp0001_mv04/full/full/0/full/default.m3u8

ffmpeg 可以从 m3u8 文件中下载流(视频或音频)。它也可以从 python 运行。

subprocess.call(['ffmpeg','-i',m3u8_url,'-vn','-map','a','output.ts' ])

不要忘记用[] 包装命令。引号内的每个单词代表一个空格分隔的命令。完整的ffmpeg命令是ffmpeg -i m3u8_url -vn -map a output.ts

这是完整的代码。只需确保包含 ffmpeg 路径变量,否则子进程将抛出错误。文件很大,所以下载音频文件可能需要一些时间。

import subprocess
from bs4 import BeautifulSoup
import requests as r

sess = r.session()
site_url = "https://www.loc.gov/item/2015669100/"
request = sess.get(site_url)
#print(request.content)

soup = BeautifulSoup(request.content, 'html5lib')
m3u8_url = soup.find('source',attrs='type' : 'application/x-mpegURL')['src']
print(str(m3u8_url))

subprocess.call(['ffmpeg','-i',m3u8_url,'-vn','-map','a','output.ts' ])

【讨论】:

以上是关于如何从 Python 中的视频链接下载音频的主要内容,如果未能解决你的问题,请参考以下文章

使用url从python流传输youtube音频而无需下载python

如何禁用网页中的视频/音频下载?

如何在Pytube中组合音频和视频?

如何从 Angular 6 中的 blob URL 下载音频文件?

如何从互联网下载音频/视频文件并存储在 iPhone 应用程序中?

如何使用 praw 从 reddit 下载视频