con*_*449 8 python video opencv video-processing
我有一段人们说话的视频。我还有一份成绩单。我将单词分成句子,这样我就可以在屏幕上一次显示一个句子,就像电影中的普通字幕一样。为此,我创建了一个 csv,其中每个帧都有一行,并且每行都包含该句子时间块内的完整句子。这样,我循环遍历所有帧,并将该句子的文本放在该句子内的每个帧上。我是在 OpenCV 中做的。
\n样本成绩单 csv:
\nframe sentence\n0 hello\n1 hello\n2 how are you\n3 how are you\n4 how are you\n5 how are you\n6 how are you\n7 how are you \n8 fine\n...\n
Run Code Online (Sandbox Code Playgroud)\ncsv 的长度与视频中的帧数相同。要绘制字幕,我这样做:
\nimport cv2\nimport pandas as pd\n\ndf = pd.read_csv('data.csv')\nvideo = cv2.VideoCapture('vid.mp4')\nnum_frames = video.get(cv2.CAP_PROP_FRAME_COUNT)\n\nassert len(df) == num_frames\n\nfor i in list(range(0, num_frames)):\n ret, frame = video.read()\n cv2.putText(frame, str(df.sentence), (0,50),cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 3, cv2.LINE_AA, True)\n\n # additional standard cv2 code below...\n
Run Code Online (Sandbox Code Playgroud)\n这可行,但现在我没有任何音频。我知道 OpenCV 不适用于任何音频,但是还有其他解决方法吗?这种方法在我的管道中效果很好,因此我希望能够将这些帧写入新视频,但保留音频,同时使用尽可能少的附加库。
\n使用建议的 moviepy 解决方案后,我得到一个没有音频的带字幕视频,并出现以下错误:
\nMoviepy - Building video vidout.mp4.\nMoviePy - Writing audio in vidoutTEMP_MPY_wvf_snd.mp3\nMoviePy - Done. \nMoviepy - Writing video vidout.mp4\n\nt: 100%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x89| 23069/23084 [07:26<00:00, 66.35it/s, now=None]Traceback (most recent call last):\n File "/Users/asi/anaconda3/lib/python3.7/site-packages/moviepy/Clip.py", line 472, in iter_frames\n frame = self.get_frame(t)\n File "<decorator-gen-11>", line 2, in get_frame\n File "/Users/asi/anaconda3/lib/python3.7/site-packages/moviepy/decorators.py", line 89, in wrapper\n return f(*new_a, **new_kw)\n File "/Users/asi/anaconda3/lib/python3.7/site-packages/moviepy/Clip.py", line 93, in get_frame\n return self.make_frame(t)\n File "/Users/asi/anaconda3/lib/python3.7/site-packages/moviepy/Clip.py", line 136, in <lambda>\n newclip = self.set_make_frame(lambda t: fun(self.get_frame, t))\n File "/Users/asi/anaconda3/lib/python3.7/site-packages/moviepy/video/VideoClip.py", line 490, in <lambda>\n return self.fl(lambda gf, t: image_func(gf(t)), apply_to)\n File "make_demo.py", line 65, in pipeline\n cv2.putText(frame, str(next(dfi)[1].word), (0, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 3, cv2.LINE_AA, True)\nStopIteration\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n File "make_demo.py", line 72, in <module>\n out_video.write_videofile("vidout.mp4", audio=True)\n File "<decorator-gen-55>", line 2, in write_videofile\n File "/Users/asi/anaconda3/lib/python3.7/site-packages/moviepy/decorators.py", line 54, in requires_duration\n return f(clip, *a, **k)\n File "<decorator-gen-54>", line 2, in write_videofile\n File "/Users/asi/anaconda3/lib/python3.7/site-packages/moviepy/decorators.py", line 135, in use_clip_fps_by_default\n return f(clip, *new_a, **new_kw)\n File "<decorator-gen-53>", line 2, in write_videofile\n File "/Users/asi/anaconda3/lib/python3.7/site-packages/moviepy/decorators.py", line 22, in convert_masks_to_RGB\n return f(clip, *a, **k)\n File "/Users/asi/anaconda3/lib/python3.7/site-packages/moviepy/video/VideoClip.py", line 307, in write_videofile\n logger=logger)\n File "/Users/asi/anaconda3/lib/python3.7/site-packages/moviepy/video/io/ffmpeg_writer.py", line 221, in ffmpeg_write_video\n fps=fps, dtype="uint8"):\nRuntimeError: generator raised StopIteration\n\n
Run Code Online (Sandbox Code Playgroud)\n
如果可以添加一个额外的库,您可以使用moviepy
具有音频支持的库:
import cv2
import pandas as pd
from moviepy.editor import VideoFileClip
def pipeline(frame):
try:
cv2.putText(frame, str(next(dfi)[1].sentence), (0, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 3, cv2.LINE_AA, True)
except StopIteration:
pass
# additional frame manipulation
return frame
dfi = pd.read_csv('data.csv').iterrows()
video = VideoFileClip("vid.mp4")
out_video = video.fl_image(pipeline)
out_video.write_videofile("vidout.mp4", audio=True)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
15569 次 |
最近记录: |