从B站获取的视频和音频,合并后没有声音,怎么解决

img


def get_bilibili_video_links(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36",
        "Referer": "https://www.bilibili.com/online.html",
        "Cookie": "buvid3=16B085E9-2336-D995-673F-B42F2F400FD137684infoc; b_nut=1690525437; _uuid=E44D17B4-67106-6B6C-3DD9-83E10C922735337558infoc; buvid_fp=a890e9cc95b0def2ca53d68e00d41bda; buvid4=E7CC7306-FA67-96D8-67BF-60D48D34392273951-023071214-RYZwLL8nRmXHGZtmr2QQ0Q%3D%3D; FEED_LIVE_VERSION=V8; header_theme_version=CLOSE; home_feed_column=5; browser_resolution=1493-751; CURRENT_FNVAL=4048; PVID=1; SESSDATA=956d8791%2C1708227771%2Cba8e4%2A8106NzQJ1UlfU9H7Yijf9qq27GtQLlpGUOEEf0pXCzHhGXr-KtG1x7rbYUWwRD8rIRpq8wkQAADQA; bili_jct=27f713f3596b44aa56609e7eef354704; DedeUserID=232442913; DedeUserID__ckMd5=7774e129371f2995; rpdid=|(J|~uullY)m0J'uYmu|Rm|mk; i-wanna-go-back=-1; b_ut=5; CURRENT_QUALITY=64; bp_video_offset_232442913=830044288713752627; is-2022-channel=1; fingerprint=a890e9cc95b0def2ca53d68e00d41bda; buvid_fp_plain=undefined; innersign=0; b_lsid=62FFC769_18A1B5684A0; bsource=search_bing; sid=npsnfjih" }
    data=requests.get(url,headers=headers)
    data.encoding='utf-8'
    data=data.text
    with open("bili.html","w",encoding='utf-8') as f:
        f.write(data)
    html=etree.HTML(data)
    n=1
    list=[]
    while True:
        try:
            path=f"/html/body/div[2]/div/main/div/div[2]/div/div[2]/div[{n}]/div[2]/div/div/h3/a/@href"
            url_list=html.xpath(path)[0].strip("//")[0:]
            url=f"https://{url_list}"
            list.append(url)
            print(url)
            n+=1
        except:
            print("没有更多视频了")
            break
    print(list)
    return list
# @app.route('/bili',methods=['GET','POST'])
def video_audio():
    url='https://www.bilibili.com/v/kichiku/?spm_id_from=333.1073.0.0'
    # url=request.args.get('url','')
    for i in get_bilibili_video_links(url):
        data=requests.get(i).text
        html= etree.HTML(data)

        title=html.xpath('/html/body/div[2]/div[2]/div[1]/div[1]/h1/@title')[0]
        print(title)
        # print(html)
        js=html.xpath('/html/head/script[3]')[0].text.split("window.__playinfo__=")[1]
        print(js)
        js=json.loads(js)
        print(js)
        video_url=js['data']['dash']['video'][0]['baseUrl']
        audio_url=js['data']['dash']['audio'][0]['baseUrl']
        print(video_url)
        print(audio_url)

        #合并音视频
        with open(f"{title}.mp4","wb") as f:
            f.write(requests.get(video_url).content)
        with open(f"{title}.mp3","wb") as f:
            f.write(requests.get(audio_url).content)
        print("下载完成")
        try:
            video = VideoFileClip(f'{title}.mp4')
            print(video.size)
            print(video.duration)
            audio = AudioFileClip(f'{title}.mp3')
            video.set_audio(audio)  #将音频写入到视频
            video.write_videofile(f'./images/{title}_1.mp4')  #保存新的视频

            time.sleep(1)
            # os.remove(f'{title}.mp3')
            # os.remove(f'{title}.mp4')
            print("合并完成")
            print("下载完成")
        except Exception as e:
            print(e)
            print("合并失败")
            # os.remove(f'{title}.mp3')
            # os.remove(f'{title}.mp4')
            pass

你可以用网址提取视频https://www.fodownloader.com/
或者看知乎的这篇文章:如何将b站缓存的视频m4s文件转换成MP4或MP3,并合成一个完整的视频https://zhuanlan.zhihu.com/p/606556747?utm_id=0

该回答引用chatgpt
B站提供了 API 接口,可以使用 Python 读取 B站视频信息。下面是一个简单的示例,可以帮助你开始使用 Python 读取 B站视频信息:

  1. 在 B站开发者中心申请 API 访问权限,获取到 access_key 和 secret_key。

  2. 安装 requests 库和 hashlib 库。

    pip install requests
    
  3. 编写 Python 代码,调用 B站的 API 接口获取视频信息。

    import requests
    import hashlib
    
    access_key = '<your_access_key>'
    secret_key = '<your_secret_key>'
    video_id = '<video_id>'
    
    # 计算签名
    m = hashlib.md5()
    m.update((secret_key + str(video_id) + access_key).encode('utf-8'))
    sign = m.hexdigest()
    
    # 调用 API 接口获取视频信息
    url = f'https://api.bilibili.com/x/web-interface/view?aid={video_id}&appkey={access_key}&sign={sign}'
    response = requests.get(url)
    data = response.json()
    
    # 输出视频信息
    print(data['data']['title'])
    print(data['data']['desc'])
    print(data['data']['stat']['view'])
    print(data['data']['stat']['danmaku'])
    print(data['data']['stat']['reply'])
    print(data['data']['stat']['favorite'])
    print(data['data']['stat']['coin'])
    print(data['data']['stat']['share'])
    

在上面的示例中,我们首先计算了签名,然后调用了 B站的 API 接口来获取视频信息。最后,我们输出了视频的标题、简介和一些统计数据。

以上是一个简单的示例,你可以根据自己的需求来调整和扩展这个示例。注意,B站的 API 接口可能会有变化,你需要根据最新的 API 文档来调整代码。

【以下回答由 GPT 生成】

解决从B站获取的视频和音频合并后没有声音的问题

首先,我注意到您使用的代码中并没有包含合并视频和音频的部分。因此,我将提供一种解决该问题的流程和示例代码,以使输出的视频包含声音。

在解决该问题之前,您需要确保安装了以下库: - moviepy - ffprobe-python

接下来,我们将使用moviepy库来合并视频和音频。以下是一个解决方案和示例代码:

  1. 首先,使用ffprobe-python库获取视频和音频的详细信息。我们需要获取视频和音频的持续时间以进行合并。
import ffprobe

# 获取视频持续时间
video_duration = ffprobe.get_duration('video.mp4')

# 获取音频持续时间
audio_duration = ffprobe.get_duration('audio.mp3')
  1. 确认视频和音频的持续时间是否相等。如果不相等,您可能需要对其中一个进行调整,以使它们具有相同的持续时间。

  2. 使用moviepy库合并视频和音频。以下是一个示例代码:

from moviepy.editor import VideoFileClip, AudioFileClip

def merge_video_audio(video_path, audio_path, output_path):
    # 加载视频和音频文件
    video = VideoFileClip(video_path)
    audio = AudioFileClip(audio_path)

    # 合并视频和音频
    video = video.set_audio(audio)

    # 保存合并后的视频
    video.write_videofile(output_path, codec='libx264', audio_codec='aac')
  1. 在您的video_audio()函数中调用merge_video_audio()函数并传入视频和音频文件的路径,以及输出文件的路径。
def video_audio():
    url = 'https://www.bilibili.com/v/kich'
    # 从url获取视频和音频
    video_links = get_bilibili_video_links(url)

    # 假设video_links[0]是视频链接,video_links[1]是音频链接
    video_path = download_file(video_links[0], 'video.mp4')
    audio_path = download_file(video_links[1], 'audio.mp3')

    # 合并视频和音频
    output_path = 'output.mp4'
    merge_video_audio(video_path, audio_path, output_path)

    # 返回合并后的视频,包含声音
    return output_path

这个解决方案的主要思路是通过moviepy库将视频和音频合并到一起,并确保它们的持续时间相等。在使用该解决方案之前,请确保自己有权使用和合并所下载的视频和音频文件。

希望这个回答对您有帮助!如果您有任何问题,请随时问我。



【相关推荐】



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

remove报错是因为你已经打开了,没有close()掉所以报错了

视频和音频的编码格式不兼容,视频和音频的帧率或采样率不一致,视频和音频的时长不匹配,导致合并后的文件出现截断或重复,这三个方面排查下,可以使用ffmpeg命令行工具来合并视频和音频

目前采取了ffmpeg的方式,但调用os.system执行不了,单独去cmd执行没问题

img

要确保音视频编码格式是兼容的,不同的编码格式可能导致无法正确合并。

解决Python语言进行音视频的合成的具体操作步骤
可以参考下

引用gpt作答:
用 ffmpeg 库来正确合并视频和音频。下面是一个使用 ffmpeg 的示例代码:

import subprocess
def merge_video_audio(video_path, audio_path, output_path):
    command = f'ffmpeg -i {video_path} -i {audio_path} -c:v copy -c:a aac -strict experimental {output_path}'
    subprocess.call(command, shell=True)
# 调用方式
merge_video_audio('video.mp4', 'audio.mp3', 'output.mp4')

其中,video_path 是视频文件路径,audio_path 是音频文件路径,output_path 是合并后的输出文件路径。请确保你的系统已经安装了 ffmpeg,并且将其添加到环境变量中

结合GPT给出回答如下请题主参考
如果从B站获取的视频和音频合并后没有声音,可能是因为音视频的编码不一致导致的。您可以尝试使用音视频转码软件将两个文件通过相同的编码方式重新编码后再进行合并,这样通常可以解决问题。同时,您也可以尝试使用不同的音视频合并工具,如FFmpeg等,来进行合并。另外,请确保视频和音频的文件名和格式正确,并尝试在合并时使用正确的参数和命令。希望能帮到您,谢谢。

确认获取的视频链接都是有效的,并且都包含音频。在合并视频和音频之前,需要将视频文件转换为同一格式。
当然,也有可能是B站对它的视频进行加密或者压缩处理。

用moviepy.editor.VideoFileClip和moviepy.editor.AudioFileClip库来合并视频和音频文件,并将音频写入到视频中

检查一下格式是否兼容,有没有被加密