generativeai_video.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. import asyncio
  2. import os
  3. import aiohttp
  4. import requests
  5. import google.generativeai as genai
  6. from google.generativeai import caching
  7. import datetime
  8. import time
  9. import uuid
  10. class VideoAnalyzer:
  11. def __init__(self, api_key):
  12. """初始化类,配置 API 密钥和视频路径"""
  13. genai.configure(api_key=api_key)
  14. self.video_file = None
  15. async def process_and_delete_file(self, file_path):
  16. """删除文件"""
  17. try:
  18. print(f"正在处理文件: {file_path}" )
  19. os.remove( file_path )
  20. print( f"文件已删除: {file_path}" )
  21. except Exception as e:
  22. print( f"处理或删除文件时发生错误: {str( e )}" )
  23. async def download_video(self, video_url, save_directory='/root/google_ai_studio/path'):
  24. # async def download_video(self, video_url, save_directory='/Users/tzld/Desktop/google_ai_studio/path'):
  25. """从给定的视频链接下载视频并保存到指定路径"""
  26. try:
  27. # 发送 GET 请求获取视频内容
  28. random_filename = f"{uuid.uuid4()}.mp4"
  29. save_path = os.path.join(save_directory, random_filename)
  30. async with aiohttp.ClientSession() as session:
  31. async with session.get( video_url ) as response:
  32. response.raise_for_status() # 检查请求是否成功
  33. with open( save_path, 'wb' ) as video_file:
  34. while True:
  35. chunk = await response.content.read( 1024 * 1024 ) # 每次读取 1MB
  36. if not chunk:
  37. break
  38. video_file.write( chunk )
  39. print( f"视频已成功下载并保存到: {save_path}" )
  40. return save_path
  41. except requests.exceptions.RequestException as e:
  42. print( f"下载视频时出现错误: {e}" )
  43. return None
  44. async def upload_video(self, save_path):
  45. """上传视频文件并获取视频文件对象"""
  46. self.video_file = genai.upload_file(path=save_path)
  47. await self._wait_for_processing()
  48. async def _wait_for_processing(self):
  49. """等待视频文件处理完成"""
  50. while self.video_file.state.name == 'PROCESSING':
  51. print( '等待视频处理完成...' )
  52. await asyncio.sleep(2) # 使用异步睡眠代替阻塞睡眠
  53. self.video_file = genai.get_file( self.video_file.name )
  54. print( f'视频处理完成: {self.video_file.uri}' )
  55. async def create_cache(self):
  56. """创建缓存内容,并返回生成模型"""
  57. cache = caching.CachedContent.create(
  58. model='models/gemini-1.5-flash-001',
  59. display_name='AIzaSyDs4FWRuwrEnQzu1M_Skio6NII6Mp4whAw',
  60. system_instruction=(
  61. '你是一个专业的视频分析师,负责根据访问的视频文件回答用户的所有问题。'
  62. ),
  63. contents=[self.video_file],
  64. ttl=datetime.timedelta( minutes=5 ),
  65. )
  66. return genai.GenerativeModel.from_cached_content( cached_content=cache )
  67. async def analyze_video(self, model, questions):
  68. """根据缓存模型生成视频分析结果"""
  69. response = model.generate_content([(questions)])
  70. return response
  71. async def main(video_path):
  72. """主函数,执行视频上传、缓存创建、问题生成"""
  73. # video_path = '/root/3333.mp4'
  74. api_key = 'AIzaSyDs4FWRuwrEnQzu1M_Skio6NII6Mp4whAw'
  75. # 初始化视频分析类
  76. analyzer = VideoAnalyzer(api_key )
  77. save_path = await analyzer.download_video(video_path)
  78. if not save_path:
  79. if os.path.exists( save_path ):
  80. os.remove( save_path )
  81. print( f"文件已删除: {save_path}" )
  82. print("视频下载失败")
  83. # 上传并处理视频
  84. await analyzer.upload_video(save_path)
  85. # 创建缓存模型
  86. model =await analyzer.create_cache()
  87. # 视频分析问题
  88. video_analysis_questions = """
  89. 一、基础信息:
  90. 1.视觉/音乐/文字: 请从视频中的视觉、音乐、文字这三个维度信息做分析比较,哪个维度的信息是该视频中最重要的,可能成为该视频的要点驱动力?你只要回答 视觉/音乐/文字 三者其一即可。
  91. 2.内容选题: 如果需要从视频中提取一个内容选题,你觉得应该是什么?请注意:选题应该体现视频的关键点,亮点,爆点,选题不能超过8个字。
  92. 3.视频主题:描述视频的整体主题。
  93. 二、主体和场景:
  94. 1.视频主体:视频中的核心人物或物体,有几个?分别是什么?
  95. 2.视频场景:视频属于什么场景?场景可以有多个,每个不超过6个字
  96. 三、情感与风格:
  97. 1.情感倾向:视频传递的情感是积极、消极还是中立或其他?
  98. 2.视频风格:判断视频的风格类型(如严肃、轻松、幽默等)。
  99. 四、视频传播性与观众:
  100. 1.片尾引导
  101. 视频片尾是否有引导观众分享?
  102. 引导时长?
  103. 引导强度如何?
  104. 2.传播性判断:基于中国中老年微信用户,判断该视频的传播性并说明依据。
  105. 3.观众画像:
  106. 推测观众的年龄
  107. 推测观众的性别
  108. 推测观众的地域
  109. 五、音画细节:
  110. 1.音频细节
  111. 视频中的音频信息,是否有歌曲?
  112. 视频中的音频信息,歌曲名是什么?
  113. 视频中的音色音色是怎样的?
  114. 2.视频水印
  115. 是否有产品名相关的水印?
  116. 水印是否涉及产品名称什么?
  117. 3.视频字幕
  118. 是否有字幕?
  119. 字幕的颜色?
  120. 字幕的字号?
  121. 字幕的位置如何?
  122. 4. 视频口播:提供视频中出现的准确且完整的口播内容。
  123. 六、人物与场景:
  124. 1.知名人物
  125. 视频或音频中是否出现知名人物?
  126. 视频或音频中是否出现知名人物是谁?
  127. 2.人物年龄段:视频中人物的年龄段(如中青年男、中青年女等)。
  128. 3.场景描述:视频和声音中涉及的场景描述。
  129. 七、时效性与分类:
  130. 1.时效性:
  131. 适用时效日
  132. 适用时效早中晚
  133. 2.视频一级分类:判断视频分别属于下面的哪种一级分类,并输出准确完整的一级品类_分类名称:
  134. 一级分类范围为:
  135. 一级品类_音乐
  136. 一级品类_剧情 / 剧情演绎
  137. 一级品类_二次元
  138. 一级品类_游戏
  139. 一级品类_公益
  140. 一级品类_随拍 / 颜值
  141. 一级品类_舞蹈
  142. 一级品类_动物 / 萌宠
  143. 一级品类_三农
  144. 一级品类_科技 / 科技数码
  145. 一级品类_财经
  146. 一级品类_母婴 / 母婴亲子
  147. 一级品类_法律 / 人文社科
  148. 一级品类_科普 / 人文社科
  149. 一级品类_情感 / 情感心理
  150. 一级品类_职场 / 人文社科
  151. 一级品类_教育 / 教育培训
  152. 一级品类_摄影摄像
  153. 一级品类_艺术 / 才艺技能
  154. 一级品类_美食
  155. 一级品类_旅行 / 旅游
  156. 一级品类_地域本地
  157. 一级品类_时尚 / 时尚 / 美妆
  158. 一级品类_文化 / 人文社科
  159. 一级品类_搞笑 / 休闲娱乐
  160. 一级品类_明星 / 名人
  161. 一级品类_综艺
  162. 一级品类_影视综艺
  163. 一级品类_电影
  164. 一级品类_影视综艺
  165. 一级品类_电视剧
  166. 一级品类_影视综艺
  167. 一级品类_汽车
  168. 一级品类_体育 / 运动
  169. 一级品类_医疗健康 / 长寿 / 健身
  170. 一级品类_生活记录 / 生活
  171. 一级品类_生活家居 / 家居家装
  172. 一级品类_时政社会
  173. 一级品类_奇人异象
  174. 一级品类_历史
  175. 一级品类_军事
  176. 一级品类_宗教
  177. 一级品类_短剧
  178. 一级品类_收藏品
  179. 3.二级分类: 判断视频分别属于下面的哪种二级分类,并输出准确完整的品类-分类名称
  180. 二级分类范围为:
  181. 品类-祝福音乐
  182. 品类-人生感悟音乐
  183. 品类-民族异域音乐
  184. 品类-亲情音乐
  185. 品类-红歌老歌
  186. 品类-音乐知识
  187. 品类-正能量剧情
  188. 品类-对口型表演
  189. 品类-快闪
  190. 品类-拟真游戏
  191. 品类-麻将
  192. 品类-棋牌
  193. 品类-老年审美美女
  194. 品类-老年审美帅哥
  195. 品类-红歌老歌舞蹈
  196. 品类-广场舞
  197. 品类-舞蹈教程
  198. 品类-宠物日常
  199. 品类-动物表演
  200. 品类-生动物
  201. 品类-农村生活
  202. 品类-农业技术
  203. 品类-老年相关科技
  204. 品类-未来科幻
  205. 品类-国家科技力量
  206. 品类-保险
  207. 品类-理财
  208. 品类-亲子日常
  209. 品类-K12教育
  210. 品类-老年相关法律科普
  211. 品类-知识科普
  212. 品类-生活技巧科普
  213. 品类-怀念时光
  214. 品类-人生忠告
  215. 品类-迷信祝福
  216. 品类-节日祝福
  217. 品类-早中晚好
  218. 品类-退休前
  219. 品类-退休后
  220. 品类-益智解密
  221. 品类-老年教育
  222. 品类-风景实拍
  223. 品类-动植物实拍
  224. 品类-人像模特实拍
  225. 品类-摄影教学
  226. 品类-名画赏析
  227. 品类-杂技柔术
  228. 品类-魔术
  229. 品类-魔术特效
  230. 品类-书法
  231. 品类-绘画
  232. 品类-木工
  233. 品类-口技
  234. 品类-大型集体艺术
  235. 品类-戏曲戏剧
  236. 品类-二人转
  237. 品类-其他才艺
  238. 品类-美食测评
  239. 品类-美食教程
  240. 品类-吃播探店
  241. 品类-旅行记录
  242. 品类-旅行攻略
  243. 品类-省份城市亮点
  244. 品类-本地新闻
  245. 品类-本地生活
  246. 品类-老年时尚
  247. 品类-美妆护肤穿搭
  248. 品类-传统文化
  249. 品类-国际文化
  250. 品类-搞笑瞬间合集
  251. 品类-搞笑段子
  252. 品类-历史名人
  253. 品类-当代正能量人物
  254. 品类-老明星
  255. 品类-老年人上综艺
  256. 品类-老年关心纪录片
  257. 品类-老综艺影像
  258. 品类-电影切片
  259. 品类-电影解说
  260. 品类-电视剧切片
  261. 品类-电视剧解说
  262. 品类-中国队比赛
  263. 品类-老年运动
  264. 品类-健康知识
  265. 品类-长寿知识
  266. 品类-饮食健康
  267. 品类-健身操
  268. 品类-老年生活
  269. 品类-生活小妙招
  270. 品类-园艺花艺
  271. 品类-民生政策
  272. 品类-流行病疫情
  273. 品类-社会风气
  274. 品类-食品安全
  275. 品类-贪污腐败
  276. 品类-人财诈骗
  277. 品类-核污染
  278. 品类-惠民新闻
  279. 品类-天气变化
  280. 品类-国家力量
  281. 品类-国际时政
  282. 品类-他国政策
  283. 品类-惊奇事件
  284. 品类-罕见画面
  285. 品类-中国战争史
  286. 品类-中国党史
  287. 品类-中国历史影像
  288. 品类-国际军事
  289. 品类-国内军事
  290. 品类-国家统一
  291. 输出格式:要求输出格式为符合RFC8259标准的JSON格式的字符串
  292. """
  293. # 分析视频并打印结果
  294. response =await analyzer.analyze_video( model, video_analysis_questions )
  295. print( response.usage_metadata )
  296. print(response.text)
  297. if os.path.exists( save_path ):
  298. os.remove( save_path )
  299. print( f"文件已删除: {save_path}" )
  300. return response.text
  301. if __name__ == "__main__":
  302. proxy_url = 'http://127.0.0.1:1081'
  303. os.environ["http_proxy"] = proxy_url
  304. os.environ["https_proxy"] = proxy_url
  305. video_path = 'http://rescdn.yishihui.com/jq_oss/video/2024092315510095449.mp4'
  306. asyncio.run(main(video_path))