FFMPEG 如何从视频中提取声音并将其与图片结合

FFMPEG How to extract sound from a video and combine it with a picture

我用这个代码,但是图片看不到:(:
os.system(f'ffmpeg -stream_loop -1 -re -i {dir_path}/maxresdefault.jpg -re -i "{url}" -c:v libx264 -preset superfast -b:v 2500k -bufsize 3000k -maxrate 5000k -c:a aac -ar 44100 -b:a 128k -pix_fmt yuv420p -f flv rtmp://a.rtmp.youtube.com/live2/###########')
代码的主要部分:

 p=Playlist("https://www.youtube.com/playlist?list=PLSVhVwIpndKJyjEltpgM37o-OoH1p1840")
for video in p.videos[4:len(p.videos)]:
    url=""
    while True:
        try:
            url=video.streams.get_highest_resolution().url
            
            break
        except:
            continue
    print(video.title)
    ffmpeg(url)##code,that i wrote upper

url 是 youtube 视频

看起来 -stream_loop 没有正常工作(我不知道原因)。

  • -i im001.jpg 之前添加 -f image2 - 强制 FFmpeg 将输入作为图像获取(它应该是默认设置,但我认为使用 -stream_loop 时存在问题) .
  • 从视频输入中删除 -re(我认为将 -re-stream_loop 一起使用时会出现问题)。
  • 添加-r 1用于将输入的帧速率设置为1Hz(不是必须的,但默认帧速率对于单个图像来说太高了)。
  • 在音频输入之前添加 -vn - 确保 FFmpeg 不会解码来自 URL 的视频(以防有视频流)。
  • 我添加了 -vf "setpts=N/1/TB" -af "asetpts=PTS-STARTPTS" -map:v 0:v -map:a 1:a 以更正时间戳和映射(我们可能不需要它)。 "setpts=N/1/TB"中的1是视频帧率。
  • 我添加了 -bsf:v dump_extra(我认为我们需要它来进行 FLV 流式传输)。
  • 添加-shortest -fflags +shortest音频结束时退出。

我不知道如何将它流式传输到 YouTube。
我使用localhost和FFplay作为监听器(视频出现需要一些时间)。


这是完整的代码示例:

from pytube import YouTube, Playlist
import subprocess as sp
import os

p = Playlist("https://www.youtube.com/playlist?list=PLSVhVwIpndKJyjEltpgM37o-OoH1p1840")

rtmp_url = "rtmp://127.0.0.1:1935/live/test" # Used localhost for testing (instead of streaming to YouTube).

for video in p.videos[4:len(p.videos)]:
    url=""
    while True:
        try:
            url=video.streams.get_highest_resolution().url
            break
        except:
            continue
    print(video.title)

    # Start the TCP server first, before the sending client.
    ffplay_process = sp.Popen(['ffplay', '-listen', '1', '-i', rtmp_url])  # Use FFplay sub-process for receiving the RTMP video.

    os.system(f'ffmpeg -r 1 -stream_loop -1 -f image2 -i maxresdefault.jpg -re -vn -i "{url}" -vf "setpts=N/1/TB" -af "asetpts=PTS-STARTPTS" -map:v 0:v -map:a 1:a -c:v libx264 -preset superfast -b:v 2500k -bufsize 5000k -maxrate 5000k -pix_fmt yuv420p -c:a aac -ar 44100 -b:a 128k -shortest -fflags +shortest -f flv -bsf:v dump_extra {rtmp_url}')

    ffplay_process.kill()  # Forcefully terminate FFplay sub-process.

请确保它首先与 FFplay 一起工作(它应该是可重现的)。
将我示例中的 rtmp_url 替换为 rtmp://a.rtmp.youtube.com/live2/###########.