使用 VLC 库从直播中保存音频
Saving audio from livestream using VLC library
我正在尝试使用 VLC 库从实时流中保存音频剪辑(每个剪辑 15 秒)。我找不到任何选项可以让我只录制直播中的 15 秒。因此,我最终在我的代码中使用了计时器,但录制的剪辑有时包含 10 秒,有时包含 20 秒(很少有 15 秒)。此外,有时音频内容会在剪辑中重复出现。
这是代码(我是新手所以请指导我)
Code.py
import os
import sys
import vlc
import time
clipNumber = sys.argv[1]
filepath = 'http://streamer64.eboundservices.com/geo/geonews_abr/playlist.m3u8'
movie = os.path.expanduser(filepath)
if 'http://' not in filepath:
if not os.access(movie, os.R_OK):
print ( 'Error: %s file is not readable' % movie )
sys.exit(1)
filename_and_command = "--sout=#transcode{vcodec=none,acodec=mp3,ab=320,channels=2,samplerate=44100}:file{dst=clip" + str(clipNumber) + ".mp3}"
# filename_and_command = "--sout=file/ts:clip" + str(clipNumber) + ".mp3"
instance = vlc.Instance(filename_and_command)
try:
media = instance.media_new(movie)
except NameError:
print ('NameError: % (%s vs Libvlc %s)' % (sys.exc_info()[1],
vlc.__version__, vlc.libvlc_get_version()))
sys.exit(1)
player = instance.media_player_new()
player.set_media(media)
player.play()
time.sleep(15)
exit()
现在我想录制 1 分钟的直播,我从 bash 脚本中调用此 python 代码 4 次,它创建了 4 个音频剪辑(clip1.mp3、clip2 .mp3、clip3.mp3 和 clip4.mp3)
Script.sh
for ((i=1; i<=4; i++))
do
printf "Recording stream #%d\n", "$i"
python code.py "$i"
printf "Finished stream #%d\n", "$i"
done
是否可以只用 Python 循环代码而不是用 bash 脚本一次又一次地调用(我试图将代码放在 python 的循环中,但是第一个剪辑 - clip1 - 一直在录制并且永远不会完成录制)。以及一种指定我只能从直播中录制 15 秒而不是使用 time.sleep(15)
的方法
如果只是想保存文件,可以不用vlc。这是我用来执行此操作的一个简短程序:
def record(filepath, stream, duration):
fd = open(filepath, 'wb')
begin = datetime.now()
duration = timedelta(milliseconds=duration)
while datetime.now() - begin < duration:
data = stream.read(10000)
fd.write(data)
fd.close()
一秒内记录使用示例:
from urllib.request import urlopen
record('clip.mp3', urlopen('http://streamer64.eboundservices.com/geo/geonews_abr/playlist.m3u8'), 1000)
所有需要的工作都可以使用 FFMPEG 轻松完成:
ffmpeg -i streamURL -c copy -vn -ac 2 -acodec aac -t 15
-vn 仅录制音频部分(无视频)
-t 用于指定要录制的流的持续时间(此处为 15 秒)
我正在尝试使用 VLC 库从实时流中保存音频剪辑(每个剪辑 15 秒)。我找不到任何选项可以让我只录制直播中的 15 秒。因此,我最终在我的代码中使用了计时器,但录制的剪辑有时包含 10 秒,有时包含 20 秒(很少有 15 秒)。此外,有时音频内容会在剪辑中重复出现。 这是代码(我是新手所以请指导我)
Code.py
import os
import sys
import vlc
import time
clipNumber = sys.argv[1]
filepath = 'http://streamer64.eboundservices.com/geo/geonews_abr/playlist.m3u8'
movie = os.path.expanduser(filepath)
if 'http://' not in filepath:
if not os.access(movie, os.R_OK):
print ( 'Error: %s file is not readable' % movie )
sys.exit(1)
filename_and_command = "--sout=#transcode{vcodec=none,acodec=mp3,ab=320,channels=2,samplerate=44100}:file{dst=clip" + str(clipNumber) + ".mp3}"
# filename_and_command = "--sout=file/ts:clip" + str(clipNumber) + ".mp3"
instance = vlc.Instance(filename_and_command)
try:
media = instance.media_new(movie)
except NameError:
print ('NameError: % (%s vs Libvlc %s)' % (sys.exc_info()[1],
vlc.__version__, vlc.libvlc_get_version()))
sys.exit(1)
player = instance.media_player_new()
player.set_media(media)
player.play()
time.sleep(15)
exit()
现在我想录制 1 分钟的直播,我从 bash 脚本中调用此 python 代码 4 次,它创建了 4 个音频剪辑(clip1.mp3、clip2 .mp3、clip3.mp3 和 clip4.mp3)
Script.sh
for ((i=1; i<=4; i++))
do
printf "Recording stream #%d\n", "$i"
python code.py "$i"
printf "Finished stream #%d\n", "$i"
done
是否可以只用 Python 循环代码而不是用 bash 脚本一次又一次地调用(我试图将代码放在 python 的循环中,但是第一个剪辑 - clip1 - 一直在录制并且永远不会完成录制)。以及一种指定我只能从直播中录制 15 秒而不是使用 time.sleep(15)
的方法如果只是想保存文件,可以不用vlc。这是我用来执行此操作的一个简短程序:
def record(filepath, stream, duration):
fd = open(filepath, 'wb')
begin = datetime.now()
duration = timedelta(milliseconds=duration)
while datetime.now() - begin < duration:
data = stream.read(10000)
fd.write(data)
fd.close()
一秒内记录使用示例:
from urllib.request import urlopen
record('clip.mp3', urlopen('http://streamer64.eboundservices.com/geo/geonews_abr/playlist.m3u8'), 1000)
所有需要的工作都可以使用 FFMPEG 轻松完成:
ffmpeg -i streamURL -c copy -vn -ac 2 -acodec aac -t 15
-vn 仅录制音频部分(无视频)
-t 用于指定要录制的流的持续时间(此处为 15 秒)