+
    z1Sjf                         R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RItR t	R t
R tR tR tR t^ RItR t^ RIt^ R	IHt R
 t^ RIt^ R	IHt R tR t^ RIt^ RIt^ R	IHt R t^ RIt^ RItR tR tR tR t]R8X  d
   ]! 4        R# R# )uj   
根据字幕图片和双语时间生成完整视频流
用法: python generate_bilingual_video.py <adid>
Nc           	        ^ RI pVP                  4       P                  P                  pVP                  4       P                  pRp \
        P                  ! VRR7      pVP                  4       pVP                  RV 34       . pVP                  4        F3  pVw  rrp\        V
4      p\        V4      pVP                  WWV34       K5  	  TV'       d   VP                  4        # #   \         dN   p^ RIp\        RT RT RT 24       TP!                  4        . u Rp?T'       d   TP                  4        # # Rp?ii ; i  T'       d   TP                  4        i i ; i)u    
从数据库获取字幕信息
Ng      $@timeoutzt
            SELECT idx, start, end, cn, en FROM srts 
            WHERE adid = ? 
            ORDER BY idx
           错误 [函数: 
   , 行号:    ]: 操作失败: )inspectcurrentframef_codeco_namef_linenosqlite3connectcursorexecutefetchallintappendclose	Exception	tracebackprint	print_exc)adiddb_pathr   	func_nameline_noconnr   	subtitlesrowidxstartendcnenstart_msend_mser   s   &&                7c:\dev\xtrs\vdcb\srtsegjoin\generate_bilingual_video.pyget_subtitlesxr)      s>    $$&--55I""$--GDw5  W		 	??$C&)#C5zHXFcV<= %  JJL    :gY>OPQsST	JJL  JJL s1   BC% %D=0)D8D=E  8D==E   Ec           	        ^ RI pVP                  4       P                  P                  pVP                  4       P                  pRp \
        P                  ! V^R7      pVP                  4       pVP                  RV 34       VP                  4       pV'       d#   V^ ,          V'       d   VP                  4        # # RV  2V'       d   VP                  4        # #   \         dQ   p^ RIp	\        RT RT RT 24       T	P                  4        RT  2u Rp?T'       d   TP                  4        # # Rp?ii ; i  T'       d   TP                  4        i i ; i)u   
从数据库获取adname
Nr   z7SELECT DISTINCT adname FROM srts WHERE adid = ? LIMIT 1adid_r   r   r   )r   r	   r
   r   r   r   r   r   r   fetchoner   r   r   r   r   )
r   r   r   r   r   r   r   resultr'   r   s
   &&        r(   
get_adnamer.   6   s$    $$&--55I""$--GDw4PSWRYZ"!9 JJL  tf~ JJL    :gY>OPQsSTtf~JJL  JJL s7   AC ;C D4$,D/D4D7 /D44D7 7Ec                   Rp\        W4      pV R2p\        P                  P                  RRV4      p\        P
                  ! W4      p\        P                  P                  RV R24      pR pV! V4      p. p	\        V4       EFZ  w  p
w  rrpV
^ 8  d   WZ^,
          ,          ^,          M^ pV
^ 8  d
   VV,
          M^ pV
\        V4      ^,
          8  d!   WZ^,           ,          ^,          pVV,
          pMTpW8  d
   VV,
          M^ pV
^ 8X  d   ^ pMVV,           ^,          pV
\        V4      ^,
          8X  d   V^,
          pMVV,           ^,          pV
^ 8X  d   ^ pMRVV,
          ,
          pV^ 8:  d   ^ pV
\        V4      ^,
          8X  d   ^ pMRVV,
          ,
          pV^ 8:  d   ^ p\        P                  P                  VRVR	 R
V R
V R24      p\        P                  ! V4      p^ pV'       d?   V^ ,          p\        V4      ^,
          p\        V4      ^,
          pVVV p \        V4      p\        P                  P                  VRVR R24      p \        P                  ! V 4      p!^ p"V!'       d<   V
^d,          ^ 8X  d   \        RV!^ ,           24       V! V!^ ,          4      p#V#R,          p"VV,           V,           V",           p$V	P                  VV$34       EK]  	  V	#   \         d   p\        RT4       . u Rp?u # Rp?ii ; i)u   
读取双语时间信息
\\ll\D\xtrssvjj\db\dpd.db	_cn_audioz\\ll\D\xtrssvjjttsz.mp3c           
          R RRRRRRRRV  2.	p\         P                  ! VR	R	R
7      pVP                  ^ 8X  d4   \        \	        VP
                  P                  4       4      R,          4      # ^ # )ffprobez-vquietz-show_entrieszformat=durationz-ofz"default=noprint_wrappers=1:nokey=1-ifile:T)capture_outputtext  )
subprocessrun
returncoder   floatstdoutstrip)	file_pathcmdr-   s   &  r(   get_file_duration-get_bilingual_time.<locals>.get_file_durationg   s    w9JESwy}  AF  GP  FQ  R  SDtD !uV]]0023d:;;    i  seg03d-z-*.mp3xxxNz*-04du   使用网络TTS文件: gffffff?)r.   ospathjoin
joinbiliadget_subtitles	enumeratelenglobr   r   r   r   )%r   r   adnamecn_audio_dir
en_tts_dirr   
audio_filerC   audio_durationbilingual_timesir    r!   r"   r#   r$   prevendstartgap	nextstartendgapstartposendposaddstartaddendcn_audio_filecn_filescn_durationcn_filefilenamestartposidxfilenameendposidxdurstrexen_tts_patternen_filesen_durationoriginal_durationbilingual_times%   &                                    r(   get_bilingual_timero   Q   s   
 +G &F XY'L0%@J ((7I 0VHD/BJ 'z2N O(1)(<$$C'(1u)aC.#!&'!e57?s9~a!A#q)I_F 'I(6(<Y_!F 6H%A-H Iq  #a'FIo!+F 6Heh./H1} Iq  FFSL)F{ \SS	8*AfXU[3\]99]+QKG #M 21 4!'l1n./@AF [
 jBs3it2DE99^,uax/}=> 1(1+ >+c1K "K/&8;F^45O )=R +  eB	s   *K&&L1L>LLc                   Rp\        W4      p\        RV 24       V R2p\        P                  P	                  V4      '       g   \        RV 24       R# \        V 4      p\        R\        V4       R24       V'       g   \        R4       R# \        P                  ! 4       ;_uu_ 4       p. pV F  w  rx\        P                  P                  VR	VR
 R24      p	\        P                  P	                  V	4      '       g   \        RV	 24       K_  VR,          p
\        P                  P                  VRVR
 R24      pRRRRRV	RRRRRRRRRRR\        V
4      R V.p\        P                  ! VR!R"7       \        P                  P	                  V4      '       g   K  VP                  V4       K  	  \        R#\        V4       R$24       V'       g   \        R%4        R&R&R&4       R# \        P                  P                  VR'4      p\        VR(R)R*7      ;_uu_ 4       pV F5  pVP                  R+\        P                  P!                  V4       R,24       K7  	  R&R&R&4       \        P                  P                  W2 R-24      pRRR.R/R0R1RVR2R3V.p\        R44       \        P                  ! VR!R"7      pVP"                  ^ 8X  d   \        R5V 24        R&R&R&4       R!#  VP$                  P'                  R)R6R77      p\        R9T 24        R&R&R&4       R#   + '       g   i     L; i    TP$                  P'                  R8R6R77      p LN   \        TP$                  4      p  Lh; i; i  + '       g   i     R&# ; i):   
生成完整的视频流
r0   adname: _images&   错误：字幕图片目录不存在: F   找到     句双语时间信息$   错误：未找到双语时间信息vertical_subtitle_rG   .png    警告：图片文件不存在: r:   	fragment_.mp4ffmpeg-y-loop1r6   -c:vlibx264-tune
stillimage-c:aaac-b:a192k-pix_fmtyuv420p-t	-shortestTr8   
   生成了     个视频片段$   错误：未生成任何视频片段Nfilelist.txtwutf-8encodingfile ''
_bilingual_video.mp4-fconcat-safe0-ccopy   开始拼接视频流...   拼接完成！输出文件: replaceerrorsgbk   拼接失败！错误信息: )r.   r   rK   rL   existsro   rQ   tempfileTemporaryDirectoryrM   strr;   r<   r   openwriteabspathr=   stderrdecode)r   r   rS   	image_dirrX   temp_dirvideo_fragmentsr    duration_ms
image_fileduration_secoutput_filerB   filelist_pathffragmentr-   	error_msgs   &                 r(   make_bili_vdr      s5   
 +G &F	HVH
 ('"I 77>>)$$6ykBC ).O	GC())?
@A45 
	$	$	&	&( /Ci3Ec#Yd1STJ77>>*--8EF '-L '',,x9SIT1JKK $j	Ic,'C NN3t4ww~~k**&&{3A !0D 	
3/00@AB89U 
'	&Z X~>-w771+&!: ;3?@ , 8
 ggll98L.MNd(S-&
 	()D9!1+?@G 
'	&L3"MM000K	 1)=>] 
'	&^ 87233 & 4 4U9 4 MI3 #FMM 2IY 
'	&	&so   +C+M(AM(&6M(<L	A:M(L&:M(L#M(&M%)MM(M"	M% M("M%%M((M9	c                 V    R p\         P                  ! VRV P                  4       4      pV# )z\s*[(_-]\d+[)]?$ )resubr@   )rS   patterncleaneds   &  r(   clean_filename_suffixr   .  s&     "GffWb&,,.1GNrE   c                 t   R p\        V 4      p\        P                  P                  W R24      p\        P                  ! V4      p\        RV4       V'       d(   \        V\        P                  P                  R7      pV# \        R4       \        \        P                  P                  \        4      4       R# )y:\xtrssvjjz*.jpgzsearch_pattern:keyu   ❌ 未找到封面图N)
r   rK   rL   rM   rR   r   maxgetmtimebasename__file__)filemain	cover_dircover_imgfilenamemainsearch_patternfound_covers
image_paths   &     r(   calccoverimgfilenamer   8  s    I/9WW\\)/Fe-LMN99^,L	
N+277+;+;<
	
"#	"''

8
$%rE   c                    R p\         P                  P                  V 4      p\         P                  P                  V4      w  r4Tp\	        RV 24        \         P
                  ! V4      p. pV F`  pWX9   g   K  VP                  4       P                  R4      '       g   K2  VP                  \         P                  P                  W4      4       Kb  	  V'       d6   \        V\         P                  P                  R7      p	\	        RV	 24       V	#  \	        R4       \	        \         P                  P                  \        4      4       R#   \         d   p
\	        RT
 24        Rp
?
LWRp
?
ii ; i)r   u)   [DEBUG_RAW] 正在绝对匹配关键词: z.jpgr   u%   🎯 【大捷】成功捞出封面: u   ❌ 目录读取失败: Nu.   ❌ 纯文本过滤后依然未找到封面图)rK   rL   r   splitextr   listdirlowerendswithr   rM   r   r   r   r   )r   r   	base_namename_without_ext_core_keyword	all_filesr   r   r   r'   s   &          r(   r   r   F  s%   I   *I''**95 $L	5l^
DE.JJy)	A QWWY%7%7%?%?##BGGLL$>?  \rww/?/?@J9*FG  

:;	"''

8
$%  .(,--.s*    E	 9"E	  9E	 4E	 	E,E''E,)Pathc                    \        \        V4      P                  4       4      pV  R 2p^pRRRRRRRV 2RR	R
RR\        V4      RRRRRRRRRRRRRV.p \        P                  ! VRR7      pVP
                  ^ 8X  d   \        RV 24       R!# VP                  P                  RRR7      p\        RV 24       R!#   \         d   p\        R T 24        R!p?R!# R!p?ii ; i)"
_cover.mp4r}   r~   -hide_bannerr   r   r6   r7   r   r   r   r   r   r   r   -vfz!scale=trunc(iw/2)*2:trunc(ih/2)*2r   lavfi0anullsrc=channel_layout=stereo:sample_rate=44100r   r   r   r   r   Tr   u   ✅ 封面视频已生成: r   ignorer   u#   ❌ 生成失败！错误详情：
u   💥 脚本崩溃: N)
r   r   resolver;   r<   r=   r   r   r   r   )	rS   coverimgfileimg_abs_pathoutput_videor   rB   r-   r   r'   s	   &&       r(   create_cover_videor   m  s   tL)1134LXZ(LL 	$l^$	c,I2gtOC$)D9!/~>? ,,WX,FI8DE )#A3'(()s   7B: +B: :CCCc                    R pV  R2pRRRRRRRR	R
RRR	RRRRRRRRRRRRRRV.p \        VR4      ;_uu_ 4       pVP                  4       pRRR4       \        P                  ! V\        P                  \        P                  \        P                  R7      pVP                  XR7      w  rVP                  ^ 8X  dZ   ^ RIp
V
P                  P                  V4      '       d   V
P                  ! V4       V
P                  ! W#4       \        RV 24       R# \        RV	P                  RR R!7       24       R#   + '       g   i     L; i  \         d   p\        R"T 24        Rp?R# Rp?ii ; i)#temp_safe_cover.mp4r   r}   r~   r   r   r   r   
image2piper6   rH   r   r   r   z0scale=trunc(iw/2)*2:trunc(ih/2)*2,format=yuv420pr   r   r   r   r   r   r   r   r   r   rbNstdinr?   r   inputu   ✅ 真正成功了：u   ❌ 还是报错：r   r   r      💥 崩溃: r   readr;   PopenPIPEcommunicater=   rK   rL   r   removerenamer   r   r   rS   r   temp_outputfinal_outputrB   r   img_dataprocessr?   r   rK   r'   s   &&          r(   create_cover_video_perfectr     sV   'KXZ(L 	$lcgtOA	cC #,%%vvxH & ""3joojoo^h^m^mn ,,8,<"ww~~l++RYY|-DIIk0*<.9:'gh(O'PQR &%   #aS!""#;   E	 D6BE	 !2E	 E	 6E	E	 	E-E((E-c                    R pV  R2pRRRRRRRR	R
RRR	RRRRRRRRRRRRRRV.p \        VR4      ;_uu_ 4       pVP                  4       pRRR4       \        P                  ! V\        P                  \        P                  \        P                  R7      pVP                  XR7      w  rVP                  ^ 8X  dZ   ^ RIp
V
P                  P                  V4      '       d   V
P                  ! V4       V
P                  ! W#4       \        RV 24       R# \        RV	P                  RR R!7       24       R#   + '       g   i     L; i  \         d   p\        R"T 24        Rp?R# Rp?ii ; i)#r   r   r}   r~   r   r   r   r   r   r6   rH   r   r   r   zscale=960:544,format=yuv420pr   r   r   r   r   r   r   r   r   r   r   Nr   r   u"   ✅ 完美生成 544x960 封面：u   ❌ 报错：r   r   r   r   r   r   s   &&          r(   r   r     sU   'KXZ(L 	$lcgtO-	cC"#,%%vvxH & ""3joojoo^h^m^mn ,,8,<"ww~~l++RYY|-DIIk06|nEFM&---"I!JKL &%  #aS!""#r   c                    R \         P                  ! 4        R2pV  R2pRpRRRRRR	R
RRR	RRVRRRRRRRRRRRV.p \        VR4      ;_uu_ 4       pVP                  4       pRRR4       \        P
                  ! V\        P                  \        P                  \        P                  R7      pVP                  XR7      w  rVP                  ^ 8X  db   \         P                  P                  V4      '       d   \         P                  ! V4       \         P                  ! W#4       \        RV 24       R# \        RV
P                  RR R!7       24       R#   + '       g   i     L; i  \         d   p\        R"T 24        Rp?R# Rp?ii ; i)#temp_r|   r   zgscale=544:960:force_original_aspect_ratio=decrease,pad=544:960:(ow-iw)/2:(oh-ih)/2:black,format=yuv420pr}   r~   r   r   r   r6   rH   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Nr   r   u$   ✅ 竖屏封面(544x960)已生成:    ❌ 报错: r   r   r   r   )rK   getpidr   r   r;   r   r   r   r=   rL   r   r   r   r   r   r   )rS   r   r   r   video_filterrB   r   r   r   r?   r   r'   s   &&          r(   r   r     sd   "))+d+KXZ(L	  	$lD#gtO|	cC#,%%vvxH & ""3joojoo^h^m^mn ,,8,<"ww~~l++RYY|-DIIk08GHLwx!H IJK &%  #aS!""#s<   E( E"BE( 8:E( 4E( E%	 E( (F3FFc                 B   R \         P                  ! 4        R2p^pRRRR\        V4      RRRR	R
RR\        V4      RRR
RRRRRRRRRRRV.p \        VR4      ;_uu_ 4       pVP	                  4       pRRR4       \
        P                  ! V\
        P                  \
        P                  \
        P                  R7      pVP                  XR7      w  rVP                  ^ 8X  dc   \         P                  P                  V4      '       d   \         P                  ! V4       \         P                  ! W24       \        RV R24       V# \        RV
P                  RR R!7       24        V#   + '       g   i     L; i  \          d   p\        R"T 24        Rp?T# Rp?ii ; i)#
temp_task_r|   r}   r~   r   r   r   r   r   r   r6   rH   r   r   r   zascale=544:960:force_original_aspect_ratio=decrease,pad=544:960:(ow-iw)/2:(oh-ih)/2,format=yuv420pr   r   r   r   r   r   r   r   r   Nr   r   u   ✅ u"    生成成功，时长已对齐。r  r   r   r   u   💥 异常: )rK   r  r   r   r   r;   r   r   r   r=   rL   r   r   r   r   r   r   )rS   r   r   r   r   rB   r   r   r   r?   r   r'   s   &&&         r(   r   r      sx   ryy{m40KL 	$c,#t\4c,w6hr	
C#,%%vvxH & ""3joojoo^h^m^mn ,,8,<"ww~~l++RYY|-DIIk0D&HIJLwx!H IJK  &%  #aS!""#s=   E: !E'2BE: <E: E: 'E7	2E: :FFFc                   Rp\        RV 24       \        V4      pV R2pV'       dI   \        WV4      p\        P                  P                  V4      '       d   \        R4       M\        R4       V R2p\        RV4       \        P                  P                  V4      '       g-   \        RV 24       \        RV 24       \        RV 24       R	# \        V 4      p\        R
\        V4       R24       V'       g   \        R4       R	# \        P                  ! 4       ;_uu_ 4       p. pV EF*  w  rV	^d,          ^ 8X  d   \        RV	^,           R\        V4      4       \        P                  P                  VRV	R R24      p\        P                  P                  V4      '       g   \        RV 24       K  V
R,          p\        P                  P                  VRV	R R24      pRRRRRVRRRRRR R!R"R#R$R%\        V4      R&V.p\        P                  ! VR'R(7       \        P                  P                  V4      '       g   EK  VP                  V4       EK-  	  \        R)\        V4       R*24       V'       g   \        R+4        R,R,R,4       R	# \        P                  P                  VR-4      p\        VR.R/R07      ;_uu_ 4       p\        P                  P                  V4      '       d3   VP!                  R1\        P                  P#                  V4       R224       V F5  pVP!                  R1\        P                  P#                  V4       R224       K7  	  R,R,R,4       \        P                  P                  WQ R324      pRRR4R5R6R7RVR8R9V.p\        R:4       \        P                  ! VR'R(7      pVP$                  ^ 8X  d   \        R;V 24        R,R,R,4       R'#  VP&                  P)                  R/R<R=7      p\        R?T 24        R,R,R,4       R	#   + '       g   i     L; i    TP&                  P)                  R>R<R=7      p LN   \        TP&                  4      p  Lh; i; i  + '       g   i     R,# ; i)@rq   r0   rr   r   u   vvv 封面视频已生成u1   !!! 封面视频未生成 -封面文件不存在?rs   u"   chking 字幕图片目录是否ok:rt   Fru   rv   rw   u   生成各视频句段:/rx   rG   ry   rz   r:   r{   r|   r}   r~   r   r   r6   r   r   r   r   r   r   r   r   r   r   r   r   Tr   r   r   r   Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   rK   rL   r   ro   rQ   r   r   rM   r   r;   r<   r   r   r   r   r=   r   r   )r   rS   r   r   covervideofiler   rX   r   r   r    r   r   r   r   rB   r   r   r   r-   r   s   &&                  r(   r   r   E  s   
 +G 
HVH
'/Lxz*N)&~N77>>.))-.EF('"I	
.y977>>)$$6ykBC6ykBC6ykBC ).O	GC())?
@A45 
	$	$	&	&( /C3wz.s1uS_9MNi3Ec#Yd1STJ77>>*--8EF '-L '',,x9SIT1JKK $j	Ic,'C NN3t4ww~~k**&&{3E !0H 	
3/00@AB89Y 
'	&^ X~>-w771ww~~n--&!@ AEF+&!: ;3?@ , 8 ggll98L.MNd(S-&
 	()D9!1+?@O 
'	&T3"MM000K	 1)=>e 
'	&b 87633 & 4 4U9 4 MI3 #FMM 2Ia 
'	&	&sw   (B Q+)BQ+AQ+6Q+BP	A:Q+ P)=Q+P&!Q+)Q(,Q	Q+Q%	"Q(#Q+%Q((Q++Q<	c                 L   \        \        P                  4      ^8w  d-   \        R4       \        R4       \        P                  ! ^4        \        \        P                  ^,          4      p \        R4       \        \        P                  P                  \        4      4       \        RX  24       \        V 4      pV'       d   \        R4       R# \        R4       \        P                  ! ^4       R#   \         d%    \        R4       \        P                  ! ^4        Li ; i	u   
主函数
u1   用法: python generate_bilingual_video.py <adid>u/   示例: python generate_bilingual_video.py 8496u   错误：adid必须是数字u#   === 双语视频流生成工具 ===zadid: u   
视频流生成完成！u   
视频流生成失败！NrQ   sysargvr   exitr   
ValueErrorrK   rL   r   r   r   r   successs     r(   mainr         388}AB?@388A;
 
/1	"''

8
$%	F4&/4 G*+*+  ,-    C4 4,D#"D#c                 L   \        \        P                  4      ^8w  d-   \        R4       \        R4       \        P                  ! ^4        \        \        P                  ^,          4      p \        R4       \        \        P                  P                  \        4      4       \        RX  24       \        V 4      pV'       d   \        R4       R# \        R4       \        P                  ! ^4       R#   \         d%    \        R4       \        P                  ! ^4        Li ; ir  r  r  s     r(   r  r    r  r  __main__)__doc__rK   r   r  r   r;   rR   r   rN   r)   r.   ro   r   r   r   pathlibr   r   r   r  __name__ rE   r(   <module>r     s   
 
 	 
     #H6pdjV	& 
"H  $)J  )#V%#P  	 -#b  	$Jwr66 zF rE   