-
Notifications
You must be signed in to change notification settings - Fork 205
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
还没有开源实时流吗?在不开源我要开源我的自己写的接的实时流了 #103
Comments
这个跟模型没有关系,作者还是所精力用到优化模型上,这个才是最重要的技术。因为时时流要用到队列, 做起来只是繁琐,不难。稍微懂点python都会,可以找个开发我觉得 |
用队列也不繁琐啊,就是一直推呗,没图片帧就推一段默认的静音视频就好了,参考livingtalk做的 |
你先画个流程图 |
不麻烦你来试一下,各种不兼容够你吃苦头的~~ |
我已经做完了啊,有demo了,看看需要的人多我就自己搞个项目 |
支持。目前这个是不是不能训练泛型呀。只能是单个人的。 |
可以发个最原始的demo过来看看,怎么处理视频音频同步的。 以下是我之前写的,感觉有问题,就没再研究 yongen_diy.wav #代码如下:
import cv2
import numpy as np
import queue
import threading
import time
from pydub import AudioSegment
import simpleaudio as sa
# 模拟音频帧生成
def generate_audio_frames(audio_queue):
# 加载音频文件
audio = AudioSegment.from_file("yongen_diy.wav")#("yongen_diy.wav", format="wav") #("1.mp3", format="mp3")
# 转换为 numpy 数组
samples = np.array(audio.get_array_of_samples())
# 设置每帧的样本数(假设采样率为 44100 Hz,每帧 25 帧)
frame_rate = audio.frame_rate # 24000
frame_duration_ms = 100 # 每帧 25 毫秒
frame_size = int(frame_duration_ms * frame_rate / 1000) # 计算每帧的样本数,其中 1000 为毫秒也就是1秒 最后 * 比例
# print(frame_size) #600
# 分割音频为帧
for i in range(0, len(samples), frame_size): #输出0-len(samples)的数据,间隔步长为:frame_size
frame = samples[i:i + frame_size]
# print( str(i)+':'+ str(i+frame_size) ) # 0:600 600:1200 1200:1800 1800:2400
if len(frame) == frame_size: # 确保每个帧的长度一致 600 600
audio_queue.put(frame)
# time.sleep(0.02) # 模拟音频帧率 50fps
# 模拟视频帧生成
def generate_video_frames(video_queue):
cap = cv2.VideoCapture("1.mp4")
while True:
ret, frame = cap.read()
if not ret:
break
video_queue.put(frame)
# time.sleep(0.04) # 模拟视频帧率 25fps
cap.release()
# 处理同步的音频和视频帧
def process_frames(audio_queue, video_queue):
while True:
audio_frame = audio_queue.get()
video_frame = video_queue.get()
# 在这里处理音频和视频帧
print(f"Audio data shape: {audio_frame.shape}, Video frame shape: {video_frame.shape}")
# 显示视频帧
cv2.imshow('Video', video_frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 播放声音
frame_rate = 24000 # 设置每帧的样本数(假设采样率为 44100 Hz,每帧 25 帧)
play_audio_frame(audio_frame, frame_rate)
# 播放音频帧
def play_audio_frame(frame, sample_rate):
# 将 numpy 数组转换为字节
audio_bytes = frame.astype(np.int16).tobytes()
# 创建一个简单的音频对象并播放
wave_obj = sa.WaveObject(audio_bytes, 1, 2, sample_rate)
play_obj = wave_obj.play()
play_obj.wait_done() # 等待播放完成
# 主函数
def main():
audio_queue = queue.Queue(maxsize=10)
video_queue = queue.Queue(maxsize=10)
audio_thread = threading.Thread(target=generate_audio_frames, args=(audio_queue,))
video_thread = threading.Thread(target=generate_video_frames, args=(video_queue,))
process_thread = threading.Thread(target=process_frames, args=(audio_queue, video_queue))
audio_thread.start()
video_thread.start()
process_thread.start()
audio_thread.join()
video_thread.join()
process_thread.join()
if __name__ == "__main__":
main() |
请问可以把这部分开源出来吗 |
求一份代码 |
1 similar comment
求一份代码 |
多,赶紧搞! |
需要代码的留一下邮箱,我已经接入webrtc了 |
留一下邮箱 |
[email protected] |
[email protected] 求代码,感谢 |
[email protected] 代码借鉴一下看看,跟我上面那么简单好理解不? |
yongen_diy.wav #我的这个声音与视频已经同步了,但是有一点遗憾,不知为什么,声音一断一断的,感觉被强行分割一样~~。 不知道是不是simpleaudio的问题
import cv2
import numpy as np
import queue
import threading
import queue
import torch
import cv2
from pydub import AudioSegment
import simpleaudio as sa
# 假设我们有一个视频文件和一个音频文件
audio_path = 'yongen_diy.wav'
video_path = '1.mp4'
# 创建两个队列,一个用于视频帧,一个用于音频样本
video_queue = queue.Queue(maxsize=500)
audio_queue = queue.Queue(maxsize=500)
# 模拟音频帧生成
def load_audio(audio_path):
# 加载音频文件
audio = AudioSegment.from_file(audio_path)#("yongen_diy.wav", format="wav") #("1.mp3", format="mp3")
# 转换为 numpy 数组
samples = np.array(audio.get_array_of_samples())
frame_rate = audio.frame_rate # 44100 意思是:每秒采样44100次
frame_size=frame_rate//25 #一秒声音分担到25张图片上。 # 44100 意思是:每秒采样44100次
# 分割音频为帧
for i in range(0, len(samples), frame_size): #输出0-len(samples)的数据,间隔步长为:frame_size
frame = samples[i:i + frame_size]
# print( str(i)+':'+ str(i+frame_size) ) # 0:600 600:1200 1200:1800 1800:2400
if len(frame) == frame_size: # 确保每个帧的长度一致 600 600
audio_queue.put(frame)
# time.sleep(0.02) # 模拟音频帧率 50fps
# 模拟视频帧生成 - 每秒25帧
def load_video(video_path):
cap = cv2.VideoCapture(video_path)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
if not video_queue.full():
video_queue.put(frame) # 将视频帧放入队列
# 创建线程来加载数据
video_thread = threading.Thread(target=load_video, args=(video_path,))
audio_thread = threading.Thread(target=load_audio, args=(audio_path,))
video_thread.start()
audio_thread.start()
# 播放音频帧
def play_audio_frame(frame, sample_rate):
# 将 numpy 数组转换为字节
audio_bytes = frame.astype(np.int16).tobytes()
# 创建一个简单的音频对象并播放
wave_obj = sa.WaveObject(audio_bytes, 1, 2, sample_rate)
play_obj = wave_obj.play()
play_obj.wait_done() # 等待播放完成
# 主循环,从队列中取出数据进行处理
while True:
try:
video_frame = video_queue.get(timeout=1) # 从视频队列中取帧
audio_frame = audio_queue.get(timeout=1) # 从音频队列中取样本
print(f"Audio data shape: {audio_frame.shape}, Video frame shape: {video_frame.shape}")
# 对视频帧和音频样本进行处理,例如:
# 1. 预处理视频帧
# 2. 预处理音频样本
# 3. 将处理后的数据送入模型
# 显示视频帧
cv2.imshow('Video', video_frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 播放声音
frame_rate = 24000 # 设置每帧的样本数(假设采样率为 44100 Hz,每帧 25 帧)
play_audio_frame(audio_frame, frame_rate)
# 处理完毕后,可以选择释放内存
video_queue.task_done()
audio_queue.task_done()
except queue.Empty:
# 如果队列为空,可以选择退出循环或者继续等待
break
# 等待所有任务完成
video_thread.join()
audio_thread.join() |
default.mp4视频演示,实测GTX1050 ,4G显卡,显卡好跑的更快,跟图片的清晰度也有关系,测过480p可以流畅跑,基本可实时 |
技术细节加q3995830564 |
已有开源实现,让我们拥抱开源,让技术更加开放https://github.com/lipku/LiveTalking |
是的,不过这个显存占用还是蛮高的,有条件的,重量级的完全推荐用这个 |
|
加q |
No description provided.
The text was updated successfully, but these errors were encountered: