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/###########
.
我用这个代码,但是图片看不到:(:
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/###########
.