将抖音视频转成MP3并下载

这篇具有很好参考价值的文章主要介绍了将抖音视频转成MP3并下载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这篇是在上一篇的基础上写的,这篇负责抖音作者详情页的视频转声音提取,这篇需要用到后端。
本地启动后端后,在控制台输入对应代码,即可实现hover在封面上,按d一键下载音频

  • 控制台代码

  // 获取作者的视频列表
  var liElements = document.querySelectorAll('ul[data-e2e="scroll-list"] li');

  // 添加鼠标悬停事件监听器
  liElements.forEach(function(li) {
    li.addEventListener('mouseenter', function() {
      // 添加键盘按下事件监听器
      document.addEventListener('keydown', keydownHandler);
    });

    li.addEventListener('mouseleave', function() {
      // 移除键盘按下事件监听器
      document.removeEventListener('keydown', keydownHandler);
    });
  });

  // 处理键盘按下事件
  function keydownHandler(event) {
    // 判断按下的键是否为 'D' 键,keyCode为 '68'
    if (event.keyCode === 68) {
      // 获取下载链接
      var sourceTag = document.querySelector('.basePlayerContainer xg-video-container > video > source:nth-child(1)');
      const alt = document.querySelector('.basePlayerContainer').previousElementSibling.querySelector('img').getAttribute('alt');
	  // 找到第一个冒号并截取之后的部分
	  let contentAfterColon = alt.includes(':') ? 
	  	alt.split(':').slice(1).join(':'):
	  	alt;
	  // 去除所有的.和空格
	  let resultString = contentAfterColon.replace(/[.\s]/g, '');
	  // 如果最终结果为空,替换为'空'
	  const name = resultString === '' ? '空' : resultString;
	
	  // 提取src属性值
	  var url = sourceTag.getAttribute('src');
      // 执行下载操作,这里使用一个假设的下载函数
      downloadFile(url, name);
    }
  }

  function downloadFile(url, name) {
  // 发送POST请求到后台接口
  fetch('http://localhost:3000/convert', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ videoUrl: url }),
  })
    .then((response) => response.blob())
    .then((blob) => {
      // 创建一个临时的<a>元素用于下载
      const a = document.createElement('a');
      const url = window.URL.createObjectURL(blob);
      a.href = url;
      a.download = name + '.mp3';

      // 触发点击事件以启动下载
      a.click();

      // 释放URL对象
      window.URL.revokeObjectURL(url);
    })
    .catch((error) => {
      console.error('Error:', error);
      alert('下载失败,原因:' + error)
    });
}


  • 后端 node 代码
const express = require('express');
const axios = require('axios');
const ffmpeg = require('fluent-ffmpeg');
const fs = require('fs');
const path = require('path');
const cors = require('cors');
const app = express();

app.use(express.json());
// 允许所有域的请求
app.use(cors());

app.post('/convert', async (req, res) => {
  try {
    const { videoUrl } = req.body;

    if (!videoUrl) {
      return res.status(400).json({ error: 'Missing videoUrl parameter' });
    }

    const videoFileName = 'inputVideo.mp4';
    const audioFileName = 'outputAudio.mp3';

    // Download the video file
    const response = await axios.get(videoUrl, { responseType: 'arraybuffer' });
    fs.writeFileSync(videoFileName, Buffer.from(response.data));

    // Convert video to audio using ffmpeg
    await new Promise((resolve, reject) => {
      ffmpeg()
        .input(videoFileName)
        .audioCodec('libmp3lame')
        .toFormat('mp3')
        .on('end', () => resolve())
        .on('error', (err) => reject(err))
        .save(audioFileName);
    });

    // Send the converted audio file to the client
    res.download(audioFileName, (err) => {
      if (err) {
        console.error(err);
        res.status(500).json({ error: 'Internal server error' });
      }

      // Clean up temporary files
      fs.unlinkSync(videoFileName);
      fs.unlinkSync(audioFileName);
    });
  } catch (err) {
    console.error(err);
    res.status(500).json({ error: 'Internal server error' });
  }
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

如果不想用控制台,也可以用暴力猴,暴力猴脚本如下:文章来源地址https://www.toymoban.com/news/detail-816888.html

// ==UserScript==
// @name         New Userscript
// @namespace    http://tampermonkey.net/
// @version      2024-01-12
// @description  try to take over the world!
// @author       You
// @match        https://www.douyin.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=douyin.com
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Your code here...
    // 目标节点
    var targetNode = document.querySelector('ul[data-e2e="scroll-list"]');

    // 初始时的li数量
    var initialCount = targetNode.children.length;

    // 配置观察器的设置
    var config = { childList: true };

    // 观察器回调
    var callback = function(mutationsList, observer) {
        // 当前的li数量
        var currentCount = targetNode.children.length;

        // 检查li数量是否增加
        if (currentCount > initialCount) {
            // 执行你的函数
            addWatch();
            console.log('添加监听器')

            // 更新初始时的li数量
            initialCount = currentCount;
        }
    };

    // 创建一个观察器实例并传入回调函数
    var observer = new MutationObserver(callback);

    // 使用配置和目标节点开始观察
    observer.observe(targetNode, config);



  // 给所有 li 添加监听器
  function addWatch() {
      // 获取作者的视频列表
      var liElements = document.querySelectorAll('ul[data-e2e="scroll-list"] li');

      // 添加鼠标悬停事件监听器
      liElements.forEach(function(li) {
          li.addEventListener('mouseenter', function() {
              // 添加键盘按下事件监听器
              document.addEventListener('keydown', keydownHandler);
          });

          li.addEventListener('mouseleave', function() {
              // 移除键盘按下事件监听器
              document.removeEventListener('keydown', keydownHandler);
          });
      });
  }

  // 处理键盘按下事件
  function keydownHandler(event) {
    // 判断按下的键是否为 'D' 键,keyCode为 '68'
    if (event.keyCode === 68) {
      // 获取下载链接
      var sourceTag = document.querySelector('.basePlayerContainer xg-video-container > video > source:nth-child(1)');
      const alt = document.querySelector('.basePlayerContainer').previousElementSibling.querySelector('img').getAttribute('alt');
	  // 找到第一个冒号并截取之后的部分
	  let contentAfterColon = alt.includes(':') ?
	  	alt.split(':').slice(1).join(':'):
	  	alt;
	  // 去除所有的.和空格
	  let resultString = contentAfterColon.replace(/[.\s]/g, '');
	  // 如果最终结果为空,替换为'空'
	  const name = resultString === '' ? '空' : resultString;

	  // 提取src属性值
	  var url = sourceTag.getAttribute('src');
      // 执行下载操作,这里使用一个假设的下载函数
      downloadFile(url, name);
    }
  }

  function downloadFile(url, name) {
      // 发送POST请求到后台接口
      fetch('http://localhost:3000/convert', {
          method: 'POST',
          headers: {
              'Content-Type': 'application/json',
          },
          body: JSON.stringify({ videoUrl: url }),
      })
          .then((response) => response.blob())
          .then((blob) => {
          // 创建一个临时的<a>元素用于下载
          const a = document.createElement('a');
          const url = window.URL.createObjectURL(blob);
          a.href = url;
          a.download = name + '.mp3';

          // 触发点击事件以启动下载
          a.click();

          // 释放URL对象
          window.URL.revokeObjectURL(url);
      })
          .catch((error) => {
          console.error('Error:', error);
          alert('下载失败,原因:' + error)
      });
  }


})();

到了这里,关于将抖音视频转成MP3并下载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 下载的音乐如何转成MP3?分享两种将音频转换为MP3格式的方法

    如果您下载了一些音频文件,但是它们不是MP3格式,那么您可能需要将它们转换为MP3格式,以便在各种设备上播放。以下是两种将音频转换为MP3格式的方法。 方法一:使用免费的在线转换工具 有许多免费的在线转换工具可以将音频文件转换为MP3格式,例如Zamzar、Online Conver

    2024年02月06日
    浏览(43)
  • Qt/C++音视频开发46-音视频同步保存到MP4

    用ffmpeg单独做视频保存不难,单独做音频保存也不难,难的是音视频同步保存到MP4中,重点是音视频要同步,其实这也不难,只要播放那边音视频同步后的数据,写入到文件即可。最难的是在播放过程中不断随机的切换播放进度,而且还会暂停播放、暂停录制的情况出现,这

    2024年02月17日
    浏览(51)
  • 音视频八股文(10)-- mp4结构

    mp4⽂件格式⼜被称为MPEG-4 Part 14,出⾃MPEG-4标准第14部分 。它是⼀种多媒体格式容器,⼴泛⽤于包装视频和⾳频数据流、海报、字幕和元数据等。(顺便⼀提,⽬前流⾏的视频编码格式AVC/H264 定义在MPEG-4 Part 10)。 mp4⽂件由box组成,每个box分为Header和Data。其中Header部分包含了

    2024年02月02日
    浏览(35)
  • 【音视频 ffmpeg 学习】 RTMP推流 mp4文件

    1.RTMP(实时消息传输协议)是Adobe 公司开发的一个基于TCP的应用层协议。 2.RTMP协议中基本的数据单元称为消息(Message)。 3.当RTMP协议在互联网中传输数据的时候,消息会被拆分成更小的单元,称为消息块(Chunk)。 (1). linux 环境准备 安装nginx 和 rtmp模块 下载nginx安装包 下载

    2024年02月03日
    浏览(48)
  • 【音视频开发】FFmpeg转换与封装 I - MP4格式

    1 FFmpeg转换与封装 1.1 MP4格式转换 1.1.1 MP4格式标准         FFmpeg支持的媒体封装格式具有多样性与全面性,与此, 我们还可以使用FFmpeg来对媒体格式进行转换与封装 。 在互联网常见的格式中,跨平台最好的应该是 MP4 文件,因为 MP4 文件既可以在PC 平台的Flashplayer中播放,

    2024年02月08日
    浏览(60)
  • 用ffmpeg解析mp4文件得到时长、比特率、音视频信息

    以下是使用C++语言调用FFmpeg获取视频流和音频流信息的示例代码: 上述代码通过 AVFormatContext 结构体和FFmpeg库函数 avformat_open_input 、 avformat_find_stream_info 等,获取MP4文件的视频流和音频流信息,并将结果存储到 MediaInfo 类中。在实际应用中,可以将上述代码封装成一个函数,

    2024年02月12日
    浏览(38)
  • 音视频知识:MPEG-4、H264、MP4、AAC之间的关系

    MPEG-4 一种编码标准。是国际标准化组织 (ISO) 主要针对消费类应用,已经针对运动图像压缩定义的标准。MPEG(Moving Picture Experts Group)标准包括 MPEG1、MPEG2与 MPEG4。 MPEG-4标准目前分为27个部分,统称为ISO/IEC14496国际标准。其中第10部分(ISO/IEC 14496-10)就是熟悉的高级视频编码

    2024年02月14日
    浏览(48)
  • Qt音视频开发47-文字和图片水印(可存储到MP4中)

    近期花了两周时间闭门啃硬骨头,主要就解决三个问题(音视频同步存储和推流、图片水印并将水印信息存储到文件或者推流、rtsp推流),这三个问题困扰了很多年,以至于找遍了网络和翻遍ffplay代码以及ffmpeg示例的代码,通过不下于上百次方案的调整和测试,几乎每次都是

    2024年02月16日
    浏览(33)
  • 【音视频笔记】Mediacodec+Muxer生成mp4,浏览器无法播放问题处理

    最近在测试视频录制功能时发现,AudioRecord + MediaCodec + MediaMuxer生成的MP4,PC浏览器无法播放 ,但是Android、Windows、Mac的播放器应用都能正常播放。虽然不禁想吐槽浏览器视频组件的容错性差,但我也意识生成的文件格式肯定也是有问题的。 然后尝试了合成MP4视频时,只保留视

    2024年02月07日
    浏览(50)
  • 怎么下载抖音视频无水印?教你三个无水印下载抖音视频方法

    怎么下载抖音视频无水印?抖音已经成为了我们日常生活与工作的无法割舍的一部分,每天数以亿计的用户在进行创作分享。在这个平台上,用户可以通过自己的所见所想进行创作和分享记录美好瞬间。然而,有些用户希望能够将自己喜欢的抖音视频保存到相册中,以便随时

    2024年02月03日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包