• 视频生成 量产 win 转 linux ffmpeg linux 安装 对批量视频的尽可能短时间生成


    环境准备

    Welcome to aliyun Elastic Compute Service!
    
    [root@mytest ~]# pip install baidu-aip
    Looking in indexes: http://mirrors.aliyun.com/pypi/simple/
    Requirement already satisfied: baidu-aip in ./anaconda3/lib/python3.5/site-packages (2.2.2.0)
    Requirement already satisfied: requests in ./anaconda3/lib/python3.5/site-packages (from baidu-aip) (2.14.2)
    You are using pip version 10.0.0, however version 10.0.1 is available.
    You should consider upgrading via the 'pip install --upgrade pip' command.
    [root@mytest ~]# pip install bs4
    Looking in indexes: http://mirrors.aliyun.com/pypi/simple/
    Requirement already satisfied: bs4 in ./anaconda3/lib/python3.5/site-packages (0.0.1)
    Requirement already satisfied: beautifulsoup4 in ./anaconda3/lib/python3.5/site-packages (from bs4) (4.5.1)
    You are using pip version 10.0.0, however version 10.0.1 is available.
    You should consider upgrading via the 'pip install --upgrade pip' command.
    [root@mytest ~]# pip install --upgrade pip
    Looking in indexes: http://mirrors.aliyun.com/pypi/simple/
    Collecting pip
      Downloading http://mirrors.aliyun.com/pypi/packages/0f/74/ecd13431bcc456ed390b44c8a6e917c1820365cbebcb6a8974d1cd045ab4/pip-10.0.1-py2.py3-none-any.whl (1.3MB)
        100% |????????????????????????????????| 1.3MB 38.0MB/s 
    Installing collected packages: pip
      Found existing installation: pip 10.0.0
        Uninstalling pip-10.0.0:
          Successfully uninstalled pip-10.0.0
    Successfully installed pip-10.0.1
    [root@mytest ~]# pip install imageio
    Looking in indexes: http://mirrors.aliyun.com/pypi/simple/
    Requirement already satisfied: imageio in ./anaconda3/lib/python3.5/site-packages (2.3.0)
    Requirement already satisfied: pillow in ./anaconda3/lib/python3.5/site-packages (from imageio) (3.3.1)
    Requirement already satisfied: numpy in ./anaconda3/lib/python3.5/site-packages (from imageio) (1.13.1)
    [root@mytest ~]# python
    Python 3.5.2 |Anaconda custom (64-bit)| (default, Jul  2 2016, 17:53:06) 
    [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import imageio
    >>> imageio.plugins.ffmpeg.download()
    Imageio: 'ffmpeg-linux64-v3.3.1' was not found on your computer; downloading it now.
    Try 1. Download from https://github.com/imageio/imageio-binaries/raw/master/ffmpeg/ffmpeg-linux64-v3.3.1 (43.8 MB)
    Downloading: 606208/45929032 bytes (1.3%)Error while fetching file: The read operation timed out.
    Try 2. Download from https://github.com/imageio/imageio-binaries/raw/master/ffmpeg/ffmpeg-linux64-v3.3.1 (43.8 MB)
    Downloading: 15040512/45929032 bytes (32.7%)Error while fetching file: The read operation timed out.
    Try 3. Download from https://github.com/imageio/imageio-binaries/raw/master/ffmpeg/ffmpeg-linux64-v3.3.1 (43.8 MB)
    Downloading: 45929032/45929032 bytes (100.0%)
      Done
    File saved as /root/.imageio/ffmpeg/ffmpeg-linux64-v3.3.1.
    >>> 
    
    
    
    
    [root@mytest ~]# cd /root/.imageio/ffmpeg/
    [root@mytest ffmpeg]# ll -as
    total 44868
        4 drwxr-xr-x 2 root root     4096 Apr 28 10:17 .
        4 drwxr-xr-x 3 root root     4096 Apr 28 09:45 ..
    44860 -rw-r--r-- 1 root root 45929032 Apr 28 10:17 ffmpeg-linux64-v3.3.1
    [root@mytest ffmpeg]# pwd
    /root/.imageio/ffmpeg
    [root@mytest ffmpeg]# ./ffmpeg-linux64-v3.3.1 -i 0.mp3 -i a.avi myunix.mp4
    -bash: ./ffmpeg-linux64-v3.3.1: Permission denied
    [root@mytest ffmpeg]# ll -as
    total 313084
         4 drwxr-xr-x 2 root root      4096 Apr 28 10:23 .
         4 drwxr-xr-x 3 root root      4096 Apr 28 09:45 ..
        20 -rw-r--r-- 1 root root     19944 Apr 28 10:23 0.mp3
    268196 -rw-r--r-- 1 root root 274626116 Apr 28 10:22 a.avi
     44860 -rw-r--r-- 1 root root  45929032 Apr 28 10:17 ffmpeg-linux64-v3.3.1
    [root@mytest ffmpeg]# chmod 777 ffmpeg-linux64-v3.3.1
    [root@mytest ffmpeg]# ll -as
    total 313084
         4 drwxr-xr-x 2 root root      4096 Apr 28 10:23 .
         4 drwxr-xr-x 3 root root      4096 Apr 28 09:45 ..
        20 -rw-r--r-- 1 root root     19944 Apr 28 10:23 0.mp3
    268196 -rw-r--r-- 1 root root 274626116 Apr 28 10:22 a.avi
     44860 -rwxrwxrwx 1 root root  45929032 Apr 28 10:17 ffmpeg-linux64-v3.3.1
    [root@mytest ffmpeg]# ./ffmpeg-linux64-v3.3.1 -i 0.mp3 -i a.avi myunix.mp4
    ffmpeg version N-86111-ga441aa90e8-static http://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2017 the FFmpeg developers
      built with gcc 5.4.1 (Debian 5.4.1-8) 20170304
      configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc-5 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gray --enable-libass --enable-libfreetype --enable-libfribidi --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg
      libavutil      55. 63.100 / 55. 63.100
      libavcodec     57. 96.101 / 57. 96.101
      libavformat    57. 72.101 / 57. 72.101
      libavdevice    57.  7.100 / 57.  7.100
      libavfilter     6. 89.101 /  6. 89.101
      libswscale      4.  7.101 /  4.  7.101
      libswresample   2.  8.100 /  2.  8.100
      libpostproc    54.  6.100 / 54.  6.100
    [mp3 @ 0x4ce7540] Estimating duration from bitrate, this may be inaccurate
    Input #0, mp3, from '0.mp3':
      Duration: 00:00:09.97, start: 0.000000, bitrate: 16 kb/s
        Stream #0:0: Audio: mp3, 16000 Hz, mono, s16p, 16 kb/s
    Input #1, avi, from 'a.avi':
      Duration: 00:01:55.00, start: 0.000000, bitrate: 19104 kb/s
        Stream #1:0: Video: mjpeg (MJPG / 0x47504A4D), yuvj420p(pc, bt470bg/unknown/unknown), 1200x414 [SAR 1:1 DAR 200:69], 19108 kb/s, 20 fps, 20 tbr, 20 tbn, 20 tbc
    Stream mapping:
      Stream #1:0 -> #0:0 (mjpeg (native) -> h264 (libx264))
      Stream #0:0 -> #0:1 (mp3 (native) -> aac (native))
    Press [q] to stop, [?] for help
    No pixel format specified, yuvj420p for H.264 encoding chosen.
    Use -pix_fmt yuv420p for compatibility with outdated media players.
    [libx264 @ 0x4d05700] using SAR=1/1
    [libx264 @ 0x4d05700] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 AVX2 LZCNT BMI2
    [libx264 @ 0x4d05700] profile High, level 3.1
    [libx264 @ 0x4d05700] 264 - core 148 r333 90a61ec - H.264/MPEG-4 AVC codec - Copyleft 2003-2017 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=20 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
    Output #0, mp4, to 'myunix.mp4':
      Metadata:
        encoder         : Lavf57.72.101
        Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuvj420p(pc, progressive), 1200x414 [SAR 1:1 DAR 200:69], q=-1--1, 20 fps, 10240 tbn, 20 tbc
        Metadata:
          encoder         : Lavc57.96.101 libx264
        Side data:
          cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
        Stream #0:1: Audio: aac (LC) ([64][0][0][0] / 0x0040), 16000 Hz, mono, fltp, 69 kb/s
        Metadata:
          encoder         : Lavc57.96.101 aac
    frame= 2300 fps=240 q=-1.0 Lsize=    2089kB time=00:01:54.85 bitrate= 149.0kbits/s speed=  12x    
    video:1972kB audio:86kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.509317%
    [libx264 @ 0x4d05700] frame I:23    Avg QP:13.44  size: 84249
    [libx264 @ 0x4d05700] frame P:575   Avg QP:14.62  size:    58
    [libx264 @ 0x4d05700] frame B:1702  Avg QP:22.87  size:    28
    [libx264 @ 0x4d05700] consecutive B-frames:  1.0%  0.0%  3.0% 96.0%
    [libx264 @ 0x4d05700] mb I  I16..4:  6.7% 74.6% 18.7%
    [libx264 @ 0x4d05700] mb P  I16..4:  0.0%  0.0%  0.0%  P16..4:  0.4%  0.0%  0.0%  0.0%  0.0%    skip:99.6%
    [libx264 @ 0x4d05700] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8:  0.1%  0.0%  0.0%  direct: 0.0%  skip:99.9%  L0:11.1% L1:88.9% BI: 0.0%
    [libx264 @ 0x4d05700] 8x8 transform intra:74.6% inter:69.0%
    [libx264 @ 0x4d05700] coded y,uvDC,uvAC intra: 79.1% 83.5% 80.1% inter: 0.0% 0.1% 0.0%
    [libx264 @ 0x4d05700] i16 v,h,dc,p: 41% 30%  6% 24%
    [libx264 @ 0x4d05700] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 30% 24% 10%  4%  6%  5%  7%  6%  8%
    [libx264 @ 0x4d05700] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 26% 24%  8%  6%  8%  7%  7%  7%  7%
    [libx264 @ 0x4d05700] i8c dc,h,v,p: 40% 27% 21% 12%
    [libx264 @ 0x4d05700] Weighted P-Frames: Y:0.0% UV:0.0%
    [libx264 @ 0x4d05700] ref P L0: 98.4%  0.6%  0.8%  0.2%
    [libx264 @ 0x4d05700] ref B L0: 77.3% 21.3%  1.4%
    [libx264 @ 0x4d05700] ref B L1: 99.0%  1.0%
    [libx264 @ 0x4d05700] kb/s:140.41
    [aac @ 0x4d06ba0] Qavg: 32328.777
    [root@mytest ffmpeg]# ll -as
    total 315176
         4 drwxr-xr-x 2 root root      4096 Apr 28 10:25 .
         4 drwxr-xr-x 3 root root      4096 Apr 28 09:45 ..
        20 -rw-r--r-- 1 root root     19944 Apr 28 10:23 0.mp3
    268196 -rw-r--r-- 1 root root 274626116 Apr 28 10:22 a.avi
     44860 -rwxrwxrwx 1 root root  45929032 Apr 28 10:17 ffmpeg-linux64-v3.3.1
      2092 -rw-r--r-- 1 root root   2139319 Apr 28 10:25 myunix.mp4
    [root@mytest ffmpeg]# 
    

     

    图文素材到位、声音到位、批量合成  。。。。

     各个 模块 剥离

    代码拆开 

    无限循环 

    对批量视频的尽可能短时间生成 

    import os
    
    os_sep = os.sep
    save_dir = '/data/xiaole_dl_img/dlDBimg'
    mybanner_dir, mylogo_dir, mymp3_dir, myv_dir, myhtml_dir, myv_tmp_dir = '{}{}{}'.format(save_dir, os_sep,
                                                                                            'mybanner'), '{}{}{}'.format(
        save_dir,
        os_sep,
        'mylogo'), '{}{}{}'.format(
        save_dir, os_sep, 'mymp3'), '{}{}{}'.format(save_dir, os_sep, 'myv'), '{}{}{}'.format(save_dir, os_sep,
                                                                                              'myhtml'), '{}{}{}'.format(
        save_dir, os_sep, 'myv_tmp')
    f = 'uid.username.txt'
    uid_d = {}
    with open(f, 'r', encoding='utf-8') as fr:
        for i in fr:
            uid, un = i.replace('
    ', '').split('	')
            uid_d[uid] = {}
            uid_d[uid]['username'] = un
            uid_d[uid]['banner_img_l'] = []
    banner_img_dir = '{}{}{}'.format(mybanner_dir, os_sep, '*.*g')
    #print(banner_img_dir)
    import glob
    
    banner_imgs = glob.glob(banner_img_dir)
    #print(banner_imgs)
    for uid in uid_d:
        un = uid_d[uid]['username']
        for i in banner_imgs:
            if un in i:
                uid_d[uid]['banner_img_l'].append(i)
    uid_d_filter = {}
    l = []
    for uid in uid_d:
        # if len(uid_d[uid]['banner_img_l']) > 2:
        if len(uid_d[uid]['banner_img_l']) > 0:
            uid_d_filter[uid] = {}
            uid_d_filter[uid] = uid_d[uid]
            l.append(uid)
    del uid_d
    
    this_file_abspath = os.path.abspath(__file__)
    this_file_dirname, this_file_name = os.path.dirname(this_file_abspath), os.path.abspath(__file__).split(os_sep)[-1]
    # 设置分句的标志符号;可以根据实际需要进行修改
    cutlist = ['
    ', '	', '。', ';', '?', '.', ';', '?', '...', '、、、', ':', '!', '!']
    cutlist = ['
    ', '	', '。', ';', '?', '.', '?', '...', '、、、', '!', '!']
    
    
    # 检查某字符是否分句标志符号的函数;如果是,返回True,否则返回False
    def FindToken(cutlist, char):
        if char in cutlist:
            return True
        else:
            return False
    
    
    # 进行分句的核心函数
    def Cut(cutlist, lines):  # 参数1:引用分句标志符;参数2:被分句的文本,为一行中文字符
        l = []  # 句子列表,用于存储单个分句成功后的整句内容,为函数的返回值
        line = []  # 临时列表,用于存储捕获到分句标志符之前的每个字符,一旦发现分句符号后,就会将其内容全部赋给l,然后就会被清空
    
        for i in lines:  # 对函数参数2中的每一字符逐个进行检查 (本函数中,如果将if和else对换一下位置,会更好懂)
            if FindToken(cutlist, i):  # 如果当前字符是分句符号
                line.append(i)  # 将此字符放入临时列表中
                l.append(''.join(line))  # 并把当前临时列表的内容加入到句子列表中
                line = []  # 将符号列表清空,以便下次分句使用
            else:  # 如果当前字符不是分句符号,则将该字符直接放入临时列表中
                line.append(i)
        return l
    
    
    '''
    在标点符号正确的情况下分割出自然的句子
    以句子为单位生成声音
    '''
    from aip import AipSpeech
    
    bd_k_l = ['11131400', 'fGtMoYr1vVUbdvSGPTtknunt', 'x5IGwqiSu6C6EQQ6IhFAN6OZpGsOMK4W']
    # bd_k_l = ['11059852', '5Kk01GtG2fjCwpzEkwdn0mjw', 'bp6Wyx377Elq7RsCQZzTBgGUFzLm8G2A']
    APP_ID, API_KEY, SECRET_KEY = bd_k_l
    
    
    def gen_bd_mp3(uid, str_, f_w):
        mp3_dir = '{}{}'.format(mymp3_dir, os_sep)
        client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
        result = client.synthesis(str_, 'zh', 1, {
            'vol': 5,
        })
        # 识别正确返回语音二进制 错误则返回dict 参照下面错误码
        if not isinstance(result, dict):
            # f_w = '{}{}{}{}'.format(mp3_dir, 'oneSen0419', uid, '.mp3')
            #  with open('auido.b.mp3', 'wb') as f:
            with open(f_w, 'wb') as f:
                f.write(result)
            print('ok', f_w)
    
    
    img_dir = '{}{}'.format(mybanner_dir, os_sep)
    from bs4 import *
    
    xls = 'XLS0419'
    f = 'db.data.snap.txt'
    uid_d = {}
    '''
    uid_d[uid]['sen_d'], uid_d[uid]['img_l'] = {}, []
    uid_d[uid]['img_logo_uid'] = i
    uid_d[uid]['img_logo_our'] = i
    
    '''
    import glob
    
    f_img_d = '{}{}{}'.format(img_dir, os_sep, '*.jpg')
    imgs = glob.glob(f_img_d)
    f_img_d = '{}{}{}'.format(mylogo_dir, os_sep, '*.jpg')
    imgs_logo = glob.glob(f_img_d)
    our_logo_f = 'g3logo.jpg'
    f_mp3_d = '{}{}{}'.format(mymp3_dir, os_sep, '*.mp3')
    mpp3s = glob.glob(f_mp3_d)
    import random
    import time
    
    with open(f, 'r', encoding='utf-8') as fr:
        for i in fr:
            ll = i.split(xls)
            print(ll)
            dbid, uid, username, html_ = [i.replace('	', '') for i in ll]
            print('---------------')
            uid_d[uid] = {}
            uid_d[uid]['dbid'], uid_d[uid]['username'], uid_d[uid]['str'] = dbid, username, html_
            uid_d[uid]['sen_d'], uid_d[uid]['img_l'] = {}, []
            uid_d[uid]['img_logo_our'] = '{}{}{}'.format(mylogo_dir, os_sep, our_logo_f)
            # myhtml = 'D:\myhtml\{}tmp.html'.format(random.randint(123, 999))
            myhtml = '{}{}{}tmp.html'.format(myhtml_dir, os_sep, random.randint(123, 999))
            with open(myhtml, 'w', encoding='utf-8') as fw:
                fw.write(html_)
            with open(myhtml, 'r', encoding='utf-8') as myhtml_o:
                bs = BeautifulSoup(myhtml_o, 'html.parser')
                txt = bs.text
    
                for i_img in imgs_logo:
                    if uid in i_img:
                        uid_d[uid]['img_logo_uid'] = i_img
                        break
                        # logo_url = 'http://img.a.g3user.com/site/34034975/logo.jpg'.replace('34034975', uid)
                        #   spider_webimg_dl_return_local_img_path(img_dir, logo_url, uid, 'logo')
    
                        # img_url = [i.attrs['src'] for i in bs.find_all('img')]
                        # uid_n = 0
                        # for i in bs.find_all('img'):
                        #     img_url = i.attrs['src']
                        #     # spider_webimg_dl_return_local_img_path(img_dir, img_url, uid, uid_n)
                        #     uid_n += 1
                        #
                        #     for i_img in imgs:
                        #         if uid in i_img:
                        #             uid_d[uid]['img_l'].append(i_img)
            uid_d[uid]['img_l'] = uid_d_filter[uid]['banner_img_l']
            sentence_l = Cut(list(cutlist), list(txt))
            sentence_l_noblank = []
            for i in sentence_l:
                if i != '
    ' and len(i.replace(' ', '')) > 0:
                    sentence_l_noblank.append(i.replace('
    ', ''))
            uid_n = 0
            for screen_str in sentence_l_noblank:
                uid_sen = '{}{}{}'.format(uid, '_', uid_n)
                f_w = '{}{}{}{}'.format(mymp3_dir, os_sep, '0428UNIX', uid_sen, '.mp3')
                gen_bd_mp3(uid_sen, screen_str, f_w)
                time.sleep(1)
                uid_d[uid]['sen_d'][f_w] = screen_str
                uid_n += 1
                if uid_n % 5 == 0:
                    time.sleep(3)
                    pass
                    # time.sleep(1)
    
    import os, time, glob, math
    import imageio
    
    imageio.plugins.ffmpeg.download()
    from mutagen.easyid3 import EasyID3
    from mutagen.mp3 import MP3
    from PIL import Image, ImageDraw, ImageFont
    import cv2
    import numpy as np
    
    
    def resize_rescale_pilimg(img_f, w_h_tuple, mid_factor=1):
        img_n, img_type = img_f.split('.')[-2], img_f.split('.')[-1]
        img_n_resize_rescale_pilimg_dir = '{}{}{}'.format(os_sep.join(img_n.split(os_sep)[:-1]),
                                                          'resize_rescale_pilimg',
                                                          os_sep, img_n.split(os_sep)[-1], os_sep)
        img_n_resize_rescale_pilimg = '{}{}{}'.format(img_n_resize_rescale_pilimg_dir, img_n.split(os_sep)[-1], '.PNG')
        img_type = 'PNG'
        img_f_new = img_n_resize_rescale_pilimg
        mid_icon = Image.open(img_f)
        mid_icon_w, mid_icon_h = w_h_tuple[0] * mid_factor, w_h_tuple[1] * mid_factor
        mid_icon = mid_icon.resize((mid_icon_w, mid_icon_h), Image.ANTIALIAS)
        mid_icon.save(img_n_resize_rescale_pilimg, img_type)
        return img_f_new
    
    
    for uid in uid_d:
    
        print(uid)
        if 'img_logo_uid' not in uid_d[uid]:
            continue
        logo_f, logo_f_uid, imgs = uid_d[uid]['img_logo_our'], uid_d[uid]['img_logo_uid'], uid_d[uid]['img_l']
    
        # res_v_f_dir = 'D:\myvonline'
        res_v_f_dir = myv_dir
        f_img_d = '{}{}{}'.format(res_v_f_dir, os_sep, '*.mp4')
        vs = glob.glob(f_img_d)
        chk_v = '{}{}{}{}'.format(res_v_f_dir, os_sep, uid_d[uid]['dbid'], '.mp4')
        t_spend_per_imgperiod = 5
        res_v = '{}{}{}{}{}{}'.format(res_v_f_dir, os_sep, uid_d[uid]['dbid'], '_', t_spend_per_imgperiod, '.mp4')
        chk_v = res_v
        print(chk_v)
        if chk_v in vs:
            continue
    
        img_size_d = {}
        w_h_size_min = [12345, 12345]
        for i in imgs:
            img = cv2.imread(i)
            w_h_s = '{},{}'.format(img.shape[1], img.shape[0])
            w, h = [int(i) for i in w_h_s.split(',')]
            if w * h < w_h_size_min[0] * w_h_size_min[1]:
                w_h_size_min = [w, h]
            if w_h_s not in img_size_d:
                img_size_d[w_h_s] = 1
            else:
                img_size_d[w_h_s] += 1
        # 取众数
        mode_img_size_wh = [int(i) for i in
                            sorted(img_size_d.items(), key=lambda mytuple: mytuple[1], reverse=True)[0][0].split(',')]
        if mode_img_size_wh[0] * mode_img_size_wh[1] > w_h_size_min[0] * w_h_size_min[1]:
            mode_img_size_wh = w_h_size_min
    
        os_sep = os.sep
        this_file_abspath = os.path.abspath(__file__)
        this_file_dirname, this_file_name = os.path.dirname(this_file_abspath), os.path.abspath(__file__).split(os_sep)[-1]
    
        br_step_test_l = [0.0185, 0.0195, 0.02, 0.028]
        br_step = math.floor((mode_img_size_wh[0]) * br_step_test_l[-1])
        audio_spend = 0
        for f_mp3 in uid_d[uid]['sen_d']:
            screen_str = uid_d[uid]['sen_d'][f_mp3]
            # 没有保存的必要
            uid_sen = f_mp3.split(os_sep)[-1].split('.')[0]
            had = False
            # mp3_dir = 'D:\mymp3\'
            f_mp3_d = '{}{}{}'.format(mymp3_dir, os_sep, '*.mp3')
            mpp3s = glob.glob(f_mp3_d)
            print(f_mp3)
            if f_mp3 not in mpp3s:
                if len(screen_str.replace(' ', '')) == 0:
                    screen_str = '{}{}'.format(screen_str, '谢谢。')
                print(screen_str)
                gen_bd_mp3(uid_sen, screen_str, f_mp3)
                time.sleep(2)
            EasyID3.valid_keys["comment"] = "COMM::'XXX'"
            try:
                id3info = MP3(f_mp3, ID3=EasyID3)
            except Exception as e:
                print(e)
                continue
            audio_spend += id3info.info.length
    
            #  f_v = '{}{}{}{}'.format('D:\myv\', uid, int(time.time()), '.avi')
        f_v = '{}{}{}{}'.format(myv_dir, uid, int(time.time()), '.avi')
        fps, fourcc = 20, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')
        videoWriter = cv2.VideoWriter(f_v, fourcc, fps, (mode_img_size_wh[0], mode_img_size_wh[1]))
        img_l_len = len(uid_d[uid]['img_l'])
        t_spend_per_imgperiod = 5
        t_spend_per_imgperiod_mod = audio_spend % t_spend_per_imgperiod
        t_spend_per_imgperiod_times = math.floor(audio_spend / t_spend_per_imgperiod)
        fps_loop_times_per_imgperiod = math.ceil(t_spend_per_imgperiod * fps)
    
        imgname = ''
        for myloop in range(t_spend_per_imgperiod_times):
            imgname_ori = uid_d[uid]['img_l'][myloop % img_l_len]
            imgname = uid_d[uid]['img_l'][myloop % img_l_len]
            print(imgname)
            frame = cv2.imread(imgname)
            print(frame.shape[1], frame.shape[0])
            if (frame.shape[1], frame.shape[0]) != (mode_img_size_wh[0], mode_img_size_wh[1]):
                imgname = resize_rescale_pilimg(imgname, (mode_img_size_wh[0], mode_img_size_wh[1]))
                frame = cv2.imread(imgname)
            else:
                pass
            img1 = cv2.imread(imgname)  # 加载图像
            img2 = cv2.imread(logo_f_uid)  # logo  客户在左边
            rows, cols, channels = img2.shape
            roi = img1[0:rows, 0:cols]  # 取img1的这个区域来处理
            img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)  # 建立logo的二值图,也建立相反的二值图
            ret, mask = cv2.threshold(img2gray, 175, 255, cv2.THRESH_BINARY)  # 二值化
            mask_inv = cv2.bitwise_not(mask)  # 做非操作,黑的变白,白的变黑,黑色0,白色255
            img1_bg = cv2.bitwise_and(roi, roi, mask=mask)  # 与操作 ,参数输入,输出,与mask做and操作,黑色的被填充
            img2_fg = cv2.bitwise_and(img2, img2, mask=mask_inv)  # 与操作
            dst = cv2.add(img1_bg, img2_fg)  # 相加
            img1[0:rows, 0:cols] = dst  # 把添加了logo的该区域赋值回原来的地方
            img3 = cv2.imread(logo_f)  # logo our在右边
            rows, cols, channels = img3.shape
            rows1, cols1, channels1 = img1.shape
            roi = img1[0:rows, cols1 - cols:cols1]  # 取img1的这个区域来处理
            img3gray = cv2.cvtColor(img3, cv2.COLOR_BGR2GRAY)  # 建立logo的二值图,也建立相反的二值图
            ret, mask = cv2.threshold(img3gray, 175, 255, cv2.THRESH_BINARY)  # 二值化
            mask_inv = cv2.bitwise_not(mask)  # 做非操作,黑的变白,白的变黑,黑色0,白色255
            img1_bg = cv2.bitwise_and(roi, roi, mask=mask)  # 与操作 ,参数输入,输出,与mask做and操作,黑色的被填充
            img3_fg = cv2.bitwise_and(img3, img3, mask=mask_inv)  # 与操作
            dst = cv2.add(img1_bg, img3_fg)  # 相加
            img1[0:rows, cols1 - cols:cols1] = dst  # 把添加了logo的该区域赋值回原来的地方
            frame = img1
            frame_cv2 = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            frame_pil = Image.fromarray(frame_cv2)  # 转为PIL的图片格式
            font_size = math.floor((mode_img_size_wh[0]) * 0.040)
            # font = ImageFont.truetype("simhei.ttf", font_size, encoding="utf-8")
            # f_x, f_y = math.floor((mode_img_size_wh[0]) * 0.06), math.floor(
            #     mode_img_size_wh[1] * 0.85) - br_step_times * font_size
            #
            # screen_str = ''
            #
            # ImageDraw.Draw(frame_pil).text((f_x, f_y), screen_str, (255, 0, 0), font)
            frame_cv2 = cv2.cvtColor(np.array(frame_pil), cv2.COLOR_RGB2BGR)
            img = frame_cv2
            fps_loop_times = t_spend_per_imgperiod * fps
            for fps_loop in range(fps_loop_times):
                videoWriter.write(img)
        print('last')
        print(imgname_ori)
        new_l = uid_d[uid]['img_l']
        new_l.remove(imgname_ori)
        imgname = random.choice(new_l)
        frame = cv2.imread(imgname)
        print(frame.shape[1], frame.shape[0])
        if (frame.shape[1], frame.shape[0]) != (mode_img_size_wh[0], mode_img_size_wh[1]):
            imgname = resize_rescale_pilimg(imgname, (mode_img_size_wh[0], mode_img_size_wh[1]))
            frame = cv2.imread(imgname)
        else:
            pass
        img1 = cv2.imread(imgname)  # 加载图像
        img2 = cv2.imread(logo_f_uid)  # logo  客户在左边
        rows, cols, channels = img2.shape
        roi = img1[0:rows, 0:cols]  # 取img1的这个区域来处理
        img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)  # 建立logo的二值图,也建立相反的二值图
        ret, mask = cv2.threshold(img2gray, 175, 255, cv2.THRESH_BINARY)  # 二值化
        mask_inv = cv2.bitwise_not(mask)  # 做非操作,黑的变白,白的变黑,黑色0,白色255
        img1_bg = cv2.bitwise_and(roi, roi, mask=mask)  # 与操作 ,参数输入,输出,与mask做and操作,黑色的被填充
        img2_fg = cv2.bitwise_and(img2, img2, mask=mask_inv)  # 与操作
        dst = cv2.add(img1_bg, img2_fg)  # 相加
        img1[0:rows, 0:cols] = dst  # 把添加了logo的该区域赋值回原来的地方
        img3 = cv2.imread(logo_f)  # logo our在右边
        rows, cols, channels = img3.shape
        rows1, cols1, channels1 = img1.shape
        roi = img1[0:rows, cols1 - cols:cols1]  # 取img1的这个区域来处理
        img3gray = cv2.cvtColor(img3, cv2.COLOR_BGR2GRAY)  # 建立logo的二值图,也建立相反的二值图
        ret, mask = cv2.threshold(img3gray, 175, 255, cv2.THRESH_BINARY)  # 二值化
        mask_inv = cv2.bitwise_not(mask)  # 做非操作,黑的变白,白的变黑,黑色0,白色255
        img1_bg = cv2.bitwise_and(roi, roi, mask=mask)  # 与操作 ,参数输入,输出,与mask做and操作,黑色的被填充
        img3_fg = cv2.bitwise_and(img3, img3, mask=mask_inv)  # 与操作
        dst = cv2.add(img1_bg, img3_fg)  # 相加
        img1[0:rows, cols1 - cols:cols1] = dst  # 把添加了logo的该区域赋值回原来的地方
        frame = img1
        frame_cv2 = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        frame_pil = Image.fromarray(frame_cv2)  # 转为PIL的图片格式
        font_size = math.floor((mode_img_size_wh[0]) * 0.040)
        # font = ImageFont.truetype("simhei.ttf", font_size, encoding="utf-8")
        # f_x, f_y = math.floor((mode_img_size_wh[0]) * 0.06), math.floor(
        #     mode_img_size_wh[1] * 0.85) - br_step_times * font_size
        #
        # screen_str = ''
        #
        # ImageDraw.Draw(frame_pil).text((f_x, f_y), screen_str, (255, 0, 0), font)
        frame_cv2 = cv2.cvtColor(np.array(frame_pil), cv2.COLOR_RGB2BGR)
        img = frame_cv2
        fps_loop_times = math.ceil(t_spend_per_imgperiod_mod * fps)
        fps_loop_times = max(fps_loop_times, 1)
        for fps_loop in range(fps_loop_times):
            videoWriter.write(img)
    
        videoWriter.release()
        ffmpeg_f_dir = 'D:\myv\ffmpeg-20180331-be502ec-win64-static\bin\ffmpeg.exe'
        res_mp3_f_dir = 'D:\myv\ffmpeg-20180331-be502ec-win64-static\bin\'
        res_v_f_dir = 'D:\myvonline'
        res_v_f_dir =myv_dir
        mp3_l = [k for k in uid_d[uid]['sen_d']]
    
        mystep = 5
        loop_times = math.ceil(len(mp3_l) / mystep)
        mp3_2_l = []
        for mp3cut in range(loop_times):
            tmp_l = mp3_l[mp3cut * mystep:(mp3cut + 1) * mystep]
            res_mp3_cut = '{}{}{}{}{}{}{}'.format(res_mp3_f_dir, int(time.time()), '_', uid, 'mp3cut', mp3cut, '.mp3')
            d = '{}{}{}{}{}'.format(ffmpeg_f_dir, '  -i "concat:', '|'.join(tmp_l), '"  -acodec copy ', res_mp3_cut)
            print(d)
            os.system(d)
            time.sleep(3)
            mp3_2_l.append(res_mp3_cut)
    
        res_mp3 = '{}{}{}{}{}'.format(res_mp3_f_dir, int(time.time()), '_', uid, '.mp3')
        #    d = '{}{}{}{}{}'.format(ffmpeg_f_dir, '  -i "concat:', '|'.join(mp3_l), '"  -acodec copy ', res_mp3)
        d = '{}{}{}{}{}'.format(ffmpeg_f_dir, '  -i "concat:', '|'.join(mp3_2_l), '"  -acodec copy ', res_mp3)
        print(d)
        os.system(d)
        #  time.sleep(audio_spend)
        res_v = '{}{}{}{}{}'.format(res_v_f_dir, int(time.time()), '_', uid, '.mp4')
        res_v = '{}{}{}{}{}{}'.format(res_v_f_dir, os_sep, uid_d[uid]['dbid'], '_', t_spend_per_imgperiod, '.mp4')
        d = '{}{}{}{}{}{}{}'.format(ffmpeg_f_dir, ' -i ', res_mp3, ' -i ', f_v, ' ', res_v)
        print(d)
        os.system(d)
        #   time.sleep(audio_spend)
        # time.sleep(30)
        print('fffffffffff')
    

      

    ssh://root@101.21.1.2:22/usr/bin/python -u /data/xiaole_dl_img/product.v.one.banner.fixedperiod.genv.nv.test.py
    ---------------
    /data/xiaole_dl_img/dlDBimg/myv/49855227_5TEST.mp4
    /data/xiaole_dl_img/dlDBimg/mybanner/my_BANNER_c2_20180126230709_39819.jpg
    1200 414
    /data/xiaole_dl_img/dlDBimg/mybanner/my_BANNER_c2_20180126230708_58430.jpg
    1200 414
    /data/xiaole_dl_img/dlDBimg/mybanner/my_BANNER_c2_20171016172703_47076.jpg
    1200 414
    /data/xiaole_dl_img/dlDBimg/mybanner/my_BANNER_c2_20180126230709_39819.jpg
    1200 414
    /data/xiaole_dl_img/dlDBimg/mybanner/my_BANNER_c2_20180126230709_39819.jpg
    1200 414
    /data/xiaole_dl_img/dlDBimg/mybanner/my_BANNER_c2_20180126230708_58430.jpg
    1200 414
    /data/xiaole_dl_img/dlDBimg/mybanner/my_BANNER_c2_20171016172703_47076.jpg
    1200 414
    /data/xiaole_dl_img/dlDBimg/mybanner/my_BANNER_c2_20180126230709_39819.jpg
    1200 414
    /data/xiaole_dl_img/dlDBimg/mybanner/my_BANNER_c2_20180126230709_39819.jpg
    1200 414
    /data/xiaole_dl_img/dlDBimg/mybanner/my_BANNER_c2_20180126230708_58430.jpg
    1200 414
    /data/xiaole_dl_img/dlDBimg/mybanner/my_BANNER_c2_20171016172703_47076.jpg
    1200 414
    /data/xiaole_dl_img/dlDBimg/mybanner/my_BANNER_c2_20180126230709_39819.jpg
    1200 414
    /data/xiaole_dl_img/dlDBimg/mybanner/my_BANNER_c2_20180126230709_39819.jpg
    1200 414
    last
    /data/xiaole_dl_img/dlDBimg/mybanner/my_BANNER_c2_20180126230709_39819.jpg
    1200 414
    /root/.imageio/ffmpeg/ffmpeg-linux64-v3.3.1  -i "concat:/data/xiaole_dl_img/dlDBimg/mymp3/0428UNIX50001655_49855227_0.mp3"  -acodec copy /data/xiaole_dl_img/dlDBimg/mymp3_middle/1524904948_50001655mp3cut0.mp3
    ffmpeg version N-86111-ga441aa90e8-static http://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2017 the FFmpeg developers
      built with gcc 5.4.1 (Debian 5.4.1-8) 20170304
      configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc-5 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gray --enable-libass --enable-libfreetype --enable-libfribidi --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg
      libavutil      55. 63.100 / 55. 63.100
      libavcodec     57. 96.101 / 57. 96.101
      libavformat    57. 72.101 / 57. 72.101
      libavdevice    57.  7.100 / 57.  7.100
      libavfilter     6. 89.101 /  6. 89.101
      libswscale      4.  7.101 /  4.  7.101
      libswresample   2.  8.100 /  2.  8.100
      libpostproc    54.  6.100 / 54.  6.100
    [mp3 @ 0x5312480] Estimating duration from bitrate, this may be inaccurate
    Input #0, mp3, from 'concat:/data/xiaole_dl_img/dlDBimg/mymp3/0428UNIX50001655_49855227_0.mp3':
      Duration: 00:01:07.14, start: 0.000000, bitrate: 16 kb/s
        Stream #0:0: Audio: mp3, 16000 Hz, mono, s16p, 16 kb/s
    Output #0, mp3, to '/data/xiaole_dl_img/dlDBimg/mymp3_middle/1524904948_50001655mp3cut0.mp3':
      Metadata:
        TSSE            : Lavf57.72.101
        Stream #0:0: Audio: mp3, 16000 Hz, mono, s16p, 16 kb/s
    Stream mapping:
      Stream #0:0 -> #0:0 (copy)
    Press [q] to stop, [?] for help
    size=     131kB time=00:01:07.10 bitrate=  16.0kbits/s speed=7.53e+03x    
    video:0kB audio:131kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.167560%
    /root/.imageio/ffmpeg/ffmpeg-linux64-v3.3.1  -i "concat:/data/xiaole_dl_img/dlDBimg/mymp3_middle/1524904948_50001655mp3cut0.mp3"  -acodec copy /data/xiaole_dl_img/dlDBimg/mymp3_middle/1524904951_50001655.mp3
    ffmpeg version N-86111-ga441aa90e8-static http://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2017 the FFmpeg developers
      built with gcc 5.4.1 (Debian 5.4.1-8) 20170304
      configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc-5 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gray --enable-libass --enable-libfreetype --enable-libfribidi --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg
      libavutil      55. 63.100 / 55. 63.100
      libavcodec     57. 96.101 / 57. 96.101
      libavformat    57. 72.101 / 57. 72.101
      libavdevice    57.  7.100 / 57.  7.100
      libavfilter     6. 89.101 /  6. 89.101
      libswscale      4.  7.101 /  4.  7.101
      libswresample   2.  8.100 /  2.  8.100
      libpostproc    54.  6.100 / 54.  6.100
    Input #0, mp3, from 'concat:/data/xiaole_dl_img/dlDBimg/mymp3_middle/1524904948_50001655mp3cut0.mp3':
      Metadata:
        encoder         : Lavf57.72.101
      Duration: 00:01:07.14, start: 0.033063, bitrate: 16 kb/s
        Stream #0:0: Audio: mp3, 16000 Hz, mono, s16p, 16 kb/s
    Output #0, mp3, to '/data/xiaole_dl_img/dlDBimg/mymp3_middle/1524904951_50001655.mp3':
      Metadata:
        TSSE            : Lavf57.72.101
        Stream #0:0: Audio: mp3, 16000 Hz, mono, s16p, 16 kb/s
    Stream mapping:
      Stream #0:0 -> #0:0 (copy)
    Press [q] to stop, [?] for help
    size=     131kB time=00:01:07.07 bitrate=  16.0kbits/s speed=7.69e+03x    
    video:0kB audio:131kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.167560%
    /data/xiaole_dl_img/dlDBimg/myv/49855227_5TEST.mp4
    /root/.imageio/ffmpeg/ffmpeg-linux64-v3.3.1 -i /data/xiaole_dl_img/dlDBimg/mymp3_middle/1524904951_50001655.mp3 -i /data/xiaole_dl_img/dlDBimg/myv_middle500016551524904938TEST.avi /data/xiaole_dl_img/dlDBimg/myv/49855227_5TEST.mp4
    ffmpeg version N-86111-ga441aa90e8-static http://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2017 the FFmpeg developers
      built with gcc 5.4.1 (Debian 5.4.1-8) 20170304
      configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc-5 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gray --enable-libass --enable-libfreetype --enable-libfribidi --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg
      libavutil      55. 63.100 / 55. 63.100
      libavcodec     57. 96.101 / 57. 96.101
      libavformat    57. 72.101 / 57. 72.101
      libavdevice    57.  7.100 / 57.  7.100
      libavfilter     6. 89.101 /  6. 89.101
      libswscale      4.  7.101 /  4.  7.101
      libswresample   2.  8.100 /  2.  8.100
      libpostproc    54.  6.100 / 54.  6.100
    Input #0, mp3, from '/data/xiaole_dl_img/dlDBimg/mymp3_middle/1524904951_50001655.mp3':
      Metadata:
        encoder         : Lavf57.72.101
      Duration: 00:01:07.14, start: 0.033063, bitrate: 16 kb/s
        Stream #0:0: Audio: mp3, 16000 Hz, mono, s16p, 16 kb/s
    Input #1, avi, from '/data/xiaole_dl_img/dlDBimg/myv_middle500016551524904938TEST.avi':
      Duration: 00:01:07.15, start: 0.000000, bitrate: 30906 kb/s
        Stream #1:0: Video: mjpeg (MJPG / 0x47504A4D), yuvj420p(pc, bt470bg/unknown/unknown), 1200x414 [SAR 1:1 DAR 200:69], 30925 kb/s, 20 fps, 20 tbr, 20 tbn, 20 tbc
    Stream mapping:
      Stream #1:0 -> #0:0 (mjpeg (native) -> h264 (libx264))
      Stream #0:0 -> #0:1 (mp3 (native) -> aac (native))
    Press [q] to stop, [?] for help
    No pixel format specified, yuvj420p for H.264 encoding chosen.
    Use -pix_fmt yuv420p for compatibility with outdated media players.
    [libx264 @ 0x565b1c0] using SAR=1/1
    [libx264 @ 0x565b1c0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 AVX2 LZCNT BMI2
    [libx264 @ 0x565b1c0] profile High, level 3.1
    [libx264 @ 0x565b1c0] 264 - core 148 r333 90a61ec - H.264/MPEG-4 AVC codec - Copyleft 2003-2017 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=20 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
    Output #0, mp4, to '/data/xiaole_dl_img/dlDBimg/myv/49855227_5TEST.mp4':
      Metadata:
        encoder         : Lavf57.72.101
        Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuvj420p(pc, progressive), 1200x414 [SAR 1:1 DAR 200:69], q=-1--1, 20 fps, 10240 tbn, 20 tbc
        Metadata:
          encoder         : Lavc57.96.101 libx264
        Side data:
          cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
        Stream #0:1: Audio: aac (LC) ([64][0][0][0] / 0x0040), 16000 Hz, mono, fltp, 69 kb/s
        Metadata:
          encoder         : Lavc57.96.101 aac
    frame= 1343 fps=175 q=-1.0 Lsize=    2242kB time=00:01:07.13 bitrate= 273.6kbits/s speed=8.74x    
    video:1633kB audio:573kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.640778%
    [libx264 @ 0x565b1c0] frame I:10    Avg QP:15.61  size:162770
    [libx264 @ 0x565b1c0] frame P:336   Avg QP:15.84  size:    56
    [libx264 @ 0x565b1c0] frame B:997   Avg QP:20.75  size:    25
    [libx264 @ 0x565b1c0] consecutive B-frames:  0.7%  0.1%  2.0% 97.1%
    [libx264 @ 0x565b1c0] mb I  I16..4:  1.6% 77.2% 21.2%
    [libx264 @ 0x565b1c0] mb P  I16..4:  0.0%  0.0%  0.0%  P16..4:  0.4%  0.0%  0.0%  0.0%  0.0%    skip:99.6%
    [libx264 @ 0x565b1c0] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8:  0.0%  0.0%  0.0%  direct: 0.0%  skip:100.0%  L0:32.1% L1:67.9% BI: 0.0%
    [libx264 @ 0x565b1c0] 8x8 transform intra:77.2% inter:36.3%
    [libx264 @ 0x565b1c0] coded y,uvDC,uvAC intra: 95.6% 92.3% 86.8% inter: 0.0% 0.1% 0.0%
    [libx264 @ 0x565b1c0] i16 v,h,dc,p: 16% 26% 23% 35%
    [libx264 @ 0x565b1c0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 19% 24% 17%  5%  6%  6%  8%  7%  9%
    [libx264 @ 0x565b1c0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 20% 18% 10%  8%  9%  8%  9%  9%  9%
    [libx264 @ 0x565b1c0] i8c dc,h,v,p: 45% 24% 18% 13%
    [libx264 @ 0x565b1c0] Weighted P-Frames: Y:0.0% UV:0.0%
    [libx264 @ 0x565b1c0] ref P L0: 98.5%  0.1%  1.1%  0.4%
    [libx264 @ 0x565b1c0] ref B L0: 67.5% 32.5%
    [libx264 @ 0x565b1c0] ref B L1: 89.6% 10.4%
    [libx264 @ 0x565b1c0] kb/s:199.16
    [aac @ 0x565c660] Qavg: 48848.047
    fffffffffff
    
    Process finished with exit code 0
    
    import glob
    import os
    import random
    import time, math
    import logging
    
    start_time = time.strftime('%Y%m%d_%H%M%S', time.localtime(time.time()))
    os_sep = os.sep
    this_file_abspath, this_file_name = os.path.dirname(os.path.abspath(__file__)), os.path.abspath(__file__).split(os_sep)[
        -1]
    logf = this_file_name + '.log'
    try:
        logging.basicConfig(level=logging.INFO,
                            format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s[thread:%(thread)d][process:%(process)d]',
                            datefmt='%a, %d %b %Y %H:%M:%S',
                            filename=logf,
                            filemode='a')
    except Exception as e:
        s = '%s%s%s' % ('logging.basicConfig EXCEPTION ', time.strftime('%Y%m%d_%H%M%S', time.localtime(time.time())), e)
        with open(logf, 'a') as fo:
            fo.write(s)
            os._exit(4002)
    logging.info('START')
    
    save_dir = '/data/xiaole_dl_img/dlDBimg'
    mybanner_dir, mylogo_dir, mymp3_dir, myv_dir, myhtml_dir, myv_tmp_dir = '{}{}{}'.format(save_dir, os_sep,
                                                                                            'mybanner'), '{}{}{}'.format(
        save_dir,
        os_sep,
        'mylogo'), '{}{}{}'.format(
        save_dir, os_sep, 'mymp3'), '{}{}{}'.format(save_dir, os_sep, 'myv'), '{}{}{}'.format(save_dir, os_sep,
                                                                                              'myhtml'), '{}{}{}'.format(
        save_dir, os_sep, 'myv_tmp')
    
    # 0428UNIX50005499_32.mp3
    today_s = '0428UNIX'
    f_mp3_d = '{}{}{}'.format(mymp3_dir, os_sep, '*.mp3')
    mp3s = glob.glob(f_mp3_d)
    mp3s_uid_set = set([i.split(os_sep)[-1].split('_')[0].split(today_s)[-1] for i in mp3s])
    
    f = 'uid.username.txt'
    un_uid_d = {}
    with open(f, 'r', encoding='utf-8') as fr:
        for i in fr:
            uid, un = i.replace('
    ', '').split('	')
            un_uid_d[un] = uid
    
    had_banner_uid_l = []
    # beijingshifang_BANNER_c2_20161031091307_30624.jpg
    f_banner_d = '{}{}{}'.format(mybanner_dir, os_sep, '*.*g')
    banners = glob.glob(f_banner_d)
    banners_un_set = set([i.split(os_sep)[-1].split('_BANNER_')[0] for i in banners])
    for un in banners_un_set:
        if un in un_uid_d:
            uid = un_uid_d[un]
            if uid not in had_banner_uid_l:
                had_banner_uid_l.append(uid)
    banners_uid_set = set(had_banner_uid_l)
    # 34031923logo.jpg
    f_logo_d = '{}{}{}'.format(mylogo_dir, os_sep, '*.*g')
    logos = glob.glob(f_logo_d)
    logos_uid_set = set([i.split(os_sep)[-1].split('logo.')[0] for i in logos])
    
    banners_logos_set = banners_uid_set & logos_uid_set
    
    gen_d, uid_d = {}, {}
    
    banner_img_dir = '{}{}{}'.format(mybanner_dir, os_sep, '*.*g')
    banner_imgs = glob.glob(banner_img_dir)
    
    for uid in banners_logos_set:
        uid_d[uid] = {}
        un, logo_f_uid, imgs_l = '', '', []
        for un_ in un_uid_d:
            if un_uid_d[un_] == uid:
                un = un_
        for i in banners:
            if un in i:
                imgs_l.append(i)
        for i in logos:
            if uid in i:
                logo_f_uid = i
        uid_d[uid]['un'], uid_d[uid]['logo_f_uid'], uid_d[uid]['imgs_l'] = un, logo_f_uid, imgs_l
    
    from bs4 import *
    
    xls = 'XLS0419'
    f = 'db.data.snap.txt'
    f = 'db.data.snap428am.txt'
    
    myp, myp_num = 5, 7
    with open(f, 'r', encoding='utf-8') as fr:
        for i in fr:
            ll = i.split(xls)
    
            dbid, uid, username, html_ = [i.replace('	', '') for i in ll]
    
            if uid not in uid_d:
                continue
    
            if int(dbid) % myp_num != myp:
                # if int(dbid) != 49855227:
                continue
    
            # print(ll)
    
            # if uid not in banners_logos_set:
            #     print('------------NOT in banners_logos_set')
            #     continue
            #
            # if uid not in mp3s_uid_set:
            #     print('------------uid not in mp3s_uid_set')
            #     continue
    
            gen_d[dbid] = {}
            gen_d[dbid]['uid'], gen_d[dbid]['mp3'] = uid, {}
            print('---------------')
            myhtml = '{}{}{}tmp.html'.format(myhtml_dir, os_sep, random.randint(123, 999))
            with open(myhtml, 'w', encoding='utf-8') as fw:
                fw.write(html_)
            with open(myhtml, 'r', encoding='utf-8') as myhtml_o:
                bs = BeautifulSoup(myhtml_o, 'html.parser')
                txt = bs.text
            # GOOD!!!!   字幕同步
            # sentence_l = Cut(list(cutlist), list(txt))
            # sentence_l_noblank = []
            # for i in sentence_l:
            #     if i != '
    ' and len(i.replace(' ', '')) > 0:
            #         sentence_l_noblank.append(i.replace('
    ', ''))
            # GOOD!!!!
            str_per_len = 300
            r_ = math.ceil(len(txt) / str_per_len)
            sentence_l_noblank = [txt[i * str_per_len:(i + 1) * str_per_len] for i in range(r_)]
            uid_n = 0
            for screen_str in sentence_l_noblank:
                uid_sen = '{}{}{}{}{}'.format(uid, '_', dbid, '_', uid_n)
                f_w = '{}{}{}{}{}'.format(mymp3_dir, os_sep, '0428UNIX', uid_sen, '.mp3')
                # print(screen_str)
                gen_d[dbid]['mp3'][f_w] = ''
                try:
                    # gen_bd_mp3(uid_sen, screen_str, f_w)
                    pass
                except Exception as e:
                    l = [str(i) for i in [uid, uid_d[uid]['dbid'], e, screen_str]]
                    log_s = '||'.join(l)
                    logging.exception(log_s)
                    print(log_s)
    
    import os, time, glob, math
    import imageio
    
    imageio.plugins.ffmpeg.download()
    from mutagen.easyid3 import EasyID3
    from mutagen.mp3 import MP3
    from PIL import Image, ImageDraw, ImageFont
    import cv2
    import numpy as np
    
    
    def resize_rescale_pilimg(img_f, w_h_tuple, mid_factor=1):
        img_n, img_type = img_f.split('.')[-2], img_f.split('.')[-1]
        img_n_resize_rescale_pilimg_dir = '{}{}{}'.format(os_sep.join(img_n.split(os_sep)[:-1]),
                                                          'resize_rescale_pilimg',
                                                          os_sep, img_n.split(os_sep)[-1], os_sep)
        img_n_resize_rescale_pilimg = '{}{}{}'.format(img_n_resize_rescale_pilimg_dir, img_n.split(os_sep)[-1], '.PNG')
        img_type = 'PNG'
        img_f_new = img_n_resize_rescale_pilimg
        mid_icon = Image.open(img_f)
        mid_icon_w, mid_icon_h = w_h_tuple[0] * mid_factor, w_h_tuple[1] * mid_factor
        mid_icon = mid_icon.resize((mid_icon_w, mid_icon_h), Image.ANTIALIAS)
        mid_icon.save(img_n_resize_rescale_pilimg, img_type)
        return img_f_new
    
    
    logo_f = '{}{}{}'.format(mylogo_dir, os_sep, 'g3logo.jpg')
    for dbid in gen_d:
        s = '----------myp', myp, 'myp_num', myp_num, '-------------------'
        print(s)
        logging.info(s)
        uid, mp3_l = gen_d[dbid]['uid'], gen_d[dbid]['mp3']
        logo_f_uid, imgs_l = uid_d[uid]['logo_f_uid'], uid_d[uid]['imgs_l']
        res_v_f_dir = myv_dir
        f_img_d = '{}{}{}'.format(res_v_f_dir, os_sep, '*.mp4')
        vs = glob.glob(f_img_d)
        t_spend_per_imgperiod = 5
        res_v = '{}{}{}{}{}{}'.format(res_v_f_dir, os_sep, dbid, '_', t_spend_per_imgperiod, '.mp4')
        print(res_v)
        if res_v in vs:
            continue
        img_size_d = {}
        w_h_size_min = [12345, 12345]
        first_one = imgs_l.append(imgs_l[int(time.time()) % len(imgs_l)])
        imgs_l = [i for i in sorted(imgs_l, reverse=True)]
    
        img_break = False
        for i in imgs_l:
            img = cv2.imread(i)
            try:
                w_h_s = '{},{}'.format(img.shape[1], img.shape[0])
            except Exception as e:
                l = [str(ii) for ii in [dbid, i, e, 'img_break']]
                log_s = '||'.join(l)
                logging.exception(log_s)
                print(log_s)
                img_break = True
                break
    
            w, h = [int(i) for i in w_h_s.split(',')]
            if w * h < w_h_size_min[0] * w_h_size_min[1]:
                w_h_size_min = [w, h]
            if w_h_s not in img_size_d:
                img_size_d[w_h_s] = 1
            else:
                img_size_d[w_h_s] += 1
        if img_break:
            continue
        # 取众数
        mode_img_size_wh = [int(i) for i in
                            sorted(img_size_d.items(), key=lambda mytuple: mytuple[1], reverse=True)[0][0].split(',')]
        if mode_img_size_wh[0] * mode_img_size_wh[1] > w_h_size_min[0] * w_h_size_min[1]:
            mode_img_size_wh = w_h_size_min
    
        if mode_img_size_wh[0] * mode_img_size_wh[1] > 1200 * 414:
            mode_img_size_wh = [1200, 414]
        br_step_test_l = [0.0185, 0.0195, 0.02, 0.028]
        br_step = math.floor((mode_img_size_wh[0]) * br_step_test_l[-1])
        audio_spend = 0
        for f_mp3 in mp3_l:
            # gen mp3 --SMALL-DATA
            EasyID3.valid_keys["comment"] = "COMM::'XXX'"
            try:
                id3info = MP3(f_mp3, ID3=EasyID3)
            except Exception as e:
                l = [str(i) for i in [dbid, f_mp3, e]]
                log_s = '||'.join(l)
                logging.exception(log_s)
                print(log_s)
                continue
            audio_spend += id3info.info.length
            #  f_v = '{}{}{}{}'.format('D:\myv\', uid, int(time.time()), '.avi')
        f_v = '{}{}{}{}'.format(myv_dir.replace('myv', 'myv_middle'), uid, int(time.time()), 'TEST.avi')
        fps, fourcc = 20, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')
        videoWriter = cv2.VideoWriter(f_v, fourcc, fps, (mode_img_size_wh[0], mode_img_size_wh[1]))
        imgs_l_len = len(uid_d[uid]['imgs_l'])
        t_spend_per_imgperiod = 5
        t_spend_per_imgperiod_mod = audio_spend % t_spend_per_imgperiod
        t_spend_per_imgperiod_times = math.floor(audio_spend / t_spend_per_imgperiod)
        fps_loop_times_per_imgperiod = math.ceil(t_spend_per_imgperiod * fps)
        imgname = ''
        imgname_ori = ''
    
        img_break = False
    
        for myloop in range(t_spend_per_imgperiod_times):
            imgname_ori = uid_d[uid]['imgs_l'][myloop % imgs_l_len]
            imgname = uid_d[uid]['imgs_l'][myloop % imgs_l_len]
            print(imgname)
            frame = cv2.imread(imgname)
            print(frame.shape[1], frame.shape[0])
            if (frame.shape[1], frame.shape[0]) != (mode_img_size_wh[0], mode_img_size_wh[1]):
                imgname = resize_rescale_pilimg(imgname, (mode_img_size_wh[0], mode_img_size_wh[1]))
                frame = cv2.imread(imgname)
            else:
                pass
            img1 = cv2.imread(imgname)  # 加载图像
            img2 = cv2.imread(logo_f_uid)  # logo  客户在左边
            rows, cols, channels = img2.shape
            roi = img1[0:rows, 0:cols]  # 取img1的这个区域来处理
            try:
                img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)  # 建立logo的二值图,也建立相反的二值图
            except Exception as e:
                l = [str(ii) for ii in [dbid, img2, e, 'img_break']]
                log_s = '||'.join(l)
                logging.exception(log_s)
                print(log_s)
                img_break = True
                break
    
            ret, mask = cv2.threshold(img2gray, 175, 255, cv2.THRESH_BINARY)  # 二值化
            mask_inv = cv2.bitwise_not(mask)  # 做非操作,黑的变白,白的变黑,黑色0,白色255
            img1_bg = cv2.bitwise_and(roi, roi, mask=mask)  # 与操作 ,参数输入,输出,与mask做and操作,黑色的被填充
            img2_fg = cv2.bitwise_and(img2, img2, mask=mask_inv)  # 与操作
            dst = cv2.add(img1_bg, img2_fg)  # 相加
            img1[0:rows, 0:cols] = dst  # 把添加了logo的该区域赋值回原来的地方
            img3 = cv2.imread(logo_f)  # logo our在右边
            rows, cols, channels = img3.shape
            rows1, cols1, channels1 = img1.shape
            roi = img1[0:rows, cols1 - cols:cols1]  # 取img1的这个区域来处理
            img3gray = cv2.cvtColor(img3, cv2.COLOR_BGR2GRAY)  # 建立logo的二值图,也建立相反的二值图
            ret, mask = cv2.threshold(img3gray, 175, 255, cv2.THRESH_BINARY)  # 二值化
            mask_inv = cv2.bitwise_not(mask)  # 做非操作,黑的变白,白的变黑,黑色0,白色255
            img1_bg = cv2.bitwise_and(roi, roi, mask=mask)  # 与操作 ,参数输入,输出,与mask做and操作,黑色的被填充
            img3_fg = cv2.bitwise_and(img3, img3, mask=mask_inv)  # 与操作
            dst = cv2.add(img1_bg, img3_fg)  # 相加
            img1[0:rows, cols1 - cols:cols1] = dst  # 把添加了logo的该区域赋值回原来的地方
            frame = img1
            frame_cv2 = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            frame_pil = Image.fromarray(frame_cv2)  # 转为PIL的图片格式
            font_size = math.floor((mode_img_size_wh[0]) * 0.040)
            # font = ImageFont.truetype("simhei.ttf", font_size, encoding="utf-8")
            # f_x, f_y = math.floor((mode_img_size_wh[0]) * 0.06), math.floor(
            #     mode_img_size_wh[1] * 0.85) - br_step_times * font_size
            #
            # screen_str = ''
            #
            # ImageDraw.Draw(frame_pil).text((f_x, f_y), screen_str, (255, 0, 0), font)
            frame_cv2 = cv2.cvtColor(np.array(frame_pil), cv2.COLOR_RGB2BGR)
            img = frame_cv2
            fps_loop_times = t_spend_per_imgperiod * fps
            for fps_loop in range(fps_loop_times):
                videoWriter.write(img)
        if img_break:
            continue
    
        print('last')
        print(imgname_ori)
        if imgname_ori == '':
            print('__________________')
            l = [str(i) for i in [dbid, '', '']]
            log_s = '||'.join(l)
            logging.exception(log_s)
            print(log_s)
            continue
        new_l = uid_d[uid]['imgs_l']
        new_l.remove(imgname_ori)
        imgname = random.choice(new_l)
        frame = cv2.imread(imgname)
        print(frame.shape[1], frame.shape[0])
        if (frame.shape[1], frame.shape[0]) != (mode_img_size_wh[0], mode_img_size_wh[1]):
            imgname = resize_rescale_pilimg(imgname, (mode_img_size_wh[0], mode_img_size_wh[1]))
            frame = cv2.imread(imgname)
        else:
            pass
        img1 = cv2.imread(imgname)  # 加载图像
        img2 = cv2.imread(logo_f_uid)  # logo  客户在左边
        rows, cols, channels = img2.shape
        roi = img1[0:rows, 0:cols]  # 取img1的这个区域来处理
        img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)  # 建立logo的二值图,也建立相反的二值图
        ret, mask = cv2.threshold(img2gray, 175, 255, cv2.THRESH_BINARY)  # 二值化
        mask_inv = cv2.bitwise_not(mask)  # 做非操作,黑的变白,白的变黑,黑色0,白色255
        img1_bg = cv2.bitwise_and(roi, roi, mask=mask)  # 与操作 ,参数输入,输出,与mask做and操作,黑色的被填充
        img2_fg = cv2.bitwise_and(img2, img2, mask=mask_inv)  # 与操作
        dst = cv2.add(img1_bg, img2_fg)  # 相加
        img1[0:rows, 0:cols] = dst  # 把添加了logo的该区域赋值回原来的地方
        img3 = cv2.imread(logo_f)  # logo our在右边
        rows, cols, channels = img3.shape
        rows1, cols1, channels1 = img1.shape
        roi = img1[0:rows, cols1 - cols:cols1]  # 取img1的这个区域来处理
        img3gray = cv2.cvtColor(img3, cv2.COLOR_BGR2GRAY)  # 建立logo的二值图,也建立相反的二值图
        ret, mask = cv2.threshold(img3gray, 175, 255, cv2.THRESH_BINARY)  # 二值化
        mask_inv = cv2.bitwise_not(mask)  # 做非操作,黑的变白,白的变黑,黑色0,白色255
        img1_bg = cv2.bitwise_and(roi, roi, mask=mask)  # 与操作 ,参数输入,输出,与mask做and操作,黑色的被填充
        img3_fg = cv2.bitwise_and(img3, img3, mask=mask_inv)  # 与操作
        dst = cv2.add(img1_bg, img3_fg)  # 相加
        img1[0:rows, cols1 - cols:cols1] = dst  # 把添加了logo的该区域赋值回原来的地方
        frame = img1
        frame_cv2 = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        frame_pil = Image.fromarray(frame_cv2)  # 转为PIL的图片格式
        font_size = math.floor((mode_img_size_wh[0]) * 0.040)
        # font = ImageFont.truetype("simhei.ttf", font_size, encoding="utf-8")
        # f_x, f_y = math.floor((mode_img_size_wh[0]) * 0.06), math.floor(
        #     mode_img_size_wh[1] * 0.85) - br_step_times * font_size
        #
        # screen_str = ''
        #
        # ImageDraw.Draw(frame_pil).text((f_x, f_y), screen_str, (255, 0, 0), font)
        frame_cv2 = cv2.cvtColor(np.array(frame_pil), cv2.COLOR_RGB2BGR)
        img = frame_cv2
        fps_loop_times = math.ceil(t_spend_per_imgperiod_mod * fps)
        fps_loop_times = max(fps_loop_times, 1)
        for fps_loop in range(fps_loop_times):
            videoWriter.write(img)
    
        videoWriter.release()
        # ffmpeg_f_dir = 'D:\myv\ffmpeg-20180331-be502ec-win64-static\bin\ffmpeg.exe'
        # res_mp3_f_dir = 'D:\myv\ffmpeg-20180331-be502ec-win64-static\bin\'
        # res_v_f_dir = 'D:\myvonline'
        # res_v_f_dir =myv_dir
        #
        ffmpeg_f_dir = '/root/.imageio/ffmpeg/ffmpeg-linux64-v3.3.1'
        res_mp3_f_dir = '{}{}'.format(mymp3_dir.replace('mymp3', 'mymp3_middle'), os_sep)
        res_v_f_dir = myv_dir
    
        mp3_l_l = [i for i in mp3_l]
        mp3_l = mp3_l_l
        mystep = 5
        loop_times = math.ceil(len(mp3_l) / mystep)
        mp3_2_l = []
        for mp3cut in range(loop_times):
            tmp_l = mp3_l[mp3cut * mystep:(mp3cut + 1) * mystep]
            res_mp3_cut = '{}{}{}{}{}{}{}'.format(res_mp3_f_dir, int(time.time()), '_', uid, 'mp3cut', mp3cut, '.mp3')
            d = '{}{}{}{}{}'.format(ffmpeg_f_dir, '  -i "concat:', '|'.join(tmp_l), '"  -acodec copy ', res_mp3_cut)
            print(d)
            os.system(d)
            time.sleep(3)
            mp3_2_l.append(res_mp3_cut)
    
        res_mp3 = '{}{}{}{}{}'.format(res_mp3_f_dir, int(time.time()), '_', uid, '.mp3')
        #    d = '{}{}{}{}{}'.format(ffmpeg_f_dir, '  -i "concat:', '|'.join(mp3_l), '"  -acodec copy ', res_mp3)
        d = '{}{}{}{}{}'.format(ffmpeg_f_dir, '  -i "concat:', '|'.join(mp3_2_l), '"  -acodec copy ', res_mp3)
        print(d)
        os.system(d)
        #  time.sleep(audio_spend)
        # res_v = '{}{}{}{}{}{}'.format(res_v_f_dir, os_sep, uid_d[uid]['dbid'], '_', t_spend_per_imgperiod, 'TEST.mp4')
        print(res_v)
        d = '{}{}{}{}{}{}{}'.format(ffmpeg_f_dir, ' -i ', res_mp3, ' -i ', f_v, ' ', res_v)
        print(d)
        os.system(d)
        #   time.sleep(audio_spend)
        # time.sleep(30)
        print('fffffffffff')
    

      

  • 相关阅读:
    vector详解
    浅谈 莫斯电码&栅栏密码
    牛牛的BRD迷宫2 构造+思维
    Codeforces Round #409 C. Voltage Keepsake(二分+思维)
    hdu 2609 How many(最小表示法)
    hdu 4513(Manacher)
    codeforces 486 E. LIS of Sequence(dp)
    codeforces 486 D. Valid Sets(树形dp)
    hdu3746(kmp最小循环节)
    poj 2406 Power Strings(kmp next的应用)
  • 原文地址:https://www.cnblogs.com/rsapaper/p/8966254.html
Copyright © 2020-2023  润新知