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...\nRun 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...\nRun 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\nRun 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 次 |
| 最近记录: |