LiveTalking icon indicating copy to clipboard operation
LiveTalking copied to clipboard

看不懂大老是怎么把视频做成 流的~~

Open gg22mm opened this issue 1 year ago • 2 comments

图片 图片 看不懂是怎么回事~~

gg22mm avatar Oct 08 '24 07:10 gg22mm

俺也一样!

Heaverno avatar Oct 09 '24 06:10 Heaverno

大老是个流 操作高手中的高手~~ 正看啃代码,云里雾里的,我盲猜是通过队列来实现 音频与视频同步的。 ~~ , 感觉这块好复杂呀, 要是有个精简的例子就好了 。或是有别的更简单的方式~~

//不管是音频还是视频帧,都放队里中 video_track._queue.put(new_frame) frame = await self._queue.get()

res_frame_queue.put((res_frame,__mirror_index(length,index),audio_frames[i2:i2+2])) res_frame,idx,audio_frames = self.res_frame_queue.get(block=True, timeout=1)

gg22mm avatar Oct 09 '24 09:10 gg22mm

俺也不懂!

Heaverno avatar Oct 11 '24 01:10 Heaverno

一点浅见:process_frames承接同一个文件的inference函数的输出,在有数据时将人脸合成到原有图片上,否则采用原有视频的图片处理。然后将图片与视频合并放在audio与video track(webrtc.py) 中,计算时间戳,走webrtc channel发送。同步是基于图像帧数(25fps)与音频帧数(50fps)。所以那边会有个2倍的音频处理。

ThornbirdZhang avatar Oct 11 '24 04:10 ThornbirdZhang

简单的例子看看aiortc里的example

lipku avatar Oct 11 '24 12:10 lipku

一点浅见:process_frames承接同一个文件的inference函数的输出,在有数据时将人脸合成到原有图片上,否则采用原有视频的图片处理。然后将图片与视频合并放在audio与video track(webrtc.py) 中,计算时间戳,走webrtc channel发送。同步是基于图像帧数(25fps)与音频帧数(50fps)。所以那边会有个2倍的音频处理。

没做你说的这一步: 《然后将图片与视频合并放在audio》, 作者直接用图片了。 ~~ , 说白了就是直接推图片,一秒25张,与声音25帧到队列,然后从队列渲染到页面~~,然后接着从50开始依次循环..,没有牵扯到合并,合并就慢了. ~~不过我 想想都麻烦~~

作者是全网一个把视频与音频做成流来推送的,非常有创新 ~~,不过我感觉好麻烦呀~~

gg22mm avatar Oct 18 '24 03:10 gg22mm

如果把图片合并成视频再推流延时太高,ffmpeg合并图片成视频就算用h264_nvevc编码也是慢。

slash130 avatar Dec 19 '24 09:12 slash130


################# 为什么我试了一下,生成生成有有一些杂音,一顿一顿的? #################
from pydub import AudioSegment
from pydub.playback import play

# 加载音频文件
audio = AudioSegment.from_file("yongen_diy.wav")

frame_rate = audio.frame_rate  # 44100 意思是:每秒采样44100次,这里有个问题,我只要每张图的采样。(已知1秒25张图,那么=frame_rate//25就是每张图的采样)
frame_size=frame_rate//25 #每张图的采样=1秒采样声音分担到25张图片上(为什么是25因为每秒25帧=25张图,这样的话每秒杀采样平均分到25张图片上,每张图都对应相应的声音)。 # 44100 意思是:每秒采样44100次   
print('----2----',frame_size)

# 分割音频为帧
for i in range(0, len(audio), frame_size): #当前声音时长=(声音总时长毫秒,按每张图采样切割)。 输出0-len(samples)的数据,间隔步长为:frame_size 
    frame = audio[i:i + frame_size]   
    if len(frame) == frame_size:
    	print('--------------3-----',frame)
    	play(frame)# 播放音频片段



gg22mm avatar Jan 17 '25 08:01 gg22mm