(现在只剩下ffmpeg环境变量配置的问题)Python|爬虫 只爬取了一个output.ts

Python|爬虫 只爬取了一个output.ts还不能播放
我的 ffmpeg 配置地址 C:\ffmpeg6.0\bin \ffmpeg.exe 在 cmd 中运行显示不是外部内部文件


```python
import requests
import subprocess

# 获取 m3u8 文件内容

url = 'https://example.com/video.m3u8'
response = requests.get(url)
m3u8_content = response.text

# 解析 m3u8 文件,获取视频片段 URL
base_url = url.rsplit('/', 1)[0]
video_urls = []
for line in m3u8_content.split('\n'):
    if line.startswith('#EXTINF:'):
        for i in video_urls:
            video_url = base_url + '/' + m3u8_content.split('\n')[i+1]
            video_urls.append(video_url)

# 下载视频片段并合并成一个完整的视频文件
with open(f'g:/234/output.ts', 'wb') as f:
    for video_url in video_urls:
        response = requests.get(video_url)
        f.write(response.content)

```

采用chatgpt:
当下载视频片段并合并成一个完整的视频文件时,您的代码存在一些问题:

1、video_urls列表问题:在代码中,您试图遍历video_urls列表以获取当前视频片段的索引,但是video_urls列表一开始是空的,因此循环不会执行。应该使用m3u8_content列表来提取视频片段的URL。

2、命令行拼接问题:在下载完所有视频片段后,您需要将这些片段合并成一个完整的视频文件。目前代码中没有包含合并的步骤。

这里是对代码进行修正后的版本:

import requests

# 获取 m3u8 文件内容
url = 'https://example.com/video.m3u8'
response = requests.get(url)
m3u8_content = response.text

# 解析 m3u8 文件,获取视频片段 URL
base_url = url.rsplit('/', 1)[0]
video_urls = []
for line in m3u8_content.split('\n'):
    if not line.startswith('#'):
        video_url = base_url + '/' + line
        video_urls.append(video_url)

# 下载视频片段并合并成一个完整的视频文件
with open('g:/234/output.ts', 'wb') as f:
    for video_url in video_urls:
        response = requests.get(video_url)
        f.write(response.content)

然而,这仅仅是将视频片段按顺序下载并保存为一个output.ts文件,并不保证合并后可以播放。如果m3u8文件中的视频片段是TS格式,那么这样的下载方式是合理的,但是如果视频使用其他编码或者分片方式,还需要额外的处理才能得到可播放的完整视频文件。

大概率是可以的,参考:

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答由chatgpt基于相关博客总结生成:

    首先,根据提供的代码,我注意到在解析m3u8文件时有一个错误。在for循环中,你试图访问video_urls列表的索引,但事实上它是一个空列表。你需要使用另一个计数变量来追踪索引。

    另外,output.ts文件可能无法直接播放是因为它只是由多个视频片段合并而成的。你需要使用FFmpeg等工具将这些片段进行处理和合并,以生成一个可播放的视频文件。

    以下是修改后的代码,添加了计数变量以及使用FFmpeg进行合并处理:

    import requests
    import subprocess
    
    # 获取 m3u8 文件内容
    url = 'https://example.com/video.m3u8'
    response = requests.get(url)
    m3u8_content = response.text
    
    # 解析 m3u8 文件,获取视频片段 URL
    base_url = url.rsplit('/', 1)[0]
    video_urls = []
    index = 0  # 添加计数变量
    for line in m3u8_content.split('\n'):
        if line.startswith('#EXTINF:'):
            video_url = base_url + '/' + m3u8_content.split('\n')[index+1]  # 使用计数变量
            video_urls.append(video_url)
        index += 1  # 增加计数
    
    # 下载视频片段并合并成一个完整的视频文件
    with open('g:/234/output.ts', 'wb') as f:
        for video_url in video_urls:
            response = requests.get(video_url)
            f.write(response.content)
    
    # 使用 FFmpeg 进行合并处理
    subprocess.run(['ffmpeg', '-i', 'g:/234/output.ts', '-c', 'copy', 'g:/234/output.mp4'])
    

    需要确保系统中已安装FFmpeg,并将其添加到系统环境变量中。这样,你就可以运行上述代码,并且它将下载视频片段,并将它们合并为output.mp4文件,该文件可以直接播放。

    如果问题仍然存在,请提供FFmpeg的版本信息以及任何错误提示,以便我们能更好地帮助你解决问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

每一次解答都是一次用心理解的过程,期望对你有所帮助。
参考结合AI智能库,如有帮助,恭请采纳。

根据你的代码,发现以下问题:
首先,在解析 m3u8 文件时,你需要找到视频片段的 URL,而不是添加到 video_urls 列表中。你可以使用 Python 的 re 模块来进行正则表达式匹配来提取 URL。

其次,在下载视频片段时,你需要使用 subprocess 模块来启动一个新的进程,以便使用ffmpeg命令将视频片段合并成完整的视频文件。
提供一个简单的示例:

import requests  
import re  
import subprocess  
  
# 获取 m3u8 文件内容  
url = 'https://example.com/video.m3u8'  
response = requests.get(url)  
m3u8_content = response.text  
  
# 解析 m3u8 文件,获取视频片段 URL  
base_url = url.rsplit('/', 1)[0]  
video_urls = []  
for line in m3u8_content.split('\n'):  
    if line.startswith('#EXTINF:'):  
        line_num = int(re.search(r'\d+', line).group())  
        video_url = base_url + '/' + m3u8_content.split('\n')[line_num+1].strip()  
        video_urls.append(video_url)  
  
# 下载视频片段并合并成一个完整的视频文件  
output_file = 'g:/234/output.ts'  
ffmpeg_path = 'ffmpeg'  # 请确保已安装 ffmpeg 并设置好路径  
  
with open(output_file, 'wb') as f:  
    for video_url in video_urls:  
        response = requests.get(video_url)  
        f.write(response.content)  
          
    # 使用 ffmpeg 合并视频文件  
    command = [ffmpeg_path, '-f', 'mpegts', '-i', output_file, '-c', 'copy', output_file]  
    subprocess.run(command)

应该是ffmpeg环境问题