[OHIF-Viewers]医疗数字阅片-医学影像-事件总线管理器

[OHIF-Viewers]医疗数字阅片-医学影像-事件总线管理器

 

添加按钮》调用命令》注册回调函数

App.js

import React, { Component } from 'react';
import { OidcProvider } from 'redux-oidc';
import { I18nextProvider } from 'react-i18next';
import PropTypes from 'prop-types';
import { Provider } from 'react-redux';
import { BrowserRouter as Router } from 'react-router-dom';
import { hot } from 'react-hot-loader/root';

import OHIFCornerstoneExtension from '@ohif/extension-cornerstone';

import {
    SnackbarProvider,
    ModalProvider,
    DialogProvider,
    OHIFModal,
  ErrorBoundary
} from '@ohif/ui';

import {
    CommandsManager,
    ExtensionManager,
    ServicesManager,
    HotkeysManager,
    UINotificationService,
    UIModalService,
    UIDialogService,
    MeasurementService,
    utils,
    redux as reduxOHIF,
} from '@ohif/core';

import i18n from '@ohif/i18n';

// TODO: This should not be here
//import './config';
import { setConfiguration } from './config';

/** Utils */
import {
    getUserManagerForOpenIdConnectClient,
    initWebWorkers,
} from './utils/index.js';

/** Extensions */
import { GenericViewerCommands, MeasurementsPanel } from './appExtensions';

/** Viewer */
import OHIFStandaloneViewer from './OHIFStandaloneViewer';

/** Store */
import { getActiveContexts } from './store/layout/selectors.js';
import store from './store';

/** Contexts */
import WhiteLabelingContext from './context/WhiteLabelingContext';
import UserManagerContext from './context/UserManagerContext';
import { AppProvider, useAppContext, CONTEXTS } from './context/AppContext';

/** ~~~~~~~~~~~~~ Application Setup */
const commandsManagerConfig = {
    getAppState: () => store.getState(),
    getActiveContexts: () => getActiveContexts(store.getState()),
};

/** Managers */
const commandsManager = new CommandsManager(commandsManagerConfig);
const servicesManager = new ServicesManager();
const hotkeysManager = new HotkeysManager(commandsManager, servicesManager);
let extensionManager;
/** ~~~~~~~~~~~~~ End Application Setup */

// TODO[react] Use a provider when the whole tree is React
window.store = store;

window.ohif = window.ohif || {};
window.ohif.app = {
  commandsManager,
  hotkeysManager,
  servicesManager,
  extensionManager,
};

class App extends Component {
    static propTypes = {
        config: PropTypes.oneOfType([
            PropTypes.func,
            PropTypes.shape({
                routerBasename: PropTypes.string.isRequired,
                oidc: PropTypes.array,
        whiteLabeling: PropTypes.shape({
          createLogoComponentFn: PropTypes.func,
        }),
                extensions: PropTypes.array,
            }),
        ]).isRequired,
        defaultExtensions: PropTypes.array,
    };

    static defaultProps = {
        config: {
      showStudyList: true,
            oidc: [],
            extensions: [],
        },
        defaultExtensions: [],
    };

    _appConfig;
    _userManager;

    constructor(props) {
        super(props);

        const { config, defaultExtensions } = props;

        const appDefaultConfig = {
      showStudyList: true,
            cornerstoneExtensionConfig: {},
            extensions: [],
            routerBasename: '/',
        };

        this._appConfig = {
            ...appDefaultConfig,
            ...(typeof config === 'function' ? config({ servicesManager }) : config),
        };

        const {
            servers,
            hotkeys: appConfigHotkeys,
            cornerstoneExtensionConfig,
            extensions,
            oidc,
        } = this._appConfig;

    setConfiguration(this._appConfig);

        this.initUserManager(oidc);
        _initServices([
            UINotificationService,
            UIModalService,
            UIDialogService,
            MeasurementService,
        ]);
        _initExtensions(
            [...defaultExtensions, ...extensions],
            cornerstoneExtensionConfig,
            this._appConfig
        );

        /*
         * Must run after extension commands are registered
         * if there is no hotkeys from localStorage set up from config.
         */
        _initHotkeys(appConfigHotkeys);
        _initServers(servers);
        initWebWorkers();
    }

    render() {
    const { whiteLabeling, routerBasename } = this._appConfig;
        const {
            UINotificationService,
            UIDialogService,
            UIModalService,
            MeasurementService,
        } = servicesManager.services;

        //拥有 _userManager 模块才会走,  这个要对接OIDC模块,就是开放身份认证系统
        if (this._userManager) {
            return (
        <ErrorBoundary context='App'>
          <Provider store={store}>
            <AppProvider config={this._appConfig}>
              <I18nextProvider i18n={i18n}>
                <OidcProvider store={store} userManager={this._userManager}>
                  <UserManagerContext.Provider value={this._userManager}>
                    <Router basename={routerBasename}>
                      <WhiteLabelingContext.Provider value={whiteLabeling}>
                        <SnackbarProvider service={UINotificationService}>
                          <DialogProvider service={UIDialogService}>
                            <ModalProvider
                              modal={OHIFModal}
                              service={UIModalService}
                            >
                              <OHIFStandaloneViewer
                                userManager={this._userManager}
                              />
                            </ModalProvider>
                          </DialogProvider>
                        </SnackbarProvider>
                      </WhiteLabelingContext.Provider>
                    </Router>
                  </UserManagerContext.Provider>
                </OidcProvider>
              </I18nextProvider>
            </AppProvider>
          </Provider>
         </ErrorBoundary>
       
            );
        }
        console.log("hit 初始页面");

        return (
      <ErrorBoundary context='App'>
        <Provider store={store}>
          <AppProvider config={this._appConfig}>
            <I18nextProvider i18n={i18n}>
              <Router basename={routerBasename}>
                <WhiteLabelingContext.Provider value={whiteLabeling}>
                  <SnackbarProvider service={UINotificationService}>
                    <DialogProvider service={UIDialogService}>
                      <ModalProvider modal={OHIFModal} service={UIModalService}>
                        <OHIFStandaloneViewer />
                      </ModalProvider>
                    </DialogProvider>
                  </SnackbarProvider>
                </WhiteLabelingContext.Provider>
              </Router>
            </I18nextProvider>
          </AppProvider>
        </Provider>
         </ErrorBoundary>
     
        );
    }

    initUserManager(oidc) {
        if (oidc && !!oidc.length) {
            const firstOpenIdClient = this._appConfig.oidc[0];

            const { protocol, host } = window.location;
            const { routerBasename } = this._appConfig;
            const baseUri = `${protocol}//${host}${routerBasename}`;

            const redirect_uri = firstOpenIdClient.redirect_uri || '/callback';
            const silent_redirect_uri =
                firstOpenIdClient.silent_redirect_uri || '/silent-refresh.html';
            const post_logout_redirect_uri =
                firstOpenIdClient.post_logout_redirect_uri || '/';

            const openIdConnectConfiguration = Object.assign({}, firstOpenIdClient, {
                redirect_uri: _makeAbsoluteIfNecessary(redirect_uri, baseUri),
                silent_redirect_uri: _makeAbsoluteIfNecessary(
                    silent_redirect_uri,
                    baseUri
                ),
                post_logout_redirect_uri: _makeAbsoluteIfNecessary(
                    post_logout_redirect_uri,
                    baseUri
                ),
            });

            this._userManager = getUserManagerForOpenIdConnectClient(
                store,
                openIdConnectConfiguration
            );
        }
    }
}

function _initServices(services) {
    servicesManager.registerServices(services);
}

/**
 * @param
 */
function _initExtensions(extensions, cornerstoneExtensionConfig, appConfig) {
    extensionManager = new ExtensionManager({
        commandsManager,
        servicesManager,
        appConfig,
    api: {
      contexts: CONTEXTS,
      hooks: {
        useAppContext
      }
    }
    });

    const requiredExtensions = [
        GenericViewerCommands,
        [OHIFCornerstoneExtension, cornerstoneExtensionConfig],
        /* WARNING: MUST BE REGISTERED _AFTER_ OHIFCornerstoneExtension */
        MeasurementsPanel,
    ];
    const mergedExtensions = requiredExtensions.concat(extensions);
    extensionManager.registerExtensions(mergedExtensions);
}

/**
 *
 * @param {Object} appConfigHotkeys - Default hotkeys, as defined by app config
 */
function _initHotkeys(appConfigHotkeys) {
    // TODO: Use something more resilient
    // TODO: Mozilla has a special library for this
    const userPreferredHotkeys = JSON.parse(
        localStorage.getItem('hotkey-definitions') || '{}'
    );

    // TODO: hotkeysManager.isValidDefinitionObject(/* */)
    const hasUserPreferences =
        userPreferredHotkeys && Object.keys(userPreferredHotkeys).length > 0;
    if (hasUserPreferences) {
        hotkeysManager.setHotkeys(userPreferredHotkeys);
    } else {
        hotkeysManager.setHotkeys(appConfigHotkeys);
    }

    hotkeysManager.setDefaultHotKeys(appConfigHotkeys);
}

function _initServers(servers) {
    if (servers) {
        utils.addServers(servers, store);
    }
}

function _isAbsoluteUrl(url) {
    return url.includes('http://') || url.includes('https://');
}

function _makeAbsoluteIfNecessary(url, base_url) {
    if (_isAbsoluteUrl(url)) {
        return url;
    }

    /*
     * Make sure base_url and url are not duplicating slashes.
     */
    if (base_url[base_url.length - 1] === '/') {
        base_url = base_url.slice(0, base_url.length - 1);
    }

    return base_url + url;
}

/*
 * Only wrap/use hot if in dev.
 */
const ExportedApp = process.env.NODE_ENV === 'development' ? hot(App) : App;

export default ExportedApp;
export { commandsManager, extensionManager, hotkeysManager, servicesManager };

 

其中这里是进行定义管理器

/** Managers */
const commandsManager = new CommandsManager(commandsManagerConfig);
const servicesManager = new ServicesManager();
const hotkeysManager = new HotkeysManager(commandsManager, servicesManager);
let extensionManager;
/** ~~~~~~~~~~~~~ End Application Setup */

// TODO[react] Use a provider when the whole tree is React
window.store = store;

window.ohif = window.ohif || {};
window.ohif.app = {
  commandsManager,
  hotkeysManager,
  servicesManager,
  extensionManager,
};

commandsManager管理整个系统的命令 和 回调函数, 现有的头部所有按钮命令都是通过commandsManager分发的;

CommandsManager.js定义

import log from '../log.js';

/**
 * The definition of a command
 *
 * @typedef {Object} CommandDefinition
 * @property {Function} commandFn - Command to call
 * @property {Array} storeContexts - Array of string of modules required from store
 * @property {Object} options - Object of params to pass action
 */

/**
 * The Commands Manager tracks named commands (or functions) that are scoped to
 * a context. When we attempt to run a command with a given name, we look for it
 * in our active contexts. If found, we run the command, passing in any application
 * or call specific data specified in the command's definition.
 *
 * NOTE: A more robust version of the CommandsManager lives in v1. If you're looking
 * to extend this class, please check it's source before adding new methods.
 */
export class CommandsManager {
  constructor({ getAppState, getActiveContexts } = {}) {
    this.contexts = {};

    if (!getAppState || !getActiveContexts) {
      log.warn(
        'CommandsManager was instantiated without getAppState() or getActiveContexts()'
      );
    }

    this._getAppState = getAppState;
    this._getActiveContexts = getActiveContexts;
  }

  /**
   * Allows us to create commands "per context". An example would be the "Cornerstone"
   * context having a `SaveImage` command, and the "VTK" context having a `SaveImage`
   * command. The distinction of a context allows us to call the command in either
   * context, and have faith that the correct command will be run.
   *
   * @method
   * @param {string} contextName - Namespace for commands
   * @returns {undefined}
   */
  createContext(contextName) {
    if (!contextName) {
      return;
    }

    if (this.contexts[contextName]) {
      return this.clearContext(contextName);
    }

    this.contexts[contextName] = {};
  }

  /**
   * Returns all command definitions for a given context
   *
   * @method
   * @param {string} contextName - Namespace for commands
   * @returns {Object} - the matched context
   */
  getContext(contextName) {
    const context = this.contexts[contextName];

    if (!context) {
      return;
    }

    return context;
  }

  /**
   * Clears all registered commands for a given context.
   *
   * @param {string} contextName - Namespace for commands
   * @returns {undefined}
   */
  clearContext(contextName) {
    if (!contextName) {
      return;
    }

    this.contexts[contextName] = {};
  }

  /**
   * Register a new command with the command manager. Scoped to a context, and
   * with a definition to assist command callers w/ providing the necessary params
   *
   * @method
   * @param {string} contextName - Namespace for command; often scoped to the extension that added it
   * @param {string} commandName - Unique name identifying the command
   * @param {CommandDefinition} definition - {@link CommandDefinition}
   */
  registerCommand(contextName, commandName, definition) {
    if (typeof definition !== 'object') {
      return;
    }

    const context = this.getContext(contextName);
    if (!context) {
      return;
    }

    context[commandName] = definition;
  }

  /**
   * Finds a command with the provided name if it exists in the specified context,
   * or a currently active context.
   *
   * @method
   * @param {String} commandName - Command to find
   * @param {String} [contextName] - Specific command to look in. Defaults to current activeContexts
   */
  getCommand(commandName, contextName) {
    let contexts = [];
    if (contextName) {
      const context = this.getContext(contextName);
      if (context) {
        contexts.push(context);
      }
    } else {
      const activeContexts = this._getActiveContexts();
      activeContexts.forEach(activeContext => {
        const context = this.getContext(activeContext);
        if (context) {
          contexts.push(context);
        }
      });
    }

    if (contexts.length === 0) {
      return;
    }

    let foundCommand;
    contexts.forEach(context => {
      if (context[commandName]) {
        foundCommand = context[commandName];
      }
    });

    return foundCommand;
  }

  /**
   *
   * @method
   * @param {String} commandName
   * @param {Object} [options={}] - Extra options to pass the command. Like a mousedown event
   * @param {String} [contextName]
   */
    runCommand(commandName, options = {}, contextName) {

    const definition = this.getCommand(commandName, contextName);
    if (!definition) {
      log.warn(`Command "${commandName}" not found in current context`);
      return;
    }

    const { commandFn, storeContexts = [] } = definition;
    const definitionOptions = definition.options;

    let commandParams = {};
    const appState = this._getAppState();
    storeContexts.forEach(context => {
      commandParams[context] = appState[context];
    });

    commandParams = Object.assign(
      {},
      commandParams, // Required store contexts
      definitionOptions, // "Command configuration"
      options // "Time of call" info
    );

    if (typeof commandFn !== 'function') {
      log.warn(`No commandFn was defined for command "${commandName}"`);
      return;
    } else {
      return commandFn(commandParams);
    }
  }
}

export default CommandsManager;

 

toolbarModule.js 这里添加按钮结构

// TODO: A way to add Icons that don't already exist?
// - Register them and add
// - Include SVG Source/Inline?
// - By URL, or own component?

// What KINDS of toolbar buttons do we have...
// - One's that dispatch commands
// - One's that set tool's active
// - More custom, like CINE
//    - Built in for one's like this, or custom components?

// Visible?
// Disabled?
// Based on contexts or misc. criteria?
//  -- ACTIVE_ROUTE::VIEWER
//  -- ACTIVE_VIEWPORT::CORNERSTONE
// setToolActive commands should receive the button event that triggered
// so we can do the "bind to this button" magic

const TOOLBAR_BUTTON_TYPES = {
    COMMAND: 'command',
    SET_TOOL_ACTIVE: 'setToolActive',
    BUILT_IN: 'builtIn',
};

const TOOLBAR_BUTTON_BEHAVIORS = {
    CINE: 'CINE',
    DOWNLOAD_SCREEN_SHOT: 'DOWNLOAD_SCREEN_SHOT',
};

/* TODO: Export enums through a extension manager. */
const enums = {
    TOOLBAR_BUTTON_TYPES,
    TOOLBAR_BUTTON_BEHAVIORS,
};

const definitions = [
    {
        id: 'StackScroll',
        label: 'Stack Scroll',
        icon: 'bars',
        //
        type: TOOLBAR_BUTTON_TYPES.SET_TOOL_ACTIVE,
        commandName: 'setToolActive',
        commandOptions: { toolName: 'StackScroll' },
    },
    {
        id: 'Zoom',
        label: 'Zoom',
        icon: 'search-plus',
        //
        type: TOOLBAR_BUTTON_TYPES.SET_TOOL_ACTIVE,
        commandName: 'setToolActive',
        commandOptions: { toolName: 'Zoom' },
    },
    {
        id: 'Wwwc',
        label: 'Levels',
        icon: 'level',
        //
        type: TOOLBAR_BUTTON_TYPES.SET_TOOL_ACTIVE,
        commandName: 'setToolActive',
        commandOptions: { toolName: 'Wwwc' },
    },
    {
        id: 'Pan',
        label: 'Pan',
        icon: 'arrows',
        //
        type: TOOLBAR_BUTTON_TYPES.SET_TOOL_ACTIVE,
        commandName: 'setToolActive',
        commandOptions: { toolName: 'Pan' },
    },
    {
        id: 'Length',
        label: 'Length',
        icon: 'measure-temp',
        //
        type: TOOLBAR_BUTTON_TYPES.SET_TOOL_ACTIVE,
        commandName: 'setToolActive',
        commandOptions: { toolName: 'Length' },
    },
    {
        id: 'ArrowAnnotate',
        label: 'Annotate',
        icon: 'measure-non-target',
        //
        type: TOOLBAR_BUTTON_TYPES.SET_TOOL_ACTIVE,
        commandName: 'setToolActive',
        commandOptions: { toolName: 'ArrowAnnotate' },
    },
    {
        id: 'Angle',
        label: 'Angle',
        icon: 'angle-left',
        //
        type: TOOLBAR_BUTTON_TYPES.SET_TOOL_ACTIVE,
        commandName: 'setToolActive',
        commandOptions: { toolName: 'Angle' },
    },
    {
        id: 'Reset',
        label: 'Reset',
        icon: 'reset',
        //
        type: TOOLBAR_BUTTON_TYPES.COMMAND,
        commandName: 'resetViewport',
    },
    {
        id: 'KeyFrame',
        label: '关键帧',
        icon: 'star',
        //
        type: TOOLBAR_BUTTON_TYPES.BUILT_IN,
        options: {
            behavior: "SetKeyFrame",
        },
    },
    {
        id: 'Cine',
        label: 'CINE',
        icon: 'youtube',
        //
        type: TOOLBAR_BUTTON_TYPES.BUILT_IN,
        options: {
            behavior: TOOLBAR_BUTTON_BEHAVIORS.CINE,
        },
    },
    {
        id: 'More',
        label: 'More',
        icon: 'ellipse-circle',
        buttons: [
            {
                id: 'Magnify',
                label: 'Magnify',
                icon: 'circle',
                //
                type: TOOLBAR_BUTTON_TYPES.SET_TOOL_ACTIVE,
                commandName: 'setToolActive',
                commandOptions: { toolName: 'Magnify' },
            },
            {
                id: 'WwwcRegion',
                label: 'ROI Window',
                icon: 'stop',
                //
                type: TOOLBAR_BUTTON_TYPES.SET_TOOL_ACTIVE,
                commandName: 'setToolActive',
                commandOptions: { toolName: 'WwwcRegion' },
            },
            {
                id: 'DragProbe',
                label: 'Probe',
                icon: 'dot-circle',
                //
                type: TOOLBAR_BUTTON_TYPES.SET_TOOL_ACTIVE,
                commandName: 'setToolActive',
                commandOptions: { toolName: 'DragProbe' },
            },
            {
                id: 'EllipticalRoi',
                label: 'Ellipse',
                icon: 'circle-o',
                //
                type: TOOLBAR_BUTTON_TYPES.SET_TOOL_ACTIVE,
                commandName: 'setToolActive',
                commandOptions: { toolName: 'EllipticalRoi' },
            },
            {
                id: 'RectangleRoi',
                label: 'Rectangle',
                icon: 'square-o',
                //
                type: TOOLBAR_BUTTON_TYPES.SET_TOOL_ACTIVE,
                commandName: 'setToolActive',
                commandOptions: { toolName: 'RectangleRoi' },
            },
            {
                id: 'Invert',
                label: 'Invert',
                icon: 'adjust',
                //
                type: TOOLBAR_BUTTON_TYPES.COMMAND,
                commandName: 'invertViewport',
            },
            {
                id: 'RotateRight',
                label: 'Rotate Right',
                icon: 'rotate-right',
                //
                type: TOOLBAR_BUTTON_TYPES.COMMAND,
                commandName: 'rotateViewportCW',
            },
            {
                id: 'FlipH',
                label: 'Flip H',
                icon: 'ellipse-h',
                //
                type: TOOLBAR_BUTTON_TYPES.COMMAND,
                commandName: 'flipViewportHorizontal',
            },
            {
                id: 'FlipV',
                label: 'Flip V',
                icon: 'ellipse-v',
                //
                type: TOOLBAR_BUTTON_TYPES.COMMAND,
                commandName: 'flipViewportVertical',
            },
            {
                id: 'Clear',
                label: 'Clear',
                icon: 'trash',
                //
                type: TOOLBAR_BUTTON_TYPES.COMMAND,
                commandName: 'clearAnnotations',
            },
            {
                id: 'Bidirectional',
                label: 'Bidirectional',
                icon: 'measure-target',
                //
                type: TOOLBAR_BUTTON_TYPES.SET_TOOL_ACTIVE,
                commandName: 'setToolActive',
                commandOptions: { toolName: 'Bidirectional' },
            },
            {
                id: 'Download',
                label: 'Download',
                icon: 'create-screen-capture',
                //
                type: TOOLBAR_BUTTON_TYPES.BUILT_IN,
                options: {
                    behavior: TOOLBAR_BUTTON_BEHAVIORS.DOWNLOAD_SCREEN_SHOT,
                    togglable: true,
                },
            },
        ],
    },
    {
        id: 'Exit2DMPR',
        label: 'Exit 2D MPR',
        icon: 'times',
        //
        type: TOOLBAR_BUTTON_TYPES.COMMAND,
        commandName: 'setCornerstoneLayout',
        context: 'ACTIVE_VIEWPORT::VTK',
    },
];

export default {
    definitions,
    defaultContext: 'ACTIVE_VIEWPORT::CORNERSTONE',
};

ToolbarRow.js中调用命令

import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { withTranslation } from 'react-i18next';

import { MODULE_TYPES } from '@ohif/core';
import {
    ExpandableToolMenu,
    RoundedButtonGroup,
    ToolbarButton,
    withModal,
    withDialog,
} from '@ohif/ui';

import './ToolbarRow.css';
import { commandsManager, extensionManager } from './../App.js';

import ConnectedCineDialog from './ConnectedCineDialog';
import ConnectedLayoutButton from './ConnectedLayoutButton';
import { withAppContext } from '../context/AppContext';

class ToolbarRow extends Component {
    // TODO: Simplify these? isOpen can be computed if we say "any" value for selected,
    // closed if selected is null/undefined
    static propTypes = {
        isLeftSidePanelOpen: PropTypes.bool.isRequired,
        isRightSidePanelOpen: PropTypes.bool.isRequired,
        selectedLeftSidePanel: PropTypes.string.isRequired,
        selectedRightSidePanel: PropTypes.string.isRequired,
        handleSidePanelChange: PropTypes.func.isRequired,
        activeContexts: PropTypes.arrayOf(PropTypes.string).isRequired,
        studies: PropTypes.array,
        t: PropTypes.func.isRequired,
        // NOTE: withDialog, withModal HOCs
        dialog: PropTypes.any,
        modal: PropTypes.any,
    };

    static defaultProps = {
        studies: [],
    };

    constructor(props) {
        super(props);

        const toolbarButtonDefinitions = _getVisibleToolbarButtons.call(this);
        // TODO:
        // If it's a tool that can be active... Mark it as active?
        // - Tools that are on/off?
        // - Tools that can be bound to multiple buttons?

        // Normal ToolbarButtons...
        // Just how high do we need to hoist this state?
        // Why ToolbarRow instead of just Toolbar? Do we have any others?
        this.state = {
            toolbarButtons: toolbarButtonDefinitions,
            activeButtons: [],
        };

        this.seriesPerStudyCount = [];

        this._handleBuiltIn = _handleBuiltIn.bind(this);

        this.updateButtonGroups();
    }

    updateButtonGroups() {
        //fanyinote panelModules.module.menuOptions.label �Dz˵�ʵ�ʵ� ���԰�
        const panelModules = extensionManager.modules[MODULE_TYPES.PANEL];

        this.buttonGroups = {
            left: [],
            right: [],
        };

        // ~ FIND MENU OPTIONS
        panelModules.forEach(panelExtension => {
            const panelModule = panelExtension.module;
            const defaultContexts = Array.from(panelModule.defaultContext);

            panelModule.menuOptions.forEach(menuOption => {
                const contexts = Array.from(menuOption.context || defaultContexts);
                const hasActiveContext = this.props.activeContexts.some(actx =>
                    contexts.includes(actx)
                );

                // It's a bit beefy to pass studies; probably only need to be reactive on `studyInstanceUIDs` and activeViewport?
                // Note: This does not cleanly handle `studies` prop updating with panel open
                const isDisabled =
                    typeof menuOption.isDisabled === 'function' &&
                    menuOption.isDisabled(this.props.studies);

                if (hasActiveContext && !isDisabled) {
                    //�����ݽṹ���� ��ť���� menuOptionEntry "{"value":"measurement-panel","icon":"list","bottomLabel":"Measurements"}"
                    //bottomLabel ������ ui�ϵľ���textֵ
                    const menuOptionEntry = {
                        value: menuOption.target,
                        icon: menuOption.icon,
                        bottomLabel: menuOption.label,
                    };
                    const from = menuOption.from || 'right';

                    this.buttonGroups[from].push(menuOptionEntry);
                }
            });
        });

        // TODO: This should come from extensions, instead of being baked in
        this.buttonGroups.left.unshift({
            value: 'studies',
            icon: 'th-large',
            bottomLabel: this.props.t('Series'),
        });
    }

    componentDidUpdate(prevProps) {
        const activeContextsChanged =
            prevProps.activeContexts !== this.props.activeContexts;

        const prevStudies = prevProps.studies;
        const studies = this.props.studies;
        const seriesPerStudyCount = this.seriesPerStudyCount;

        let studiesUpdated = false;

        if (prevStudies.length !== studies.length) {
            studiesUpdated = true;
        } else {
            for (let i = 0; i < studies.length; i++) {
                if (studies[i].series.length !== seriesPerStudyCount[i]) {
                    seriesPerStudyCount[i] = studies[i].series.length;

                    studiesUpdated = true;
                    break;
                }
            }
        }

        if (studiesUpdated) {
            this.updateButtonGroups();
        }

        if (activeContextsChanged) {
            this.setState(
                {
                    toolbarButtons: _getVisibleToolbarButtons.call(this),
                },
                this.closeCineDialogIfNotApplicable
            );
        }
    }

    closeCineDialogIfNotApplicable = () => {
        const { dialog } = this.props;
        let { dialogId, activeButtons, toolbarButtons } = this.state;
        if (dialogId) {
            const cineButtonPresent = toolbarButtons.find(
                button => button.options && button.options.behavior === 'CINE'
            );
            if (!cineButtonPresent) {
                dialog.dismiss({ id: dialogId });
                activeButtons = activeButtons.filter(
                    button => button.options && button.options.behavior !== 'CINE'
                );
                this.setState({ dialogId: null, activeButtons });
            }
        }
    };

    render() {
        const buttonComponents = _getButtonComponents.call(
            this,
            this.state.toolbarButtons,
            this.state.activeButtons
        );

        const onPress = (side, value) => {
            this.props.handleSidePanelChange(side, value);
        };
        const onPressLeft = onPress.bind(this, 'left');
        const onPressRight = onPress.bind(this, 'right');
        {/* fanyinote ���±ߵ�<>��һ����д�ı�ǩ��Ŀ����Ϊ�˰���һ���ڲ�Ԫ��*/ }
        return (
            <>
                <div className="ToolbarRow">
                    <div className="pull-left m-t-1 p-y-1" style={{ padding: '10px' }}>
                        <RoundedButtonGroup
                            options={this.buttonGroups.left}
                            value={this.props.selectedLeftSidePanel || ''}
                            onValueChanged={onPressLeft}
                        />
                    </div>
                    {buttonComponents}
                    <ConnectedLayoutButton />
                    {/*fanyinote �±���Viewer���������Ͻǵ� ����������ļ�¼ֵ�������¼ֵ��Ҫapi��֧�ֲ��ܱ���������Ĭ�Ͻ����DZ���js�洢���� ��������Գ��� */}
                    <div
                        className="pull-right m-t-1 rm-x-1"
                        style={{ marginLeft: 'auto' }}
                    >
                        {this.buttonGroups.right.length && (
                            <RoundedButtonGroup
                                options={this.buttonGroups.right}
                                value={this.props.selectedRightSidePanel || ''}
                                onValueChanged={onPressRight}
                            />
                        )}
                    </div>
                </div>
            </>
        );
    }
}

function _getCustomButtonComponent(button, activeButtons) {
    const CustomComponent = button.CustomComponent;
    const isValidComponent = typeof CustomComponent === 'function';

    // Check if its a valid customComponent. Later on an CustomToolbarComponent interface could be implemented.
    if (isValidComponent) {
        const parentContext = this;
        const activeButtonsIds = activeButtons.map(button => button.id);
        const isActive = activeButtonsIds.includes(button.id);

        return (
            <CustomComponent
                parentContext={parentContext}
                toolbarClickCallback={_handleToolbarButtonClick.bind(this)}
                button={button}
                key={button.id}
                activeButtons={activeButtonsIds}
                isActive={isActive}
            />
        );
    }
}

function _getExpandableButtonComponent(button, activeButtons) {
    // Iterate over button definitions and update `onClick` behavior
    let activeCommand;
    const childButtons = button.buttons.map(childButton => {
        childButton.onClick = _handleToolbarButtonClick.bind(this, childButton);

        if (activeButtons.map(button => button.id).indexOf(childButton.id) > -1) {
            activeCommand = childButton.id;
        }

        return childButton;
    });

    return (
        <ExpandableToolMenu
            key={button.id}
            label={button.label}
            icon={button.icon}
            buttons={childButtons}
            activeCommand={activeCommand}
        />
    );
}

function _getDefaultButtonComponent(button, activeButtons) {
    return (
        <ToolbarButton
            key={button.id}
            label={button.label}
            icon={button.icon}
            onClick={_handleToolbarButtonClick.bind(this, button)}
            isActive={activeButtons.map(button => button.id).includes(button.id)}
        />
    );
}
/**
 * Determine which extension buttons should be showing, if they're
 * active, and what their onClick behavior should be.
 */
function _getButtonComponents(toolbarButtons, activeButtons) {
    const _this = this;
    return toolbarButtons.map(button => {
        const hasCustomComponent = button.CustomComponent;
        const hasNestedButtonDefinitions = button.buttons && button.buttons.length;

        if (hasCustomComponent) {
            return _getCustomButtonComponent.call(_this, button, activeButtons);
        }

        if (hasNestedButtonDefinitions) {
            return _getExpandableButtonComponent.call(_this, button, activeButtons);
        }

        return _getDefaultButtonComponent.call(_this, button, activeButtons);
    });
}

/**
 * TODO: DEPRECATE
 * This is used exclusively in `extensions/cornerstone/src`
 * We have better ways with new UI Services to trigger "builtin" behaviors
 *
 * A handy way for us to handle different button types. IE. firing commands for
 * buttons, or initiation built in behavior.
 *
 * @param {*} button
 * @param {*} evt
 * @param {*} props
 */
function _handleToolbarButtonClick(button, evt, props) {
    const { activeButtons } = this.state;
    console.log("_handleToolbarButtonClick");
    console.log(button, evt, props);
    if (button.commandName) {
        const options = Object.assign({ evt }, button.commandOptions);
        commandsManager.runCommand(button.commandName, options);
    }

    // TODO: Use Types ENUM
    // TODO: We can update this to be a `getter` on the extension to query
    //       For the active tools after we apply our updates?
    if (button.type === 'setToolActive') {
        const toggables = activeButtons.filter(
            ({ options }) => options && !options.togglable
        );
        this.setState({ activeButtons: [...toggables, button] });
    } else if (button.type === 'builtIn') {
        this._handleBuiltIn(button);
    }
}

/**
 *
 */
function _getVisibleToolbarButtons() {
    const toolbarModules = extensionManager.modules[MODULE_TYPES.TOOLBAR];
    const toolbarButtonDefinitions = [];

    toolbarModules.forEach(extension => {
        const { definitions, defaultContext } = extension.module;
        definitions.forEach(definition => {
            const context = definition.context || defaultContext;

            if (this.props.activeContexts.includes(context)) {
                toolbarButtonDefinitions.push(definition);
            }
        });
    });

    return toolbarButtonDefinitions;
}

function _handleBuiltIn(button) {
    /* TODO: Keep cine button active until its unselected. */
    const { dialog, t } = this.props;
    const { dialogId } = this.state;
    const { id, options } = button;

    if (options.behavior === 'CINE') {
        if (dialogId) {
            dialog.dismiss({ id: dialogId });
            this.setState(state => ({
                dialogId: null,
                activeButtons: [
                    ...state.activeButtons.filter(button => button.id !== id),
                ],
            }));
        } else {
            const spacing = 20;
            const { x, y } = document
                .querySelector(`.ViewerMain`)
                .getBoundingClientRect();
            const newDialogId = dialog.create({
                content: ConnectedCineDialog,
                defaultPosition: {
                    x: x + spacing || 0,
                    y: y + spacing || 0,
                },
            });
            this.setState(state => ({
                dialogId: newDialogId,
                activeButtons: [...state.activeButtons, button],
            }));
        }
    }

    if (options.behavior === 'DOWNLOAD_SCREEN_SHOT') {
        commandsManager.runCommand('showDownloadViewportModal', {
            title: t('Download High Quality Image'),
        });
    }

    if (options.behavior === 'SetKeyFrame') {
        commandsManager.runCommand('SetKeyFrame', {
            testData:"test data",
        });
    }
}

export default withTranslation(['Common', 'ViewportDownloadForm'])(
    withModal(withDialog(withAppContext(ToolbarRow)))
);

HeyFrameTag.js 中回调命令

import React from 'react';
import keyFrameTagStyle from "./HeyFrameTag.css";
class HeyFrameTag extends React.Component {
    constructor(props) {
        super(props);
        //this.state = { b: this.props.imageIdIndex }
        this.state = { isShowKeyImageTag: false, currentFrameInfo: null, keyFrameData: [] }
        //最近一次更新时间 少于30秒 那么返回 不更新 lastKeyFrameListUpdateDate
        this.lastKeyFrameListUpdateDate = null;
        this.registerCommand();
    }
    registerCommand() {
        //注册 设置关键帧 handerSetKeyFrameCommand 命令
        let contextName = 'ACTIVE_VIEWPORT::CORNERSTONE';

        window.ohif.app.commandsManager.registerCommand(contextName, 'SetKeyFrame', {
            commandFn: this.handerSetKeyFrameCommand.bind(this),
            storeContexts: ['viewers'],
            options: { passMeToCommandFn: ':wave:' },
        });

        window.ohif.app.commandsManager.registerCommand(contextName, 'BindKeyFrame', {
            commandFn: this.handerBindKeyFrameCommand.bind(this),
            storeContexts: ['viewers'],
            options: { passMeToCommandFn: ':wave:' },
        });
    }
    addKeyFrameToKeyFrameData() {
        var sopInstanceUID = this.state.currentFrameInfo.SOPInstanceUID;
        var keyFrameData = this.state.keyFrameData.slice();
        var indexOf = keyFrameData.indexOf(sopInstanceUID);
        if (indexOf == -1) {
            keyFrameData.push(sopInstanceUID);
        }
        this.setState({ keyFrameData });
        return keyFrameData;
    }
    removeKeyFrameToKeyFrameData() {
        var sopInstanceUID = this.state.currentFrameInfo.SOPInstanceUID;
        var keyFrameData = this.state.keyFrameData.slice();
        var indexOf = keyFrameData.indexOf(sopInstanceUID);
        if (indexOf >= -1) {
            keyFrameData.splice(indexOf, 1);
        }
        this.setState({ keyFrameData });
        return keyFrameData;
    }
    handerSetKeyFrameCommand(cmdParam) {
        var studyInstanceUID = this.state.currentFrameInfo.StudyInstanceUID;
        console.log("handerSetKeyFrameCommand param=", cmdParam, "this.state.isShowKeyImageTag=", this.state.isShowKeyImageTag, "currentFrameInfo=", this.state.currentFrameInfo);
        var isAddKeyFrameToKeyFrameData = !this.state.isShowKeyImageTag;

        var keyFrameData = []
        if (isAddKeyFrameToKeyFrameData) keyFrameData = this.addKeyFrameToKeyFrameData();
        else keyFrameData = this.removeKeyFrameToKeyFrameData();

        var server = window.config.servers.dicomWeb[0];
        var paramUpdateKeyFrame = { StudyInstanceUID: studyInstanceUID, KeyFrameData: keyFrameData };
        fetch(server.wadoRoot + '/Measurement/UpdateKeyFrame',
            {
                mode: 'cors',
                method: 'POST',
                body: JSON.stringify(paramUpdateKeyFrame)
            })
            .then(res => res.json())
            .then(data => {
                console.log(data);
            })
            .catch(e => console.log('错误:', e));

        this.setState({ isShowKeyImageTag: isAddKeyFrameToKeyFrameData });
    }
    handerBindKeyFrameCommand(cmdParam) {
        console.log("handerBindKeyFrameCommand param=", cmdParam, "this.state.isShowKeyImageTag=", this.state.isShowKeyImageTag);
        this.setState({ currentFrameInfo: cmdParam });
        this.getKeyFrameData(cmdParam);
    }
    getKeyFrameData(param) {
        let self = this;
        if (!param) return;
        //最近一次更新时间 少于30秒 那么返回 不更新 lastKeyFrameListUpdateDate
        var nowTime = new Date().getTime();
        if (this.lastKeyFrameListUpdateDate && (nowTime - this.lastKeyFrameListUpdateDate < 30 * 1000)) {
            console.log("不更新", this.lastKeyFrameListUpdateDate);
            var keyFrameData = this.state.keyFrameData;
            if (keyFrameData.indexOf(this.state.currentFrameInfo.SOPInstanceUID) > -1) {
                this.setState({ isShowKeyImageTag: true, keyFrameData: keyFrameData });
            } else {
                this.setState({ isShowKeyImageTag: false, keyFrameData: keyFrameData });
            }
            return;
        }
        this.lastKeyFrameListUpdateDate = nowTime;

        var server = window.config.servers.dicomWeb[0];
        var paramGetKeyFrameList = { StudyInstanceUID: param.StudyInstanceUID };
        fetch(server.wadoRoot + '/Measurement/KeyFrameList',
            {
                mode: 'cors',
                method: 'POST',
                body: JSON.stringify(paramGetKeyFrameList)
            })
            .then(res => res.json())
            .then(data => {
                console.log(data);
                if (data.Data.KeyFrame && data.Data.KeyFrame.KeyFrameData) {
                    var keyFrameData = data.Data.KeyFrame.KeyFrameData;
                    if (keyFrameData.indexOf(self.state.currentFrameInfo.SOPInstanceUID) > -1) {
                        this.setState({ isShowKeyImageTag: true, keyFrameData: keyFrameData });
                    } else {
                        this.setState({ isShowKeyImageTag: false, keyFrameData: keyFrameData });
                    }
                }
            })
            .catch(e => console.log('错误:', e));
    }
    componentWillMount() {
    }
    componentDidMount() {
    }
    render() {
        return (
            <span className={"keyFrameTagStyle"} style={{ display: this.state.isShowKeyImageTag ? "block" : "none" }}>
                <svg t="1594088509903" className="icon" viewBox="0 0 1042 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1149" data-spm-anchor-id="a313x.7781069.0.i0" width="100%" height="100%"><path d="M759.12762 345.375135l-142.179449-21.081101-62.849217-127.997264a38.316227 38.316227 0 0 0-34.298752-21.22949 38.316227 38.316227 0 0 0-34.298752 21.22949l-64.384202 128.767188-141.030035 20.311177a38.321092 38.321092 0 0 0-21.076235 65.52875l102.322156 101.177608-24.141339 140.26011a38.308929 38.308929 0 0 0 15.32795 37.321284 38.307712 38.307712 0 0 0 40.237998 2.916714l126.852714-65.528751 126.08279 66.298675a38.316227 38.316227 0 0 0 40.237998-2.922795 38.313794 38.313794 0 0 0 15.326734-37.320068l-23.375063-141.025169 101.941451-99.258269a38.33812 38.33812 0 0 0 9.901987-39.34036 38.325957 38.325957 0 0 0-30.983088-26.193256l0.384354-1.914473z" fill="#1296db" p-id="1150" data-spm-anchor-id="a313x.7781069.0.i3" className=""></path><path d="M624.996501 455.361266a76.634886 76.634886 0 0 0-22.22565 68.983074l10.727863 64.382985-55.565948-30.278844a76.654347 76.654347 0 0 0-73.196375 0l-57.485287 30.278844 11.113433-63.619142a76.644616 76.644616 0 0 0-22.61122-69.362563l-49.436957-45.606794 63.999848-9.197743a76.639751 76.639751 0 0 0 60.549173-42.153688l28.745076-59.019055 28.738995 59.019055a76.649482 76.649482 0 0 0 59.020271 42.538042l63.998632 9.197743-46.371854 44.838086z" fill="#1296db" p-id="1151" data-spm-anchor-id="a313x.7781069.0.i6" className=""></path><path d="M902.838404 13.878108H136.376429A114.965708 114.965708 0 0 0 21.407072 128.847465v766.461974c0 63.495079 51.474278 114.969357 114.969357 114.969358h7.279621l375.954407-153.292882 375.948326 153.292882h7.279621a114.974222 114.974222 0 0 0 81.298222-33.671136 114.974222 114.974222 0 0 0 33.671135-81.298222V128.847465a114.969357 114.969357 0 0 0-33.671135-81.297006 114.970573 114.970573 0 0 0-81.298222-33.672351z m38.323525 881.431331c0.246911 18.985397-13.446317 35.286396-32.189669 38.323525L519.610457 776.124349 130.242573 933.632964c-18.738486-3.037128-32.431714-19.338127-32.188452-38.323525V128.847465c0-21.166243 17.156066-38.322308 38.322308-38.322309h766.461975c21.166243 0 38.323524 17.156066 38.323525 38.322309v766.461974z m0 0" fill="#1296db" p-id="1152" data-spm-anchor-id="a313x.7781069.0.i1"></path></svg>
            </span>
        )
    }

}
export default HeyFrameTag;

其中这里是回调注注册,正常情况下不用在这里注册,此处注册纯属偷懒.

正常注册位置在这里/Viewers/extensions/cornerstone/src/commandsModule.js

        window.ohif.app.commandsManager.registerCommand(contextName, 'SetKeyFrame', {
            commandFn: this.handerSetKeyFrameCommand.bind(this),
            storeContexts: ['viewers'],
            options: { passMeToCommandFn: ':wave:' },
        });

 

 

 

热门文章

暂无图片
编程学习 ·

手撸架构,Redis面试41问

什么是Redis&#xff1f;简述它的优缺点&#xff1f; Redis本质上是一个Key-Value类型的内存数据库&#xff0c;很像memcached&#xff0c;整个数据库统统加载在内存当中进行操作&#xff0c;定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作&#xff0c…
暂无图片
编程学习 ·

pcm 转 wav 工具

在做音频测试时经常需要采集原始数据进行分析&#xff0c;结果需要给其他人去听效果&#xff0c;播放pcm 需要知道采样率 &#xff0c;数据位宽&#xff0c;声道等信息&#xff0c;每次播放设置这些参数比较麻烦&#xff0c;最好就是直接给pcm 数据直接加上wav 的头信息转换成w…
暂无图片
编程学习 ·

Linux系统分区和挂载浅

分类&#xfffd;?span class"Apple-converted-space"> 好久没有写BLOG&#xfffd;?之前出差&#xfffd;?个月,都没怎么看书,也没有太多时间写。回来后一个月人也有点放松。现在开始还是得继续努力啊。不废话了&#xff0c;下面就介绍下Linux系统的分区和挂载…
暂无图片
编程学习 ·

行为地理学概述

文章目录一、中国行为地理学的学科定位二、行为地理学的学科特色三、行为地理学的研究前沿1、理解行为2、理解个体3、面向社会四、中国城市社会专项与规划应对1、问题2、创新五、行为地理学面临的挑战一、中国行为地理学的学科定位 1、关注人地关系的核心问题 地理环境子系统…
暂无图片
编程学习 ·

第五章计算机网络

考纲&#xff1a;计算机网络的概念、功能以及发展史&#xff1b;TCP/IP模型与网络协议&#xff1b;网络硬件与设备和网络传输介质网络中 的计算机配置&#xff1b;网络共享的设置&#xff1b;互联网的发展历史、主要服务以及思想&#xff1b;网络常见故障以及维护&#xff1b;物…
暂无图片
编程学习 ·

生活随记 - 感恩老同学

2020-10-13 感恩老同学 大学毕业后&#xff0c;我是第三个来上海的同班同学&#xff0c;之前已经有2个女生在上海落脚&#xff0c;并且开始工作了。但是呢&#xff0c;幸运的是我是第一个来上海的男同学&#xff0c;我是从北方出差到上海之后留在上海的&#xff0c;毕业的第2个…
暂无图片
编程学习 ·

DimdimMoodle安装配置文档节选

Dimdim&Moodle安装配置文档节选 2010年3月30日 ————————————————————————————————————— 本文遵循GPL v2协议&#xff0c;受GPL v2协议保护。欢迎转载&#xff0c;但必须保留以下文字&#xff1a; Writed by tube Email:tubeliugma…
暂无图片
编程学习 ·

inputstream流乱码_C# InputStream获取后乱码处理

Post推送过来的数据流获取后部分中文出现乱码,晚上找了好多办法,不如朋友鼎力相助,哈哈哈~不说废话了上代码把旧代码基本是网上普遍写法,字段不长用起来不会有乱码情况,但是传送字段一旦过长,超过byte的1024个字节后,中文部分的两个字节恰好卡到这个位置就容易出现 "??&…
暂无图片
编程学习 ·

java inputstream字节流_Java IO 之 InputStream 输入字节流

Java IO 之 InputStream 输入字节流Java,inputstream,输入流,io,2016-04-07 16:15:37java.io 包中包含了咱们跟 IO 打交道中必要的类和接口。IO 流可以分为输入流和输出流&#xff0c;也可以分为字节流(byte stream)和字符流(character stream)。只是划分的维度不一样而已。jav…
暂无图片
编程学习 ·

中国商品财务管理软件市场深度研究分析报告

【报告篇幅】&#xff1a;90 【报告图表数】&#xff1a;147 【报告出版时间】&#xff1a;2021年1月 报告摘要 2019年中国商品财务管理软件市场规模达到了XX亿元&#xff0c;预计2026年将达到XX亿元&#xff0c;年复合增长率(CAGR)为XX%。 本文研究中国市场商品财务管理软…
暂无图片
编程学习 ·

中国企业软件公司的转型之路

周日一个关于国内“企业软件”公司商业模式问题的微博引起轩然大波&#xff0c;“低调而奢华”公司及鼓吹其股票的投资分析师的围攻自不待言&#xff1b;胡搅蛮缠&#xff0c;没听清楚别人想说啥&#xff0c;站在自己立场上就开始放炮&#xff0c;是某些中国式思维的恶习。有业…
暂无图片
编程学习 ·

static的用法

static用法 static的用法: 1.(面向对象)静态成员变量:在类内成员变量的声明前加上关键字static,该数据成员就是类内的静态数据成员 class Myclass { public:Myclass(int a,int b,int c);void GetSum(); private:int a,b,c;static int Sum;//声明静态数据成员 };int Myclass::…
暂无图片
编程学习 ·

DBA如何利用strace/pstack/gdb来定位问题

参考&#xff1a;https://database.51cto.com/art/202006/617923.htm strace简介 strace是Linux环境下的一款程序调试工具&#xff0c;用来监察一个应用程序所使用的系统调用。 Strace是一个简单的跟踪系统调用执行的工具。在其最简单的形式中&#xff0c;它可以从开始到结束…
暂无图片
编程学习 ·

linux内核论文分析,毕业论文LINUX内核分析.doc

毕业论文LINUX内核分析毕 业 论 文论文题目:基于Windows进程状态提取与恢复的研究姓 名 陈胜祥学 号 20071301012学 院 计算机科学与技术学院专 业 计算机科学与技术年 级 2007级指导教师 高胜法2011年月日山东大学毕业设计(论文)成绩评定表学院&#xff1a; 专业&#xff1a; …
暂无图片
编程学习 ·

【Linux】CentOS系统下lsb_release: 未找到命令

【Linux】CentOS系统下lsb_release: 未找到命令背景解决办法安装验证安装细节背景 PC机上烧写了CentOS-8.2.2004-x86_64-dvd1.iso系统镜像&#xff0c;烧写成功后在终端执行&#xff1a; lsb_release报错&#xff1a; [jnlocalhost ~]$ lsb_release -a bash: lsb_release: 未…
暂无图片
编程学习 ·

Meanshift和Camshift算法总结

Meanshift和Camshift算法在视频中找到并跟踪目标对象。 1. Meanshift算法原理 2. OpenCV中的Meanshift 3. Camshift算法原理 4. OpenCV中的Camshift
暂无图片
编程学习 ·

数学建模matlab基础

快捷键&#xff1a; Ctrl R多行注释 Ctrl T取消注释 基础&#xff1a; 注释为“%” 每一行语句后要加分号“;”&#xff0c;分号表示不显示运行结果&#xff0c;也可以用来分行 clear可以清楚工作区的所有变量 clc可以清楚命令行窗口的所有文本&#xff0c;让屏幕变得…
暂无图片
编程学习 ·

android 进程和组件的区别,android进程和线程到底有什么区别

一、Android中的进程当一个程序第一次启动的时候&#xff0c;Android会启动一个LINUX进程和一个主线程。默认的情况下&#xff0c;所有该程序的组件都将在该进程和线程中运行。 同时&#xff0c;Android会为每个应用程序分配一个单独的LINUX用户。Android会尽量保留一个正在运行…
暂无图片
编程学习 ·

Spring-Kafka

课程学习&#xff1a;https://www.jianshu.com/c/0c9d83802b0c Kafka的windows安装说明&#xff1a;https://blog.csdn.net/weixin_38004638/article/details/91893910 Kafka的历史版本下载&#xff1a;https://archive.apache.org/dist/zookeeper/ 如&#xff1a;zookeeper启…
暂无图片
编程学习 ·

java allocatedirect_Java中的Heap Buffer与Direct Buffer

在使用Java NIO时&#xff0c;会经常和ByteBuffer打交道(吐槽下&#xff0c;每次手动flip切换读写模式太不友好)。在空Buffer创建时&#xff0c;有两种方式&#xff1a;ByteBuffer.allocateDirect(capacity)ByteBuffer.allocate(capacity)那么这两种Buffer的分配又有什么不一样…
暂无图片
编程学习 ·

DirectByteBuffer内存释放原理

文章目录DirectByteBuffer分配源码跟踪内存的释放跟踪内存释放的风险Unsafe类的介绍要了解DirectByteBuffer底层&#xff0c;我们需要了解一个Java里面的Unsafe类&#xff0c;这个类不能直接获取&#xff0c;只能通过反射的方式获取&#xff0c;对应代码如下&#xff1a; impo…
暂无图片
编程学习 ·

基于Flink技术的商品实时推荐系统(初版)

基于Flink技术的商品实时推荐系统(初版) 之前趁着寒假有时间&#xff0c;学了一下大数据的基础知识&#xff0c;Hadoop、Hbase、Flink、Kafka等。做了一个简单的推荐系统。 1.0 演示视频 基于Flink的实时推荐系统-初版(ps录制的时候卡卡的) 录制视频的时候&#xff0c;开的软件…
暂无图片
编程学习 ·

preference_persistent属性

Android preference android:persistent 属性 presistent &#xff1a; true|false false&#xff1a;不会保存界面的信息到sharepref true&#xff1a; 会自动保存数据到sharepreference中 SharedPreferences spf PreferenceManager.getDefaultSharedPreferences(getContex…
暂无图片
编程学习 ·

Java递归经典案例

递归前言一、有规律的递归1.题目描述&#xff08;1&#xff09;求n!&#xff1b;&#xff08;2&#xff09;求n项和&#xff1b;&#xff08;3&#xff09;猴子吃桃&#xff1a;2.规律&#xff08;1&#xff09;找出递归的公式:&#xff08;2&#xff09;递归的终结点&#xff…
暂无图片
编程学习 ·

多多线程案例之wait和notifyAll

模拟面包店生产消费流程&#xff1a;10个生产者&#xff0c;每个每次生产3个;20个消费者&#xff0c;每个每次消费1个 ;最大库存100 public class BreadShop {/*** 面包店库存*/private static int COUNT;/*** 生产者*/public static class Producer implements Runnable{priv…
暂无图片
编程学习 ·

dataGridView使用技巧

1、错误提示&#xff1a;当前进程正另一个进程冲突了。原因是你的程序之前没有正常关闭&#xff0c;导致出现僵尸进程。必须用任务管理器将这个僵尸进程杀掉、结束才行 2、编程的时候所有文件夹、变量、命名空间、项目名称一定要使用英文、拼音 来命名。否则一出现问题很难处理…
暂无图片
编程学习 ·

文件上传格式限制之accept属性配置

浏览器支持情况 IE10及以上、Firefox、Chrome、Opera 不支持&#xff1a;IE-Edge 设置方式 支持单个 <input text"file" accept".csv"> 支持多个&#xff0c;逗号隔开 <input text"file" accept"application/vnd.openxmlformat…
暂无图片
编程学习 ·

AcWing.789. 数的范围【c++】

一、题目 给定一个按照升序排列的长度为 nn 的整数数组&#xff0c;以及 qq 个查询。 对于每个查询&#xff0c;返回一个元素 kk 的起始位置和终止位置&#xff08;位置从 00 开始计数&#xff09;。 如果数组中不存在该元素&#xff0c;则返回 -1 -1。 输入格式 第一行包…
暂无图片
编程学习 ·

运筹学之排队论

排队论 排队论&#xff0c;又称随机服务系统理论&#xff0c;是研究系统随机聚散现象和随机服务系统工作过程的数学理论和方法。 是运筹学的分支。事实上&#xff0c;运筹学主要解决的是决策时寻找最优的过程。因此排队论实际上也是一个优化问题。具体地说&#xff0c;它是在研…
暂无图片
编程学习 ·

正则表达式:Python3中的应用简介

正则表达式&#xff1a;Python3中的应用简介 一、正则表达式 1&#xff0c;概述 正则表达式&#xff0c;又称规则表达式。&#xff08;英语&#xff1a;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09;&#xff0c;计算机科学的一个概念。正则表…
暂无图片
编程学习 ·

系统运维应届生面试题

系统运维应届生面试题&#xff08;持续更新&#xff09; 如有错误&#xff0c;欢迎改正和补充 我们一起找offer 1、CPU的使用率低但负载高的原因 IO线程阻塞网络状态不佳并发访问量较高后端存储断开或宕机 2、查看网卡传输速率 thtool eth0 | mii-tools 3、SSH启用秘钥登录…
暂无图片
编程学习 ·

怎么优化linux的内存,Linux内存使用与优化技巧

Linux服务器分配真实与虚拟内存给处理器&#xff0c;通过交换管理内存使用率。明白Linux内存类型以及处理器如何共享内存有助于优化内存使用率。从Linux内核start-up执行程序进程分配内存&#xff0c;需要虚拟内存总和。Linux上的虚拟内存是无限的&#xff0c;处理器在启动时就…
暂无图片
编程学习 ·

判断括号匹配的程序java_java判断左右括号匹配

java判断左右括号匹配[2021-02-10 16:36:55] 简介:Java进行正则表达式匹配的方法&#xff1a;首先打开eclipse软件&#xff1b;然后运用d来进行数字的匹配&#xff0c;如果字符串中遇到了空白字符的话&#xff0c;那么可以运用s进行匹配&#xff1b;接着匹配中括号内的内容&am…
暂无图片
编程学习 ·

图解某公司项目管理流程图,过程清晰明了

产品项目管理发布流程 一、立项阶段 1、市场调研&#xff1a;产品组结合业务&#xff0c;不定期的开展用户调研、竞争对手分析、收集并分析数据&#xff0c;形成《市场调研分析报告》。 2、需求分析&#xff1a;根据市场调研结果&#xff0c;形成产品需求说明。 3、需求评审…
暂无图片
编程学习 ·

计算机网络原理(04741)自考学习笔记/备考资料

本文是我参加电子科技大学 计算机科学与技术专业 自考本科中计算机网络原理科目的学习笔记&#xff0c;以章为单位&#xff0c;以考点&#xff0c;习题&#xff0c;课堂知识为内容。既是我自己学习的记录&#xff0c;也可以作为其他自考考生的复习的资料&#xff0c;还是快速构…
暂无图片
编程学习 ·

c语言编程goto,C语言编程学习中的goto语句

C语言是面向过程的&#xff0c;而C&#xff0b;&#xff0b;是面向对象的C和C的区别&#xff1a;C是一个结构化语言&#xff0c;它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程&#xff0c;对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制…

oppowatch2安装抖音教程_oppowatch2安装抖音步骤手机

oppo手表怎么安装到华为手机上?现在在网上发现有很多OPPO手机用户在使用华为Watch,可是OPPO手机连接不上华为Watch怎么办?实际上大家对于华为手表的连接方法不是很清楚,下面华为刷机网小编著来讲一下吧:先把手表开机,即长按Watch右上角的电源键两秒左右,就可以开机啦!你…

oppowatch2安装抖音教程_oppowatch2安装抖音步骤

OPPO手机怎么装两个抖音?一般来说OPPO手机,华为手机只能用一个抖音,因为他这个手机是没有应用双开应用,双开只支持微信和QQ,现在你必须要换手机的。您好,建议按以下方法查看是什么原因造成的并解决:1、程序缓存过多:在手机设置--应用程序--全部--找到出现停止运行的程序…

oppowatch2刷抖音教程_oppowatch2安装抖音步骤

OPPOreno2怎么用抖音视屏做动态锁屏和壁纸?请点击右下角的分享点击动态壁纸,如果没安装过插件,或插件需要更新,会有提示,点击允许安装,oppo手机可能会报毒,无需担心,成功后会提示安装成功成功后返回视频界面,再次点击分享,会出现如下界面,点击动态壁纸选择器点击抖音…

oppowatch2刷抖音教程_oppowatch2下载抖音

OPPOreno2怎么用抖音视屏做动态锁屏和壁纸?请点击右下角的分享点击动态壁纸,如果没安装过插件,或插件需要更新,会有提示,点击允许安装,oppo手机可能会报毒,无需担心,成功后会提示安装成功成功后返回视频界面,再次点击分享,会出现如下界面,点击动态壁纸选择器点击抖音…

oppowatch2下抖音教程_oppowatch2怎么下载抖音

oppo watch怎么下载appOPPOWatch首次开机后,我们能在应用列表中看到 26 个应用,都是相对核心且高频的功能。但如果想要更多APP,还可进入软件商店进行下载,目前能下载QQ与QQ音乐,据悉OPPOWatch还在不断丰富应用,未来应该会有更多应用等我们下载。oppo watch怎么下载appOPP…

oppowatch2下抖音教程_oppowatch2安装抖音教程

如何用电话手表打开抖音?如何应用电话手表打开抖音这个的话您得鲜在手表里下载之后你再打开就可以打开抖音重要的一步就是给拿手机或者拿电话手表下载搜一下:如何用电脑下载软件到电话手表里 ?oppo手机可以下载两个抖音吗?如果可以怎么下载,不可以怎么有什么办法可以解决?…

oppoa57手机隔空刷抖音教程_oppoa57手机刷机没电脑怎么刷

OPPO手机的隔空翻页怎么设置?OPPO手机隔空翻页的方法:1、打开手机,点击桌面的设置按钮进入。2、一直翻动找到手势体感选项。3、接着会看到很多不同的选项,其中就有几个不同的手势,手套模式,看到隔空操作点击4、会有滑动照片和桌面的选项,点击后面的按钮开启。5、按钮变成…

oppoa57手机隔空刷抖音教程_oppoA57手机刷机怎么刷

OPPO手机的隔空翻页怎么设置?OPPO手机隔空翻页的方法:1、打开手机,点击桌面的设置按钮进入。2、一直翻动找到手势体感选项。3、接着会看到很多不同的选项,其中就有几个不同的手势,手套模式,看到隔空操作点击4、会有滑动照片和桌面的选项,点击后面的按钮开启。5、按钮变成…

oppa抖音控雨教程_抖音评论教程

老铁,抖音短视频的视频编辑怎么做😊首先,在手机上打开抖音短视频,点击底部的“+”,再点击左上角的上传视频。界面显示出手机里的所有视频,点击选中想要上传的视频,进入裁剪视频界面。在裁剪视频界面的底部视频帧处滑动视频,选择想要的视频帧段,选好后,点击右上角的下…

oppa抖音控雨教程_抖音控评教程

403 Forbidden403 Forbidden下雨视频直播怎么弄?现在的很多相机软件都有这些很火的特效,包括抖音等等。如果你觉得软件里自带的特效你并不满意,你可以尝试自己去拍一拍,找一个下雨的日子,然后将相机架起来,直接调整好焦距和曝光进行录像就可以了,如果你想表达用手来控制…

oops舞蹈教程抖音_Oops的舞蹈教程视频完整版

下载抖音短视频。1、您可以在电脑浏览器上打开搜索【抖音】,进入抖音的官网,在右下角选择手机的系统版本,或者是扫描二维码进行下载;安卓可以下载到电脑上然后将apk安装包拖到手机上进行安装;2、在手机的应用商城搜索【抖音】;3、点击进入应用的介绍页面,然后选择下载即…

onetwothree抖音版教程_抖音歌曲onetwothree是什么歌

one two three jump 一首曲 弹力电音Light (Crankdat Re-Crank),手动滑稽qq音乐搜 弹跳时代再看看别人怎么说的。我也在找,你找到了吗???。。求,有一首英文童谣怎么样唱One, two, three, four, fiveOnce I caught a fish alive我给你个网站里面有背景音乐和歌词 ~sch016/f…

onetwothree抖音版教程_抖音onetwothree女声节奏

求,有一首英文童谣怎么样唱One, two, three, four, fiveOnce I caught a fish alive我给你个网站里面有背景音乐和歌词 ~sch016/fp%20once%20i%20caught%20a%20fish%20alive.html这是歌词及翻译:One two three four five, Once I caught a fish alive. Six seven eight nine t…

onetwothree抖音版卡点教程_韩国歌曲onetwothree抖音

抖音卡点视频如何制作图文+视频版 ?有教程吗?话不多说,直接进入正题。首先,图片轮播类的视频该怎么做?步骤一:选择一张素色背景,或是你心仪的背景,但你要知道这张背景的色调一定要配合接下来你的几张轮播图;步骤二:准备好你的轮播图片(至少五张),图片尺寸一致,记…

onetwothree抖音版卡点教程_抖音onetwothree女声节奏

抖音卡点视频如何制作图文+视频版 ?有教程吗?话不多说,直接进入正题。首先,图片轮播类的视频该怎么做?步骤一:选择一张素色背景,或是你心仪的背景,但你要知道这张背景的色调一定要配合接下来你的几张轮播图;步骤二:准备好你的轮播图片(至少五张),图片尺寸一致,记…

onetwothreego抖音教程_onetwothreego韩语歌抖音

抖音轻快英文歌高潮是one two three 我看到的是女生唱的会不会是布兰妮的《3》呢,一首小黄歌,不停的有123在重复。呃,其实抖音上唱这首歌的是个男生。叫:答对了庄心妍Cash Cash / Sofia Reyes - How To Love(Original Mix)抖音瘦身在哪里怎么弄 抖音瘦身特效怎么设置抖音瘦…

ommig抖音教程

老铁,抖音短视频的视频编辑怎么做😊首先,在手机上打开抖音短视频,点击底部的“+”,再点击左上角的上传视频。界面显示出手机里的所有视频,点击选中想要上传的视频,进入裁剪视频界面。在裁剪视频界面的底部视频帧处滑动视频,选择想要的视频帧段,选好后,点击右上角的下…

ok牵手教程抖音_抖音牵手小提琴

抖音上怎么选卡拉ok模式?1、首先小伙伴们先自己的手机上的其他软件拍好自己唱歌的音乐短视频。 2、然后打开抖音短视频软件,点击下方的“+”号。 3、在音乐库界面点击上方的“上传视频”。 然后选择自己之前拍好的音乐短视频,点击打开。 4、在下方可以对短视频进行一些相对…

okok玫瑰花抖音版教程

抖音上的三只玫瑰花代表着什么意思?三只玫瑰代表的意思是我爱你,可以将其赠送给自己喜欢的人,能表达内心的情感,它本身就象征着爱情。其实,玫瑰花的颜色不同,也有不一样的意思。红色是热切的爱,粉色是甜蜜的爱。三只玫瑰代表什么意思一、代表什么意思三只玫瑰代表的是我…

ohnana抖音舞步教程_抖音舞步教程简单

有一首歌是boom nanananana很流行FANTASTIC BABY?GD:快过来吧 大家集中在一起WE GON’ PARTY LIKE lilili lalala敞开心扉吧 不要想太多点燃火苗吧 lilili lalala太阳:不要问答案是什么 照单全收吧跟着感觉走 Alright双手高举过头 朝着那上空想要飞上天际 OhGD:nanananana na…

office办公抖音自学教程_电脑办公office自学方法

办公软件,如何自学机会总是偏爱有准备者,学了不用强似用了没学,支持楼主自学知识提高社会竞争能力。而且,就一般的办公软件来说,自学自通完全是可能的。日常办公用得到的软件可能有几种,一是文字处理,如WORD、WPS,用于处理总结报告等文字材料;二是图形图像处理,如ACD…

obs苹果抖音直播设置教程

怎样让苹果录屏大师和obs配合斗鱼直播可以使用XBOX自带的录屏功能,具体步骤如下:1,点击开始菜单,选择所有应用。2,找到Xbox应用,点击打开。3,打开Xbox应用后,找到左边工具栏的倒数第四项,点击一下(点击后没有任何变化)。4,按键盘的“Win + G”键就可以启动录屏工具…

obs绿幕直播设置教程抖音_obs直播怎么设置弹幕

open broadcaster software怎么用OBS是一款开源的网络视频直播软件,本文只介绍如何用它来录屏。录屏设置:1、选择中文界面2、设置编码,视频品质10为最高,只录制语音的话选单声道mono。3、不直播,只录屏,所以选“只输出文件”,格式设置为mp4,直接把默认的flv改成mp4。4、…

obs直播设置教程抖音cf_抖音用obs直播怎么设置

抖音怎么在电脑上进行游戏直播,官网下载的直播伴侣无法进行直播,提示服务器升级?抖音游戏直播需要申请权限的。目前抖音平台的游戏直播只针对部分人开放,按照官方的要求(OBS开播目前小范围开放,部分无OBS直播权限的主播选择游戏直播可看到申请提示,未看到申请提示的主播…

obs直播设置教程抖音cf_抖音obs直播电脑游戏教程

抖音如何用电脑直播电脑游戏?方法/步骤1、首先在手机上打开抖音,点击菜单“我”中右上角的“三横线”图标。2、在弹出的菜单中点击“创作者服务中心”,进入创作者服务界面。3、在已开通能力列表下点击“开始直播”,进入直播界面。4、在开播模式中选择“游戏直播”,然后点击…

obs直播设置教程抖音_抖音obs直播电脑游戏教程

你好抖音怎么才能用电脑直播啊?现在可以电脑直播了,你去到开通直播里面,里面有视频直播,电脑直播,语音直播,你点电脑直播,再去申请开通下直播权限,等待审核通过就可以开通了。如果直播没有人,就需要自己想点办法了你直接去个直播平台注册个号,会有教程的首先你得准备…

obs直播教程在抖音上直播_抖音直播obs卡高清教程

你好抖音怎么才能用电脑直播啊?现在可以电脑直播了,你去到开通直播里面,里面有视频直播,电脑直播,语音直播,你点电脑直播,再去申请开通下直播权限,等待审核通过就可以开通了。如果直播没有人,就需要自己想点办法了你直接去个直播平台注册个号,会有教程的首先你得准备…

obs直播抖音音频设置教程

安卓手,机外置声卡,电脑怎么连接直播手游时直播间才会有游戏声音电脑伴奏声音和我和队友开麦交流声音?手机投屏到电脑就可以了。1、安装投屏软件。推荐用安卓投屏大师TC DS或者TC Games投屏的“快速投屏”,具体的安装跟连接方法不清楚的可以找度娘搜索:2、手机屏幕投影。连…

obs直播抖音设置教程_2021抖音还能用obs直播吗

我是主播,抖音obs直播手游怎么才能有弹幕1. 现在介绍投屏到OBS直播,OBS也是一个非常不错直播工具,推荐给大家,下载地址:,点击绿色按钮“Download OBS Studio”。安装完成后,运行OBS图标启动软件。2. 首先开始设置直播参数,点击“文件” – “设置”,“通用”设置如下图…

obs直播抖音设置教程_2020抖音禁用obs直播

老铁,抖音短视频的视频编辑怎么做😊首先,在手机上打开抖音短视频,点击底部的“+”,再点击左上角的上传视频。界面显示出手机里的所有视频,点击选中想要上传的视频,进入裁剪视频界面。在裁剪视频界面的底部视频帧处滑动视频,选择想要的视频帧段,选好后,点击右上角的下…

obs直播抖音教程_抖音直播obs卡高清教程

我是主播,抖音obs直播手游怎么才能有弹幕1. 现在介绍投屏到OBS直播,OBS也是一个非常不错直播工具,推荐给大家,下载地址:,点击绿色按钮“Download OBS Studio”。安装完成后,运行OBS图标启动软件。2. 首先开始设置直播参数,点击“文件” – “设置”,“通用”设置如下图…

obs直播抖音教程_2020抖音禁用obs直播

如何利用OBS直播软件进行直播推流在斗鱼直播个人中心发起直播,把直播推流地址填到obs的软件。操作obs选择屏幕还是摄像头,就开始直播啦。比较简单的直播方式。抖音直播如何直播电脑上的内容?付费内容限时免费查看亲 您是问用抖音直播录好的文件 是吗 抖音直播的时候不能放提…

obs教程抖音直播_抖音直播obs卡高清教程

如何才能做到用OBS高清直播或者录像不卡???(守望先锋)obs类似视频压缩软件,很耗性能,只要是直播软件都这样,类似后台一个大型单机游戏,很考验机器性能,以前都要专业机器,现在硬件发展了家用机器也行,你就理解后台开了个单机游戏在跑,或者后台开了两个lol。cpu要强…

obs教程抖音直播_抖音obs直播电脑游戏教程

如何利用OBS直播软件进行直播推流OBS直播软件相关参数的设定。首先,打开OBS,点击“设定”,如下图:进入相关参数设定页面,进行参数设置,如下图:音视频编码的相关参数设定。一般来说,对于音视频编码相关参数的设置,按下图中的这种设置,就可以了。影像的相关参数设定,如…

obs抖音音频直播教程_抖音obs直播教程视频

obs直播 怎么设置自己和观众听到的音量不同?应用到OBS直播中,即可在音频分流后,屏蔽部分不想让观众听到的声音。达到增强互动效果。 准备 请安装最新声卡驱动。 打开控制面板-硬件和声音 找到音频关内放即可。如果进行相关直播的时候,你听到的声音的音量不同,那么很可能是你…

obs抖音直播视频教程_obs投屏直播视频教程

obs与抖音直播伴侣哪个好用呢 请问下大家对于直播而言,看你适用于哪个软件,如果说是抖音的话非常的方便快点,如果是其他的也有自己不同之处。那要看你最喜欢什么模式,如果在你喜欢的模式中就能发挥出很好的作用。抖音直播伴侣吧主页面,右上角,放大镜那个符号点一下。搜索…

obs抖音直播教程mac_用obs直播抖音会封号吗

你好抖音怎么才能用电脑直播啊?现在可以电脑直播了,你去到开通直播里面,里面有视频直播,电脑直播,语音直播,你点电脑直播,再去申请开通下直播权限,等待审核通过就可以开通了。如果直播没有人,就需要自己想点办法了你直接去个直播平台注册个号,会有教程的首先你得准备…

obs抖音直播教程mac_抖音怎么用obs直播教程

Mac版OBS怎么设置如何使用Mac版OBS怎么设置如何使用下载OBS软件并安装好。设置参数:选“设定”广播设定:录制课程模式:选择只输出文件;做直播模式选择:直播流(去直播网站把FMS URL 和串流吗复制到这来。编码——视频录制,如图一所述设置好(这样设置的参数就能录制出1080原…

obs抖音直播教程_用obs直播抖音会封号吗

win10 obs直播怎么设置步骤一:启动电脑上的Xbox应用。这款应用已经被预装到了Windows 10系统中,你可以通过在“开始”按钮边上的搜索框输入“Xbox”来找到它。步骤二:输入Xbox账号进行登陆,点击“开始游戏”按钮。步骤三:打开你的Xbox One,确保它和你的电脑连接在同一个网…

obs抖音直播带货设置教程

抖音带货怎么操作?然后上架商品然后就是开直播就行了,不会刻意在网上搜资料!也可以选择让别人教你我也是做带货的先要看自己做什么行业的,找对应行业的高人气达人来,可以找专门的平台拿抖音带货达人的列表,我一般会直接找城外圈,可以通过ai大数据分析达人数据,看是否跟…

obs抖音电脑直播设置教程_抖音电脑直播obs软件

抖音直播手机和电脑怎么连接准备好需要直播的手机和电脑。手机打开抖音短视频应用并点击“+”开拍视频。找到直播选项开始直播然后复制直播的推流地址。打开电脑打开obs。按照直播的内容分类设置参数点击“菜单”选中自定义流媒体服务器。把刚刚复制的地址粘贴进去就行。电脑画…

obs抖音无人直播教程_obs和抖音直播伴侣的区别

无人机做视频直播的具体步骤或者方法?你先要开通服务 创建频道 进入在直播管理中 直接运到啵台进入运到啵台后 点其中三横杆大概软件 点击右上角 直播 选择自定义模式 即可无人机怎么在快手上面直播有点小复杂,主要需要软件的支持及与无人机的软件兼容。贴吧里有一个这样的贴…

obs抖音无人直播教程_2020抖音禁用obs直播

无人机做视频直播的具体步骤或者方法?你先要开通服务 创建频道 进入在直播管理中 直接运到啵台进入运到啵台后 点其中三横杆大概软件 点击右上角 直播 选择自定义模式 即可无人机怎么在快手上面直播有点小复杂,主要需要软件的支持及与无人机的软件兼容。贴吧里有一个这样的贴…

obs抖音伴侣直播教程_抖音直播伴侣怎么连接obs

obs与抖音直播伴侣哪个好用呢 请问下大家对于直播而言,看你适用于哪个软件,如果说是抖音的话非常的方便快点,如果是其他的也有自己不同之处。那要看你最喜欢什么模式,如果在你喜欢的模式中就能发挥出很好的作用。抖音直播伴侣吧主页面,右上角,放大镜那个符号点一下。搜索…

obs抖音伴侣直播教程_抖音直播伴侣怎么用obs

抖音直播如何直播电脑上的内容?付费内容限时免费查看亲 您是问用抖音直播录好的文件 是吗 抖音直播的时候不能放提前录制好的视频,必须借助第三方软件才行借助第三方软件实现无人直播方法:1、打开手机抖音APP,打开直播,在直播时选择“游戏直播”,添加好封面和标题。2、点…

obs抖音上下分屏直播教程

想获取游戏直播权限的直播分屏功能,可是怎么获得游戏直播权限呢?这不一定,你可以把游戏源以窗口获取,然后添加图片再挡住想挡住的位置,另外游戏的分辨率决定了游戏窗口在直播中的位置,如果你直播的分辨率是1080P,而游戏只有720P甚至更低,那么游戏图层自然就会默认列在左…

obs抖音mac直播教程_2021抖音还能用obs直播吗

mac如何做视频直播手机直播用易直播比较方便,直接下载可用软件有安卓版也有苹果版的不过你讲要对手机自身的画面直播,可能需要另一个手机进行录制,易直播是支持实时直播的,分享后好友第一时间看到就可以发弹幕互动,你也能看到他们发送的东西,实时互动当然也可以在软件里搜…

obs手游抖音直播教程_抖音obs电脑直播教程

抖音直播游戏怎么操作?(已开通直播权限,需要知道怎么操作,下载什么软件,越详细越好)抖音不会开放游戏直播权限给个人了,风险太大,万一你放版权视频或者禁播游戏就要承担法律风险。除非你有工会推荐或者粉丝量保证,即便如此违规直播禁播游戏和视频一经查实直接封号,能给…

obs和抖音直播设置教程_抖音用obs直播怎么设置

我是主播,抖音obs直播手游怎么才能有弹幕1. 现在介绍投屏到OBS直播,OBS也是一个非常不错直播工具,推荐给大家,下载地址:,点击绿色按钮“Download OBS Studio”。安装完成后,运行OBS图标启动软件。2. 首先开始设置直播参数,点击“文件” – “设置”,“通用”设置如下图…

obs和抖音直播设置教程_2021抖音还能用obs直播吗

OBS怎么设置比特率保证你的画面流畅度,低的情况你游戏画面内静止的话没什么问题,一旦有物体运动画面就会变成马赛克一样最大比特率:越高你呈现在网页给观众观看的画面越清晰,这个是根据你的网络上传速度来设定的,这个网址可以测出你的上传速度以及网络的带宽。PS:你设定的…

nanana抖音舞蹈教程_抖音韩国舞蹈nanana

抖音甩腿舞开头哦呐呐呐呐是什么歌《Oh Nanana》不明白啊 = =!老铁,抖音短视频的视频编辑怎么做😊首先,在手机上打开抖音短视频,点击底部的“+”,再点击左上角的上传视频。界面显示出手机里的所有视频,点击选中想要上传的视频,进入裁剪视频界面。在裁剪视频界面的底部…

m哥抖音所有视频教程_抖音怎么录制唱歌视频教程

抖音最火的人有哪些?关于抖音最火的人,在这里给大家简单介绍十位抖音上很火的人,来看看有没有你喜欢的吧1.费启鸣拥有180cm的身高,颜值在线,凭借“男友脸”走红,标志性的微笑圈粉无数,被网友亲切的称作“狒狒”,微博粉丝破百万,现在的他已经出道拍戏了。2.代古拉k凭借…

myboys抖音教程

抖音怎么🈴️拍抖音视频合拍方法1、打开抖音,选择【我】页面;2、在【我】页面中,【作品】栏下找到你要合拍的短视频(这里小伙伴需要有自己想要同框的短视频,如果作品中没有的话,需要先上传作品哦,步骤:可以先在抖音中下载一段需要用到同框短视频,然后上传即可)3、在…

mp3音乐怎么导入抖音使用教程_抖音怎么导入QQ的音乐

怎样把自己唱的歌曲上传到抖音并且使用1、首先我们打开抖音app,选择下方“+”图标开拍2、然后在搜索框中输入找不到的歌曲,然后会弹出没有搜索到想要的音乐3、点击推荐,然后将你需要上传的歌曲名称以及歌曲链接填写上去就能上传自己的音乐啦抖音,是一款可以拍摄短视频的音乐…

morsmordre抖音教程_Morsmordre_DJ抖音版

老铁,抖音短视频的视频编辑怎么做😊首先,在手机上打开抖音短视频,点击底部的“+”,再点击左上角的上传视频。界面显示出手机里的所有视频,点击选中想要上传的视频,进入裁剪视频界面。在裁剪视频界面的底部视频帧处滑动视频,选择想要的视频帧段,选好后,点击右上角的下…

morgen抖音舞蹈教程

抖音那个左右摇晃的舞蹈是神马抖音作为一款时下热门的APP,几乎每个年轻人都在玩。如今DJ抖音网上的热门舞蹈有很多,但如何在很短的时间内吸引人们的注意这是最为关键的。搜集了2018抖音十大热门舞蹈排行榜,让我们一起来看看抖音DJ最火的舞蹈有哪些吧。1. 抖音爱的就是你手势…

mini2教程抖音_mini2刷抖音卡吗

ipad mini2怎么用一、如何激活iPad Air/iPad51、您可以下载最新版本的iTunes,直接把iPad链接电脑进行激活!iTunes成功激活还要按以下的教程进么设置,适合没有电脑也直接使用WIFI在iOS设备上操作激活2、因为新版的iPad mini2配置的是全新的IOS7系统,所以其激活界面是跟以往的i…

migente抖音教程_migente抖音事件

oppo抖音照片视频教程抖音照片视频教程:1.打开手机,有个录制屏幕,然后,打开图片,开启至幻灯放映模式,开始录制就可以啦。2.如果手机没有录屏功能,可以升级到最新版本,或者下载录屏精灵app等录屏软件就可以了。温馨提示:如需使用前置摄像头录制视频,请先将拍摄方式切换…

mc建筑教程抖音_mc的建筑教程

minecraft一键建筑怎么用据我所知,是把快速建筑方块放在地上,然后在上面跳几下(位置要大)中文论坛里面有minecraft怎样建圆顶房子、水下建筑、圆顶长方形房圆顶可以在屋顶由外到里按类似于阶梯状的方式去搭,有的地方要直线,到一定高度时水平方向封顶。水下建筑可以用海绵…

mc建筑教程抖音_mc房子建筑别墅教程

minecraft怎样建圆顶房子、水下建筑、圆顶长方形房圆顶可以在屋顶由外到里按类似于阶梯状的方式去搭,有的地方要直线,到一定高度时水平方向封顶。水下建筑可以用海绵,但现在海绵没用了,可以在水下造一个实心建筑,再从旁边开个口放个门,然后把里面挖空,但由于呼吸的问题生…

maria抖音完整版教程_Maria舞蹈教程完整版

如何唱好女高音? 歌曲《 maria》哈哈是不是小声唱也行哟maria中文谐音歌词《玛利亚中文谐音歌词》 恰!西 giu 气加木开,叫表个西,地高开, 呜~都留我哈几玛那, 恰!瞧几木那拍,恰太呀你,日留B瞧, 日~加尔待MORE叫几玛, 玛利亚~~~啊吧玛利亚, 叫嘿,咕噜咕噜那拉那拉,…

mac电脑抖音直播教程_抖音电脑直播mac版本

抖音如何用电脑直播电脑游戏?方法/步骤1、首先在手机上打开抖音,点击菜单“我”中右上角的“三横线”图标。2、在弹出的菜单中点击“创作者服务中心”,进入创作者服务界面。3、在已开通能力列表下点击“开始直播”,进入直播界面。4、在开播模式中选择“游戏直播”,然后点击…

mac抖音直播教程_虎牙直播mac教程

抖音直播如何直播电脑上的内容?付费内容限时免费查看亲 您是问用抖音直播录好的文件 是吗 抖音直播的时候不能放提前录制好的视频,必须借助第三方软件才行借助第三方软件实现无人直播方法:1、打开手机抖音APP,打开直播,在直播时选择“游戏直播”,添加好封面和标题。2、点…

mac抖音直播教程_抖音mac电脑直播教程

苹果电脑mac系统能用什么直播伴侣?打开苹果系统上面的浏览器在浏览器中输入百度官网,然后搜索【爱奇艺】,我们这里下载的是在苹果系统里面能运行的爱奇艺哦!在搜索结果列表里面我们点击【mac】-【立即下载】按钮,开始下载该播放器。下载完成后我们在dock栏的下载完成的这个…

mac抖音卡点照片教程

抖音怎么🈴️拍抖音视频合拍方法1、打开抖音,选择【我】页面;2、在【我】页面中,【作品】栏下找到你要合拍的短视频(这里小伙伴需要有自己想要同框的短视频,如果作品中没有的话,需要先上传作品哦,步骤:可以先在抖音中下载一段需要用到同框短视频,然后上传即可)3、在…

l抖音短视频教程_怎么做抖音短视频教程

抖音怎么剪辑视频 抖音剪辑视频教程方法2022-03-11百度认证:上海天琥教育培训有限公司官方帐号天琥教育,全国连锁培训机构,专注设计教育。课程由资深导师自主研发,涵盖UI设计、室内设计、电商美工、影视特效等,全程商业项目实训,大品牌值得信赖!天琥教育秉承“把经验传递…

lutra抖音卡点教程

如何制作卡点视频?1、首先大家可以先找到卡点的视频,然后点击右下角的【音乐】;2、然后选择底部的【拍同款】;3、接着直接选择右下角的【上传】;4、然后选择【多短视频】;5、选择好十二段视频之后点击【下一步】;6、接着就是要缩短视频的长短,这样才能刚好卡到音乐的点…

lsx抖音新手入门教程

抖音怎么制作1、手机打开剪映,然后点击开始创作,选择要剪辑的视频。2、打开视频后,点击左下角的“剪辑”,就可以把不要的部分删除。3、还可以设置视频变速,调整音量,添加音乐等等。4、编辑好视频后,点击右上角的导出,然后上传抖音即可。最好是自己拍的原创作品,有内容…

love抖音手势教程_抖音爱的就是你手势舞教程

怎么用相机拍出LOVE的手势?照着这个图片上的步骤拍。1.选择拍摄角度,将手势置于画面中央。其实拍摄相对是很简单的事情,只要背景相对简单,可以很好的表现主体就OK。最难的部分其实是手势,手型修正的女生相对更具表现力。可以多拍摄一些,选择最为形象的图片。2.在PHOTOSHO…

lorengary抖音教程

抖音365天存钱方法是什么?抖音365天存钱详细教程:就是按照天数,第一天的时候存一块钱,第二天存两块,第三天存三块......以此类推,到第三百六十五天的时候就存365块,这样整个过程下来,你就会又66795元的存款。所谓365天存钱法,就是一年365天,从1到365中任选一个数字存…

lol变身教程抖音_抖音直播lol教程

lol拉克丝怎么变身 拉克丝终极皮肤变身方法进入游戏后,用LUX技能打中人,或者A出伤害就可以积攒能量,当攒够100%的时候,就会提示你可以变换最初的4种形态啦,分别是上面的火,空气,水,自然。接下来开始积攒第二段的能量,召唤师峡谷匹配局差不多20分钟左右一般就可以升级啦…

lisa的抖音歌曲舞蹈教程_王嘉尔支持Lisa的舞蹈歌曲

lisa学的什么舞种?Lisa有学很多舞种。反正Lisa最美从一个男人的角度来看!~本人80后! 女孩子在认真跳舞的时候是非常有魅力的,舞蹈只是个附属品,你提这个问题 说明你并不在意自己学什么 种类的舞蹈,只是让舞蹈成为你增加魅力的砝码。每种舞蹈都有不同的韵味,根据自己的性…

lisa的抖音歌曲舞蹈教程_Lisa下腰起身舞蹈抖音

抖音上最火的10大舞蹈抖音上最火的10大舞蹈:1、爱的就是你这个手势舞最大的亮点就在于是两人一起组合,动作很甜蜜。两人可以互动KISS这样更甜。2、heartbeat抖音heartbeat舞又叫做心跳舞,节奏感配上流畅的手势也是有趣到不行。3、panama这首歌是因为同音C哩C哩,所以被称为C…

lilmama抖音舞蹈教程

老铁,抖音短视频的视频编辑怎么做😊首先,在手机上打开抖音短视频,点击底部的“+”,再点击左上角的上传视频。界面显示出手机里的所有视频,点击选中想要上传的视频,进入裁剪视频界面。在裁剪视频界面的底部视频帧处滑动视频,选择想要的视频帧段,选好后,点击右上角的下…

lasa舞蹈教程抖音

老铁,抖音短视频的视频编辑怎么做😊首先,在手机上打开抖音短视频,点击底部的“+”,再点击左上角的上传视频。界面显示出手机里的所有视频,点击选中想要上传的视频,进入裁剪视频界面。在裁剪视频界面的底部视频帧处滑动视频,选择想要的视频帧段,选好后,点击右上角的下…

k歌抖音伴奏带歌词的教程_抖音怎么弄伴奏带歌词自己唱歌

改了一首歌词用原唱的伴奏加用自己声音唱出来怎么弄?全民k歌、酷狗音乐或者唱吧,还有一些原创歌曲平台像网易,5sing等等直接用伴奏录音就可以了请问2014年滁州交警支队加油零记分得奖加油卡在那个加油站能加到油啊?抖音显示歌词是怎么弄出来的1、首先打开抖音后,点击底部的…

k歌录到抖音上教程_抖音K歌怎样录完整版

全民k歌怎么导入抖音1、首席登录全民K歌把自己的歌“保存到手机上”,退出全民K歌,打开“抖音”,点击下方的“+号”。2、然后在打开的页面中,点击右下角的“上传”。3、选择需要上传的“歌曲”点击,选择“下一步”。4、然后选择时长点击“下一步”,添加一些特效或者歌词点…

k歌录到抖音上教程_抖音k歌怎么录完整版

抖音里怎么录制k歌视频先在手机应用商店找到迅捷录屏大师,然后点击下到手机上。2、打开它,设置一会我们录制视频需要用到的参数,打开悬浮窗,然后会出现一个悬浮窗的标志,录制画质选择高清,横屏竖屏看个人喜好。3、接着打开相册将需要录制的图片排好顺序,然后可以在图片上…

k歌上传到抖音教程_抖音怎么上传k歌作品

抖音上怎么上传?选择自己唱的原创歌曲你首先得把自己的歌上传到一些音乐平台,比如说酷狗啊,网易音乐等等,这种音乐平台之后呢?你才可以在抖音上搜索到你的歌曲,或者是说把你唱的歌保存到你的本地,这手机本地里面的也可以选择进行剪辑之后再抖音上去进行选择使用方法很多…

kiss教程抖音_Kiss Me Baby_抖音版

Kiss技巧、睁开眼睛接吻是最让彼此难堪的.接吻时最好双目含情半闭,嘴唇不语微张.最初仅是双方的嘴唇轻轻碰在一起,然后脸儿微侧,牙齿放松,嘴唇轻轻咬合,舌尖微微接触,然后舌尖勾缠,拥抱更为紧密.这才是标准的深吻.接吻时女方的手臂应该环抱对的颈背,这样可以方他的来爱抚你;但是…

i抖音短视频教程_怎样拍抖音短视频教程大全

抖音怎么剪辑视频 抖音剪辑视频教程方法抖音剪辑视频适用于上传本地视频的时候,本地拍摄的视频可以根据自己想要的效果进行剪辑,直接拍的话,在拍摄的时候就可以选择自己想要的效果,所以不用剪辑。1、在手机上找到并打开抖音短视频APP。2、进入抖音短视频App,点击下方的+号…

i抖音短视频教程_学拍抖音短视频教程

抖音视频中如何加线条抖音黑白线条设置教程:抖音短视频不仅非常受欢迎,玩法也非常多样;设置黑白方法:选择特效,再添加黑白滤镜,就可以轻松设置拍摄内容为黑白。抖音黑白特效版功能:【音乐迷你剧】最IN的音乐,一首“开口脆”的时间,伴随节奏尽情在镜头前抖腿起飞【多段…

iwanna抖音游戏新手教程

游戏《i wanna be the guy》如何操作?一、操作指南基本操作:Shift——跳(可二段跳,跳跃的高度与按shift的力度有关)Z——射击(射击存档点存档,【存档只存位置不存机关】,外传可蓄力)Q——自杀R——重来S——skip(跳过片头或动画)F2——重置X——钩爪(外传)二、特殊…

iu你和我抖音教程

抖音里有句 我会永远永远的爱你是什么歌“我会永远永远的爱你”出自歌曲《You Are Beautiful》歌手:刘沁Look into my eyes everything will be alright你不要害怕我不会忍心离开我要抹去你眼中的泪带你离开这伤害到我这儿来所有伤心的小孩冷漠的世界听不到你的呼喊幼小的身体…

iphone隔空手势刷抖音教程_iPhone怎么设置隔空手势

苹果手机咋样隔空传送苹果手机隔空投送怎么用?苹果手机隔空投送是iOS 11.2系统里面更新的一个功能,隔空投送这个功能可以让ios设备互相传输照片、文件、通讯录等等,很多人可能还不知道怎样使用它,不懂得怎样使用隔开投送的话,今天就给大家介绍一下使用方法。苹果手机隔空投…

iphone抖音取图教程_抖音IPhone梗

如何把iphone里的图片拿出来?重要更新。当你的IPHONE连接到电脑后,打开我的电脑,你会发现多了一个相机图案,显示为Apple iPhone打开那个目录就能看见你用IPHONE拍的照片和截图图片你的截图直接可以通过这里保存到电脑上,而不用再用IBRICKR了=============================…

iphone抖音去水印教程_iphone抖音无水印捷径

怎么去除抖音视频的水印,看到水印比较难受去除抖音的水印用一2113般的视频剪辑软件可以制作~方法如下5261:1、把视频导入到 爱剪辑 中,点击叠加素材--去水印--添加4102去水印区域2、去除的方式有模糊1653式、马赛克式等,可根据画面来选择3、不去水印的内话你也可以用加贴图…

iphone抖音去水印教程_iPhone抖音去水印

iphone怎么去视频水印1、首先要利用手机里的应用商店下载一款软件。如下图名字叫做快去水印,苹果和安卓的都有这个软件。2、然后就点开后软件,进入到软件的界面后,可以看到四个选项。3、就会进入下一步,此时点击左下角的video按钮就可以进入到,自己的相册中,第一次的话可…

iphone不触屏刷抖音教程

iphone11不能刷抖音你好,iPhone 11是可以刷抖音的,我现在用的就是苹果11,照样是可以刷抖音,这个您完全可以放心。苹果11支持抖音App,你可以去苹果商店下载最新的抖音App就可以使用了。苹果11刷抖音字显示不全的原因可能是抖音目前可能无法完全适配所有的手机,屏幕的大小因…

ipad抖音直播教程_ipad看抖音直播不能全屏

ipad可以开直播吗可以下载ios版本的触手录就可以开启直播了苹果平板怎么添加抖音小程序?打开【抖音】点击右下角【我的】点击右上角【...】进入设置页面在通用中我们就可以看到抖音小程序入口啦。找到小程序入口,点击搜索自己喜欢的小程序就可以进入游玩或者体验其他服务了。…

ipad抖音直播吃鸡游戏教程

ipad吃鸡怎样操作用iPad下载APP “刺激战场”,登陆有三种方式,游客、QQ、微信。跟手机一样的玩法,就是屏幕大一些。新手的话刚登进去会有操作教程 怎样跑、跳、开枪等等,对应的按键位置都会告诉你。苹果ipad抖音 怎么 开通 直播如果说你想用苹果的iPad抖音上面进行开通直播…

ipad抖音录屏直播教程_ipad抖音录屏直播模糊

怎么用ipad直播游戏中,怎么录屏请百度直接搜索ios录屏,方法比较多我就不详说了。RecScreen能用来录屏。如果是录制手机视频,易直播能够更加方便的轻松开始手机直播,不需要任何门槛和费用而且视频都是上传云端不需要担心手机内存问题还能分享给朋友一起感受直播的快乐上手傻…

ipad抖音录屏直播教程_iPad抖音录屏直播

抖音直播的时候怎么录屏?1、首先打开抖音,点击“+”,如下图所示:2、接着点击“开直播”,如下图所示:3、点击“开始视频直播”,如下图所示:4、点击右下角“”,如下图所示:5、点击“录屏”,如下图所示:6、点击“红色圆圈”,开始录屏,如下图所示:7、可以录1分钟,录…

ipad刷抖音横屏教程_怎么样在iPad上横屏看抖音

iPad上怎么让手机应用强行横屏Home键那里上滑,会拉出一个菜单,直接有横屏锁频,点锁屏,应该会一直强制横屏,具体的可以查一一下网上的说法!在设置里面设置吧。手机横。下拉线出来的。屏幕旋转。不是强制性的。有可能手机会随着水平。中心倾斜而改变。所以需要去设置里面,…

ipad刷抖音横屏教程_ipad抖音直播间怎么横屏

ipad 怎么设置横竖屏切换?提供两种方法:①用单指在屏幕最下方向上滑,弹出“控制中心”设置栏,点击中间最右侧图标(“锁定屏幕旋转”)即可锁定当前屏幕方向,再次点击即可取消。②点击“设置”→“通用”,将“侧边开关用于”中“锁定屏幕旋转”选项勾选,这时侧边开关(圆…

ios日版抖音下载教程

抖音怎么下载一、打开手机上下载软件的应用。二、打开应用搜索抖音我们点击选择该应用。三、然后我们就可以看到应用的介绍了和下面的安装按钮了。四、点击该按钮进行安装此应用。五、安装完成后找到抖音点进去就可以看了。六、之后我们就可以看视频了。批量下载抖音视频,可以…

ios抖音教程_抖音国际版注册教程ios

ios系统 抖音上面,那些转换好几个场景拍出来的短视频是怎么拍出来的?是用什么软件添加几个视频合成我一般直接用相机拍几个视频,然后在抖音上选择上传视频,下面有个多选按钮,选择几个视频同时上传就可以合并剪辑了啊。短视频软件现在可以去使用微视里面的魔法表情特效很多…

ios抖音教程_ios日本抖音教程

ios系统 抖音上面,那些转换好几个场景拍出来的短视频是怎么拍出来的?是用什么软件添加几个视频合成我一般直接用相机拍几个视频,然后在抖音上选择上传视频,下面有个多选按钮,选择几个视频同时上传就可以合并剪辑了啊。短视频软件现在可以去使用微视里面的魔法表情特效很多…

ios抖音播游戏教程_ios抖音游戏在哪里玩

抖音直播游戏怎么操作?(已开通直播权限,需要知道怎么操作,下载什么软件,越详细越好)抖音不会开放游戏直播权限给个人了,风险太大,万一你放版权视频或者禁播游戏就要承担法律风险。除非你有工会推荐或者粉丝量保证,即便如此违规直播禁播游戏和视频一经查实直接封号,能给…

ios抖音怎么拍长视频教程

抖音怎么发长视频抖音拍摄长视频的要求是粉丝必须在1000以上,申请步骤如下:需要工具:手机、抖音APP一、进入抖音在【zd我】界面中的右上角会有三个点的图标【...】,点击这个图标。二、接下来的界面会出现三个选项,点击最后一个【设置回】。三、在【设置】界面中找到【反馈…

ios抖音卡点照片教程

我想上传照片,抖音的+号点不动怎么办?这个还是要看一下你的手机是不是授权了?抖音能够查看你的相册功能,如果没有授权的话,他就无法上传照片的你可以登陆qq相册 上传照片 一样的效果你好。可能你的图片格式不支持你可以把抖音关了,清理一下手机内存,然后再重试。卡点视频…

ios抖音动态壁纸设置教程_抖音动态壁纸设置声音iOS

苹果6plus怎么设置斗音动态壁纸打开在iPhone上的【设置】-【墙纸】中点击【选取新墙纸】。在选取页面点击【Live】,里面是iphone自带的live photos,点击——相机——胶卷进行选择选择喜欢的动态壁纸。按压屏幕可以预览壁纸效果,选择【Live Photo】,再点击【设定】。最后选择…

ios抖音动态壁纸设置教程_抖音动态壁纸保存在哪个文件夹

苹果抖音动态壁纸怎么设置1、以iPhone7为例,打开进入抖音主界面,选择需要视频,找到右下角的分享按钮,点击进入下一步。2、在视频分享界面,顺着箭头方向,向左方滑动屏幕,找出“动态壁纸”选项。3、在分享页面,找到下图所选的“动态壁纸”选项,点击进入下一步。4、点击打…

ios仿抖音教程_OPPO仿IOS教程

ios系统 抖音上面,那些转换好几个场景拍出来的短视频是怎么拍出来的?是用什么软件添加几个视频合成我一般直接用相机拍几个视频,然后在抖音上选择上传视频,下面有个多选按钮,选择几个视频同时上传就可以合并剪辑了啊。短视频软件现在可以去使用微视里面的魔法表情特效很多…

ios14抖音新功能教程

苹果手机抖音升级怎么升您好,苹果手机更新抖音的具体操作方法为:工具:iPhone 6sPlus1、在手机桌面上找到”App Store“应用图标,点击进入。2、在APP Store应用界面的下方找到”更新“选项,点击打开。3、在更新界面中找到抖音短视频,点击右侧的”更新“选项即可。可以在苹…

ios12捷径抖音教程视频_抖音视频解析捷径ios12

iphone12怎么设置动态壁纸需要在设置中选新的墙纸就可以了,步骤如下:1、首先打开手机中的设置。2、在设置中找到墙纸。3、点击选取新墙纸。4、以系统自动的为例,点击动态墙纸。5、进入后点击一个,选择下方的设定。6、选择设定范围就可以了。iPhone如何设置动态壁纸?iPhone…

ios12抖音教程_抖音快捷指令ios12

苹果手机抖音怎么添加微信和qq好友 我的个人中心没有这两个显示在新版本抖音上,是没有QQ和微信入口的!大家想要关注自己微信好友或者QQ好友必须要问他们的ID或者用户名才行,通过搜索的方式来关注!如果搜索不到的话一般是因为抖音系统的问题,大家可以稍后再试或者通过下面的…

ios12抖音教程_ios12可以下载抖音吗

iPad怎样录制屏幕并且上传抖音。前往“设置”>“控制中心”>“自定控制”来,然后轻点“屏幕录制”旁边的 绿色加号图标。从任意屏自幕的底部向上轻扫。在装有 iOS 12 或更高版本的 iPhone X(或更新2113机型)或 iPad 上,从屏幕右上角向下轻扫。用力按压 灰色的录制图标…

inshot教程抖音_inshot字幕制作教程

有哪位大神知道抖音这种音乐视频加字幕是用什么软件制作的呀?抖音音乐视频加字幕可以用以下两个软件实现:1.Inshot视频编辑 & 视频剪辑 & 视频制作;文本和动态表情符号;为视频和照片添加文字和贴纸,甚至你自己的照片;文字支持定义各种颜色、阴影和底色;文字和贴纸时间…

inshot抖音水印教程_华为抖音水印怎么去掉教程

怎么制作水印1先在背景层上建个新图层,然后按快捷键T选用文字工具,在新建图层里输入你的名字。2将背景层隐藏。3按快捷键Ctrl Shift S(另存为),将做好的Logo另存为PNG格式。这样,一个背景为透明格式的Logo就制作好了。这个文件要保存好,以后每次添加水印的时候都要用到它…

http抖音短视频教程

怎么发抖音视频一、打开手机抖音,点开你喜欢的抖音视频,点击右下方的一个转圈圈的图标。二、点开之后,进入这条视频的首页,就可以看到下方有一个拍同款的按钮。三、点击拍同款,在拍摄页面的左下方有一个道具。四、点击道具,可以选择你喜欢的主题,然后点击下载使用。五、…

horizon抖音手舞教程

怎么把全民k歌的歌传到抖音想把全民K歌的歌传到抖音上面,直接把全民K歌的歌曲保存到本地相册就可以。具体步骤如下:1.第一步、首先,请登录全民K歌,并将你的歌曲“保存到手机”如图所示。2.第二步、退出全民K歌,打开抖音,点击底部的“+”。3.第三步、下一步,点击右下…

havana舞蹈抖音教程_havana舞蹈拉丁版教程

抖音上最火的舞蹈是什么 抖音最受欢迎的舞蹈介绍抖音作为一款时下热门的APP,几乎每个年轻人都在玩。如今DJ抖音网上的热门舞蹈有很多,但如何在很短的时间内吸引人们的注意这是最为关键的。搜集了2018抖音十大热门舞蹈排行榜,让我们一起来看看抖音DJ最火的舞蹈有哪些吧。1. 抖…

h5制作教程抖音_h5邀请函制作教程

H5能嵌入到抖音上吗目前抖音还不支持h5的上传。_还梢园_5上的页面分成图片单独拿出来使用,作为图片上传。_比唬迪衷谏厦婀δ芎螅愕囊趁婢涂梢酝斗旁诙喔銮劳乒悖迪挚焖僖髟龇哿恕?H5能发抖音吗目前抖音还不支持翻页h5的上传,不过可以把h5上的页面分成图片单独拿出来使用,作为…

gsx抖音灯光制作教程

老铁,抖音短视频的视频编辑怎么做😊首先,在手机上打开抖音短视频,点击底部的“+”,再点击左上角的上传视频。界面显示出手机里的所有视频,点击选中想要上传的视频,进入裁剪视频界面。在裁剪视频界面的底部视频帧处滑动视频,选择想要的视频帧段,选好后,点击右上角的下…

gopro9抖音直播使用教程_gopro9能不能直播抖音

gopro连电脑网上直播吗?现在gopro不仅可以连电脑直播了,连手机都可以我昨天看到搜狐上面的新闻说在直播app已经开发出了手机直播支持gopro接入的功能了你可以去试试直播然后分享到朋友圈、微博之类的网页端也可以看到手机的直播页面 而且是同步的只能说科技越来越进步,技术猿…

gopro9抖音直播使用教程_gopro9怎么直播抖音

gopro连电脑网上直播吗?现在gopro不仅可以连电脑直播了,连手机都可以我昨天看到搜狐上面的新闻说在直播app已经开发出了手机直播支持gopro接入的功能了你可以去试试直播然后分享到朋友圈、微博之类的网页端也可以看到手机的直播页面 而且是同步的只能说科技越来越进步,技术猿…

fcpx抖音发高清视频教程

用手机相机拍了一段视频想上传到抖音,可是抖音不支持1080p的分辨率,怎么办?跪求大神,感谢🙏这种情况只能压缩视频画质了一般是支持720p画质你可以使用视频编辑软件压缩一下下次拍摄可以在设置调整为720p的用读卡器或数据线连接到电脑上,再把你要上传的视频弄出来再在ku6…

faded抖音版卡点教程

抖音卡点视频如何制作图文+视频版 ?有教程吗?话不多说,直接进入正题。首先,图片轮播类的视频该怎么做?步骤一:选择一张素色背景,或是你心仪的背景,但你要知道这张背景的色调一定要配合接下来你的几张轮播图;步骤二:准备好你的轮播图片(至少五张),图片尺寸一致,记…

f12下载网易云音乐教程抖音_网易云音乐旧版本下载

网易云音乐总是自己暂停,怎么处理?手机用网易云音乐听歌,总自动暂停可尝试以下方法解决:1、查看是否设置音乐自动关闭功能:音乐-右上角更多(菜单键)-设置-音乐自动关闭-关。2、检查是否设置翻转静音或轻松静音功能,建议关闭尝试。3、更换其他听歌软件播放,观察是否出现…

f12下载网易云音乐教程抖音_网易云音乐怎么下载到本地

网易云音乐怎么下载? 1、首先需要下载网易云音乐电脑版客户端,无需安装下载完毕后直接点击cloudmusic.exe打开程序即可。 开打程序后需要我们选择一个账号登陆,这里看有啥账号就登陆啥账号,推荐是用网易的账号的。 2、登陆后就进入了主程序界面了,可以在最上面的搜索栏…

exo投票教程抖音_exo首歌投票教程

最强天团EXO最受欢迎五首歌我想投票怎么投!!1MAMA 2.HISTORY3.What Is Love4.Growl5狼与美女最强天团的官方微博上面应该有吧在微博关注#最强天团#【搜索热门话题】关注以后要注意看他们发起的投票,应该还没有结束投票。音乐中心exo怎样打榜预告】今天下午北京时间3点多有音…

exo初雪抖音教程_exo初雪罗马音

韩文版初雪歌词对照发音EXO-K - 첫눈 (The First Snow)첫눈 오는 이런 오후에 너에게 전화를 걸 수만 있다면 기쁠텐데 벌써 일년이 지났는데 난 아직 미련 가득해서 "쓸쓸해" 어느새 혼잣말 (시계를 되돌려) 1년 전으로 갈 수 있다면 (마음을 되돌려) 지금 우린 달라…

excel速成教程抖音_抖音上面学excel是不是真的

Excel表格如何快速上手这个要看你用来做什么了, 日常运用,先熟悉一下几个公式,IF ;VLookuP ;sumif;sum;常用的这些个。然后想想你需要怎么处理表格,还可以学点数据透视表,透视图,图标等。需要更繁琐的处理就用VBA实践-----网上找些教程和excel文档那东西就是,,,,…

excel速成教程抖音_excel速成教程视频

老铁,抖音短视频的视频编辑怎么做😊首先,在手机上打开抖音短视频,点击底部的“+”,再点击左上角的上传视频。界面显示出手机里的所有视频,点击选中想要上传的视频,进入裁剪视频界面。在裁剪视频界面的底部视频帧处滑动视频,选择想要的视频帧段,选好后,点击右上角的下…

excel教程技巧抖音_抖音上教Excel技巧的视频

Excel实战技巧视频教程本部Excel实战技巧视频教程,从Excel的工作环境和基本操作开始介绍,逐步深入地揭示了数据处理和分析、函数和公式应用、图表和图形的使用以及VBA和宏的应用等各个部分的实战经验技巧。 Microsoft Excel是微软公司的办公软件Microsoft office的组件之一,…

excel教程技巧抖音_抖音上做EXCEl教程能爆吗

Excel实战技巧视频教程本部Excel实战技巧视频教程,从Excel的工作环境和基本操作开始介绍,逐步深入地揭示了数据处理和分析、函数和公式应用、图表和图形的使用以及VBA和宏的应用等各个部分的实战经验技巧。 Microsoft Excel是微软公司的办公软件Microsoft office的组件之一,…

ev录屏抖音教程_苹果手机抖音上怎么录屏教程

抖音直播怎么录屏?EV录屏可以录屏又可以直播呀!录屏不限制时长没有水印单路推流也是免费的哦!直播同时还可以保存视频内容。下载一个录屏软件(如果手机自带就不用了)打开相册选择你要录的图片,打开录屏设置。录下你要上传的照片。录完结束后。上传到抖音。望采纳以录屏精…

ev录屏抖音教程_抖音游戏录屏直播教程

抖音录频怎么录?首先打开【抖音短视频】APP,然后下拉手机状态栏,接着点击【屏幕录制】图标,再点击【开始录制】按钮,即可开启录屏打开手机里的录屏大师,点击开始录制,3秒倒计时返回桌面再打开抖音视频,保持在抖音页面录制结束直接点开录屏大师,点击暂停然后页面就会提…

ejm抖音舞蹈教程慢动作_抖音社会摇舞蹈教程

舞蹈教学扭腰分解动作?刚开始,是四个分解动作 前左后右等熟练之后,可以 八个分解动作 即 : 前 左前 左 左后 后 右后 右 右前 前老铁,抖音短视频的视频编辑怎么做😊首先,在手机上打开抖音短视频,点击底部的“+”,再点击左上角的上传视频。界面显示出手机里的所有视频…

egm抖音教程_egm老奶奶抖音

EGM写在腿上是什么意思?egm是抖音上的一个梗,原是edm歌曲后被抖音变装被你熟知,所以不管egm写在哪都没任何意思。我觉得他是用邮政快递发了一些货过来,在快手上订了货,是这个意思吗?抖音中egm是什么意思?抖音EDM歌词:抖音用户短笛,发布的一个小视频。抖音,是一款可以拍…

edm抖音怎么拍教程

老铁,抖音短视频的视频编辑怎么做😊首先,在手机上打开抖音短视频,点击底部的“+”,再点击左上角的上传视频。界面显示出手机里的所有视频,点击选中想要上传的视频,进入裁剪视频界面。在裁剪视频界面的底部视频帧处滑动视频,选择想要的视频帧段,选好后,点击右上角的下…

D抖音114教程网下载

如何下载抖音并安装?可以在手机自带的应用市场上,搜索该“抖音”并下载安装即可。具体步骤如下(以华为手机为例):一、打开手机上下载软件的应用。二、打开应用输入“抖音”点击搜索。三、然后我们就可以看到应用的介绍了和下面的安装按钮了。四、点击该按钮进行安装此应用…

dura舞蹈抖音教程

抖音上最火的10大舞蹈抖音上最火的10大舞蹈:1、爱的就是你这个手势舞最大的亮点就在于是两人一起组合,动作很甜蜜。两人可以互动KISS这样更甜。2、heartbeat抖音heartbeat舞又叫做心跳舞,节奏感配上流畅的手势也是有趣到不行。3、panama这首歌是因为同音C哩C哩,所以被称为C…

dura舞抖音教程_抖音嘟啦dura舞真空跳

求此歌歌名,杜拉杜拉Dura-Daddy Yankee抖音上的嘟拉舞火起来的歌曲 主题歌片头曲(op):《梦ノート》 歌:azusa 片尾曲(ed):《大好きだよ》 歌:momo(川上桃子) 剧中曲:《if》 歌:玉川茉莉(cv:中岛 爱)抖音那个啦啦啦的歌叫什么⊙∀⊙?歌名:Dura《undress rehea…

dura+抖音+教程_抖音神曲dura

老铁,抖音短视频的视频编辑怎么做😊首先,在手机上打开抖音短视频,点击底部的“+”,再点击左上角的上传视频。界面显示出手机里的所有视频,点击选中想要上传的视频,进入裁剪视频界面。在裁剪视频界面的底部视频帧处滑动视频,选择想要的视频帧段,选好后,点击右上角的下…

doov手势刷抖音教程_华为刷抖音手势怎么设置

DOOV手机怎么手式刷机,点哪个。手机保持关机状态按住音量+,HOME键和开机键一起按住5秒这时候进入一大堆英文选项就进入recovery模式了选择Wipe DATA/Factory reset(清空DATA/恢复出厂设置)然后再选择Yes -- delete all user data(是 -- 删除全部用户数据) 返回到主界面,…

dnf抖音直播伴侣教程_直播伴侣DNF闪屏

DNF伴侣怎么用?不要用这个,要封号哦!第一次封3天,第二次封7天,第3次角色会被删了哦抖音怎么直播玩游戏?打开抖音APP,然后击页面下方的+号,之后选择直播模式,再点击开始游戏直播,会得到一个地址,点击复制地址,打开小熊录屏软件,然后点击页面下方的去开启,把刚在抖…

dm抖音蚂蚁牙黑教程

蚂蚁的牙为什么是黑的?因为蚂蚁牙太小了,有没有手可以刷牙,加上有时候吃的东西是黑色的,所以蚂蚁牙就变成黑色,也被人们唱成蚂蚁牙黑 蚂蚁牙黑蚂蚁牙黑是什么意思蚂蚁牙黑是音译ma-ia-hii出来的,原歌曲《Dragostea Din Tei》所属专辑:Disco-Zone发行时间:2004年04月19日…

dj酒吧现场蹦迪抖音教程_酒吧蹦迪现场音乐

蹦迪怎么蹦要用双腿支撑着身体使劲的摇晃身体各个关节部位,跟着剧烈震耳的音乐乱舞, 这样就形成了蹦迪。最关键的是要放开来,蹦迪和其他舞艺的区别就是没有什么 君子和淑女之说。随意啊 自己感觉好就可以!很好学的啊!!经常去几次看别人是怎么蹦的!我就是这样学会的DJ的入…

dj酒吧现场蹦迪抖音教程_手机拍摄酒吧蹦迪现场

DJ学习步骤是哪几样啊?1,熟悉舞曲的风格。然后就是对速度,两首舞曲不同的BPM,你把他对成一致的,不跑码就算过了第一关了,这一关是比较重要的,如果这关不练好的话以后会很难的。2,接歌混音,,这一步也比较重要,混音的方法不同的话,接出来的感觉也是不一样的。,3,最后…

dj摇摆舞抖音最火社会摇教程

推荐几首好听的社会摇电音舞曲 Ma 利刚精简愈演愈烈皇家气派e简单好看的社会摇舞蹈教学华尔兹。 但是绝对不可能跳伦巴,恰恰,牛仔,桑巴和斗牛的。 有点基础舞蹈知识的人都知道,伦巴,恰恰,牛仔,桑巴和斗牛都是劳动人民在劳动中跳出来的舞蹈。 就像我们中国的藏族舞和傣族…

dj抖音直播万能背景教程

老铁,抖音短视频的视频编辑怎么做😊首先,在手机上打开抖音短视频,点击底部的“+”,再点击左上角的上传视频。界面显示出手机里的所有视频,点击选中想要上传的视频,进入裁剪视频界面。在裁剪视频界面的底部视频帧处滑动视频,选择想要的视频帧段,选好后,点击右上角的下…

dj扭腰舞抖音最火小姐姐教程

春日宴,绿酒一杯歌一遍。 再拜陈三愿:一愿郎君千岁,二愿妾身常健,三愿如同梁上燕,岁岁长相见。唐 - 冯延巳 - 长命女 【年代】:唐 【作者】:冯延巳 【题目】:长命女 【内容】: 春日宴,绿酒一杯歌一遍。 再拜陈三愿:一愿郎君千岁,二愿妾身常健,三愿如同梁上燕,岁…

diy汽车挂件教程抖音_diy编织挂件教程

汽车DIY装饰品全车贴动画的车贴,座套米奇的,后挡风挂些小件的,方向盘套,挡板套,安全带套,后视镜套,等等汽配城都有全车贴动画的车贴,座套米奇的,后挡风挂些小件的,方向盘套,挡板套,安全带套,后视镜套,等等汽配城都有这个网址你可以参考一下,或许对你有用.去淘宝,…

diy汽车挂件教程抖音_diy平安喜乐汽车挂件教程

抖音里面可换成自己的照片拍同款怎么弄的1、手机开机,在手机桌面打开 抖音短视频。2、在抖音首页后,找到想要拍同款的视频,点击右下角 音乐。3、接下来需要在音乐页面,点击 拍同款,如下图所示。4、接下来需要在拍摄页面,点击 拍摄,如下图所示。5、接下来在开始拍摄视频后…

diy抖音手工包包教程_diy抖音手工包包教程视频

如何DIY手制手包方法图解步骤一:绘图及纸样1.首先绘制作草图,标注尺寸和注意事项2.根据草图用废纸裁出各部分的纸样,并简单组合,修正尺寸。如尺寸无误后,用硬板纸打样,这样基本保证不会走形和浪费皮革。步骤二:裁皮及处理3.利用上面的硬板纸,使用皮革专用笔画到皮上。图…

diy手工包教程抖音_diy自制手工包教程

如何DIY手拎包方法图解1.准备材料:带胶铺棉、里布、表布、包边条。尺寸:粉色棒棒糖15*20两块,黑水玉15*50一块,里布一样。2.表布烫铺棉。3.4.如图将粉色棒棒糖与黑水玉布缝在一起。(我偷懒直接缝的直角,如果缝成圆角的话,会更平滑一些)5.同样方法将另一面也缝好。6.翻过…

c哩c哩舞蹈抖音教程_抖音社会摇舞蹈教程

抖音送别扑火英雄背景音乐是什么抖音短视频是时下最火的一款社交视频软件,它带火了不少风格各异的音乐 抖音魔性bgm 1. Panama 《Panama(巴拿马)》是罗马尼亚歌手Matteo演唱的歌曲,其中一段在抖音上很火,还改编出了舞蹈,因为歌词c哩c哩十分洗脑而在抖音魔性bgm排行榜中上榜…

c哩c哩舞蹈分解教程抖音_抖音摆摆舞蹈分解动作

c哩c哩是什么意思现在抖音上很火的一首歌《Panama(巴拿马)》由罗马尼亚歌手Matteo演唱的歌曲,收录于专辑《Panama》中,于2013年10月2日通过MediaPro Music和Orchard Enterprises NY Inc正式发行。这首歌于近期在网络上一炮而红,并将歌曲的一部分改编成了舞曲。(中文翻译仅…

c哩c哩舞蹈分解教程抖音_天涯抖音舞蹈分解动作示范

老铁,抖音短视频的视频编辑怎么做😊首先,在手机上打开抖音短视频,点击底部的“+”,再点击左上角的上传视频。界面显示出手机里的所有视频,点击选中想要上传的视频,进入裁剪视频界面。在裁剪视频界面的底部视频帧处滑动视频,选择想要的视频帧段,选好后,点击右上角的下…

c哩c哩抖音舞蹈教程_简单抖音舞蹈教程

c哩c哩舞蹈串词c哩c哩舞蹈串词1、拿出你的热情,舞动青春,今天我们让我们共同释放激情,请欣赏舞蹈《c哩c哩》 。2、奔放的舞姿,飞扬的旋律,展现出一幅幅幸福和谐的画面,描绘出一道道绚丽动人的风景。请欣赏舞蹈《c哩c哩》。3、当我们挥动双手,当我们变换脚步,当我们腾空…

csgo抖音剪辑教程_csgo视频怎么剪辑抖音

抖音上的剪辑视频都是怎么做到1.首先,你需要从一些视频网站或软件上下载你想要的视频。比如像爱奇艺、优酷,相信大家都很熟悉。然后将你所需的视频下载后保存在电脑里。2.爱剪辑,其他的视频剪辑软件也可以,这里以爱剪辑为例。打开软件后,填写上片名和制作者,然后点击确定…

csgo抖音剪辑教程_csgo月落乌啼霜满天剪辑教程

抖音怎么剪辑视频?打开抖音,然后点击本地视频进行导入。如果时常大于15秒,就会出现可以拖动的时间框。 可以拖动这个时间框进行前后移动,来剪辑合适的15秒。点击旋转按钮,可以将视频进行各种角度的反转。 点击下一步之后APP会进行视频的剪辑运算,会有些卡,但是这个时候千…

cs2019抖音转场特效教程

抖音里的slomo怎么拍1、首先大家先拍摄一个素材视频,用于后期的制作,截取视频的最后一帧 。可以使用PS或者其他的手机软件编辑好自己想要的效果。推荐APP:Bazaart苹果版下载。2、编辑好图片后,将图片保存到手机中,然后从手机的底部上滑,调出录屏。将图片录制成视频。3、…

comebaby抖音制作教程

comebaby是什么意思come baby翻译为:来吧宝贝。Come On Baby 宝宝总动员 ; 宝贝儿来吧 ; 来吧 ; 来吧宝贝here come my baby 这里来我的宝宝 ; 这里是我的宝贝 ; 这里是我的孩子Come out baby 出来吧Come Closer Baby 接近婴儿Come Here Baby 快来吧宝贝come on baby don 幸福…

cf抖音卡点慢动作教程

cf怎么卡点啊????去淘宝网、哪里有人带卡的卡点,就是守住一个地方,团队合作,卡不同的地方。抖音卡点视频如何制作图文+视频版 ?有教程吗?话不多说,直接进入正题。首先,图片轮播类的视频该怎么做?步骤一:选择一张素色背景,或是你心仪的背景,但你要知道这张背景的…

cc棒使用教程抖音_抖音sc防火墙使用教程

cc棒使用步骤?小白求指导对于许多爱美的女孩子来说cc棒这种化妆并不陌生,至于它是干什么用的呢。其实呢,cc棒这种化妆品是用于打底使用的,这种化妆品与bb霜还有粉底液有着一样的功能。相信很多人认识这款化妆品是通过抖音的各大网红嘴里知道的吧,cc棒也被我们称为网红棒,…

CBB用抖音吸粉教程

怎么使抖音粉丝,快速上升抖音的算法是极具魅力的。这个魅力在于,抖音的流量分配是去中心化的。在微博和公众号上,如果你没有粉丝的话,你发的内容就不会有人看。但是抖音就不一样,你可以完全没有粉丝。所有的抖音的用户,你拍的任何一个视频,无论质量好还是质量坏,发布了…

catchfire抖音卡点教程

怎么制作卡点视频?教你一个简单的方法,在手机上下载一个腾讯相册管家,进入腾讯相册管家在底部点击故事选项,就可以看到超火卡点视频的入口了,点击进入做同款,就需要选择素材了,选好之后卡点视频就做好了,可以自由的跟换模板和台词。一边玩劲舞团一边给对方猛点视频你自…

cad画抖音教程_CAD画党旗教程

怎么用CAD画图?最好有视频,绘制直线(line)有三种方法:①绘图中——直线。②在绘图工具栏中选中直线。③在命令框中直接输入line或L。操 作:①按相对坐标输入一个长为50宽为30的矩形。②按绝对坐标讲画矩形并演示。练习画直线命令,熟悉Cad中的操作格式。在【绘图】工具栏…

cad抖音教程_抖音图标尺寸cad

auto CAD操作技巧快捷键,不管哪个CAD的版本都是通用的,建议不要更改快捷键的设置,在我空间的日志里有详细的CAD快捷键目录!auto CAD使用技巧如果对你有所帮助希望你能给我加分,不要"0"分OK?要有些诚意嘛!!!做人要厚道啊!!!!如何提高CAD绘图的速度 随着CAD、CAM…

cadib抖音教程

老铁,抖音短视频的视频编辑怎么做😊首先,在手机上打开抖音短视频,点击底部的“+”,再点击左上角的上传视频。界面显示出手机里的所有视频,点击选中想要上传的视频,进入裁剪视频界面。在裁剪视频界面的底部视频帧处滑动视频,选择想要的视频帧段,选好后,点击右上角的下…

b站抖音小视频教程_抖音拍摄技巧视频教程

有没有办法将bilibili上的视频发到抖音上?得先看一看原视频是否允许转载,或者经过原UP主同意才行。手机直接缓存,电脑版可以用审查元素下载b站只有两个区,鬼畜区和鬼畜素材区,所以。。。。老铁,鬼畜素材区了解一下抖音小视频怎么玩?1、首先自己拍摄一段自己的作品;2、然…

b站刷抖音教程_抖音如何给主播刷礼物教程

哔哩哔哩怎么像抖音那样刷上去看下一个?bilibili暂时没有像抖音那样的刷视频。毕竟每个产品都有自己的特色。当下这个社会,是被手机霸占的时代。许多人也纷纷表示:自己不只是从何时起,对手机越来越痴迷,相比高中时候,自己失去了太多的自律性。 当我们拿着手机,痴迷于上面…

b站刷抖音教程_oppo手表刷抖音教程

有没有办法将bilibili上的视频发到抖音上?得先看一看原视频是否允许转载,或者经过原UP主同意才行。手机直接缓存,电脑版可以用审查元素下载b站只有两个区,鬼畜区和鬼畜素材区,所以。。。。老铁,鬼畜素材区了解一下怎么刷哔哩哔哩bilibili视频播放量呢刷视频播放量的方法有…

booty烫脚舞镜面教程抖音

booty music教学(要有讲解)When it be going like that boom boom, 当我听到Boom Boom的声音,girl i want to put you all up in my room.女孩,我想把你在我房间抱起。I wanna put you all up against that wall. 我想把你抵住墙。Throw you on the bed and take your clothe…

bibibibi抖音教程

抖音上很火的BIM视频是怎么制作出来的?智汇云BIM视频很多特效视频都是用模板制作的,因为用AE制作的话门槛有点高,所以都是用PR或者其他特效视频实现的。抖音上的特效其实也分很多种比较普遍的就是大神会事先拍摄好需要的片段,然后利用后期剪辑软件来进行剪辑制作,后期是一…

beyoursun抖音教程

发抖音的步骤技巧一:调整发布时间有统计显示,有 62%的用户,会在饭前和睡前刷抖音,而在公司路上、上厕所等碎片化时间刷抖音的仅有 10.9%。最好的发布时间点没有统一的标准,所谓的工作日中午 12 点,下午 18 点以及晚上 21 点-22 点,或者周五的晚上以及周末等,统统只是大…

beyoursun抖音教程_beyoursun舞蹈教程

oppo抖音照片视频教程抖音照片视频教程:1.打开手机,有个录制屏幕,然后,打开图片,开启至幻灯放映模式,开始录制就可以啦。2.如果手机没有录屏功能,可以升级到最新版本,或者下载录屏精灵app等录屏软件就可以了。温馨提示:如需使用前置摄像头录制视频,请先将拍摄方式切换…

au制作抖音音乐视频教程

怎样制作AU视屏先用 Fraps 这个软件截成一段视频...再用 会声会影 或者 AE 7.0 任选一个进行编辑...注意编辑之后的大小、规格和格式...推荐规格用 600*600...格式用 .wnv ...再上传至 9游视频:等待审核之后就可以了...提示下: 会声会影比较简单...但效果不是很好...AE 7.0 虽然…

asmr抖音直播教程

抖音无人直播怎么做?现在抖音无人直播的话,不能用电脑推流了,电脑推流没有流量,会限流,甚至是封号。大佬们早就开始用手机无人直播了,手机直接视频开播,然后直播间播放手机里提前存好的视频,不限流量,咔咔进人。给你说个小窍门,现在抖音大力扶持直播间,0作品开播,这…

app抖音教程_国际抖音app下载安装教程

oppo抖音照片视频教程抖音照片视频教程:1.打开手机,有个录制屏幕,然后,打开图片,开启至幻灯放映模式,开始录制就可以啦。2.如果手机没有录屏功能,可以升级到最新版本,或者下载录屏精灵app等录屏软件就可以了。温馨提示:如需使用前置摄像头录制视频,请先将拍摄方式切换…

app抖音教程_下载抖音盒子App

怎么发抖音视频一、打开手机抖音,点开你喜欢的抖音视频,点击右下方的一个转圈圈的图标。二、点开之后,进入这条视频的首页,就可以看到下方有一个拍同款的按钮。三、点击拍同款,在拍摄页面的左下方有一个道具。四、点击道具,可以选择你喜欢的主题,然后点击下载使用。五、…

applewatch下抖音教程_Applewatch刷抖音

iwatch怎么下载应用iwatch怎么下载应用?其实这个需要跟苹果手机进行连接,然后在手机上下载相应的应应用推送到手表客户端可以通过手机去下载应用,然后下载完成之后就可以安装到手机上面了。楼主你好,很高兴为你解答,前苹果最新发布的 apple watch 手表上,有一个特殊的功能…

apk抖音短视频教程_怎样上传抖音短视频教程

下载抖音短视频。1、您可以在电脑浏览器上打开搜索【抖音】,进入抖音的官网,在右下角选择手机的系统版本,或者是扫描二维码进行下载;安卓可以下载到电脑上然后将apk安装包拖到手机上进行安装;2、在手机的应用商城搜索【抖音】;3、点击进入应用的介绍页面,然后选择下载即…

andy抖音最火版舞蹈教程

老铁,抖音短视频的视频编辑怎么做😊首先,在手机上打开抖音短视频,点击底部的“+”,再点击左上角的上传视频。界面显示出手机里的所有视频,点击选中想要上传的视频,进入裁剪视频界面。在裁剪视频界面的底部视频帧处滑动视频,选择想要的视频帧段,选好后,点击右上角的下…

alohahejahe抖音版指弹教程_alohahejahe抖音高潮版

视频怎么弄来的😓😓有视频才能剪辑呀?视频可以去抖音、2113快手、爱拍、西瓜、好看视5261频等自媒体平台去采4102集,可以考虑用固乔视频助手来批量采1653集,采集方法如下:1、复制短视频的链接,2、粘贴到工具一键下载3、也可以随机获取热门的视频下载这个比较快,缺点是…

alohahejahe抖音版指弹教程_alohahejahe抖音原版

抖音弹奏你的新年乐章怎么弹以这首奏鸣曲第四小节为例fa上面有一个tr 这个符号是颤音,看到tr这个符号就需要把tr下面的音来弹。132 或 3131是指法,表示你在这里有2种弹法可以选择。下面我来说说这2种弹法。(1)用132指分别弹fa so fa 3个音,对左手的re;用23指弹分别弹mifa…

ai教程视频抖音_ai拼版教程 视频

抖音卡点视频如何制作图文+视频版 ?有教程吗?话不多说,直接进入正题。首先,图片轮播类的视频该怎么做?步骤一:选择一张素色背景,或是你心仪的背景,但你要知道这张背景的色调一定要配合接下来你的几张轮播图;步骤二:准备好你的轮播图片(至少五张),图片尺寸一致,记…

ai抖音艺术字体设计教程_抖音艺术字体转换器

怎样将AI文字导入3D做成立体字原文地址:AI做3D立体字作者:风知倩 海报中的立体字效果 方法1:先打字,我打的是... 选择 菜单 - 3D - 凸出和斜角 勾选预览,可以直接预览到文字的3D效果 还有贴图功能,...里,我们利用现实世界里的自然元素,结合AI的3D立体效果,让这些元素都…

ai抖音艺术字体设计教程_抖音艺术字体怎么打出来的

用AI怎么设计立体艺术字体字体设计,相对抽象一点。不好入手时,最好用铅笔先用纸画线条,做一个雏形,再用AI软件进行字体组合变形。经常用到的初步字体有:菱心体、秀英体、粗黑体等,再有用到矩形、圆形,便于字体转曲后抽伸、节点变化。多练习、多思考,是一个循序渐进的过…

ai抖音图标制作教程_抖音特效图标怎么制作

ps ,ae,pr,ui,cad,3dmax,cdr,ai都是做什么的?PS,在于不同的行业有不同的应用。在平面设计中,它的作用基本就是做广告,海报,修图,调色。在室内设计中,它的作用基本上位修改效果图和制作贴图为主。而在影视行业中,它的作用以包装栏目以及电影海报为主。在影楼中,最大的作…

ai动态照片教程抖音_ai照片动起来教程

这个动态图片怎么弄的,求大神指点看到的是静态图。动态图可以用PS软件时间轴做,也可以用其他动态图处理软件做,要根据具体效果,建议网上搜有关教程学习!请问一下动态图片怎么做?Ulead GIF Animator V5.05 用这个软件,很好用,原理就是把多张图片连起来,就变成动画了,保存成…

ainy爱你抖音版bgm卡点教程

抖音第一个表情I❤U什么意思?它的意思是:“我爱你”I是英文里“我”的意思;U就是英文里“you”的发音,意思是“你”。连起来就是“我爱你”、“我喜欢你”、“我喜欢你的作品”。这就是这个表情的意思。抖音卡点视频如何制作?卡点的重点在于视频画面与音乐要对应起来,因此…

ahua抖音教程_抖音阿华ahua

抖音怎么制作1、手机打开剪映,然后点击开始创作,选择要剪辑的视频。2、打开视频后,点击左下角的“剪辑”,就可以把不要的部分删除。3、还可以设置视频变速,调整音量,添加音乐等等。4、编辑好视频后,点击右上角的导出,然后上传抖音即可。最好是自己拍的原创作品,有内容…

ahua抖音教程_抖音ahua同类型博主

抖音里抱着宝宝变天使的视频怎么做的?1、先打开手机上的抖音短视2113频,拍摄一段小视频,作为主体视频,然后截取其中的最后一张照片保存到手机。2、打开手机上的美易,点击界面中部的【+】号,然后5261导入刚刚截取好的照片。3、导入了照片后,点击【贴纸4102】,4、在贴纸效…

ae风景教程抖音_抖音ae视频特效制作教程

如何用ae做出通过镜子看到的景象与现实相异的效果?你好,很高兴回答你的问题,这个不用使用滤镜就可以实现的,把你的图层ctrl+d复制一层,然后调整下面一层的透明度,降低一些,然后调出缩放属性,将前面的约束去掉,将x轴的缩放改成负数就可以了,希望能对你有帮助!你好!没…

ae软件抖音换天空教程

如何将一张相的纯白色天空利用软件变成蓝天白云?PS(Photoshop)抖音飞天特效咋弄的?手机上安装 特效行者 软件 拍摄一段飞天动作视频 准备好飞天背影视频方法/步骤手机上安装 特效行者 ,打开软件。把准备好的飞天背影,倒进软件。把准备好的飞天动作的视频倒进软件。调整小…

ae视频教程抖音特效_抖音怎么发特效图片视频教程

抖音上很火的特效视频是怎么制作的,其实方法第一步:打开激萌相机(可以去安卓市场下载)第二步:点击「编辑」,进入导入素材界面第三步:导入视频素材,注意必须为竖屏的素材若是横屏,则出来的水晶球是椭圆形的第4步:选择贴纸功能第五步:点击「创意」,然后在其中找出「小…

ae教程抖音风_抖音ae视频特效制作教程

AE动画实例教程:AE怎么制作刮风效果的动画文字层,点开下面的属性设置小三角,右边有个动画按钮,点击然后选择一个动画属性,再设置关键帧动画就行了虽然我很聪明,但这么说真的难到我了AE如何制作这种带音频谱和歌词跟随,还有这种转动的图片呢?真心请教大神。acv是一种音频…

ae抖音磨皮插件使用教程

磨皮插件怎么用?没选好范围。你用选择工具选好之后再打开滤镜AE磨皮怎么做。求师傅带。网上的视频看不懂,没有解决我的问题,求好心人指点--不管PS还是AE原理都是相同的-----模糊,模糊是消除噪点的秘密武器区别是PS可以对人脸做一个选区,而视频的话,对一秒24帧的动态图像做…

ae抖音特效教程视频_ae简单特效教程

抖音上很火的特效视频是怎么制作的,其实方法第一步:打开激萌相机(可以去安卓市场下载)第二步:点击「编辑」,进入导入素材界面第三步:导入视频素材,注意必须为竖屏的素材若是横屏,则出来的水晶球是椭圆形的第4步:选择贴纸功能第五步:点击「创意」,然后在其中找出「小…

ae抖音横屏教程

抖音左边有个横屏看怎么弄的?具体方法如下:1、抖音视频设定成横屏在拍摄的时候是不可以的,我们先把视频在发布界面中保存到相册中。2、接下来再次打开抖音的视频播放,然后点击底部的【+】按钮。3、点击后会打开的是录制界面,点击右下角的【上传】选项。4、这样就会打开我们…

ae抖音案例教程_ae数字影视合成案例教程

抖音上很火的那种只有文字滑动的视频是怎么做的啊?AE吗?专业的可以用AE,PR之类的。没有视频制作基础的,建议使用微信小程序“说视”来制作,语音转视频可以自动生成抖音上那种文字滑动的视频。歌名:russ - psycho 。网易云跟虾米都可以找到。哈哈,楼主记得采纳额哟 好多…

ae抖音替代天空教程

403 Forbidden403 Forbidden抖音会飞的视频是怎样拍摄的?手机一键更换背景天空:首先声明,这种方法很“粗暴简单”,无需设计基础,一键更换!▼ 比如:这张手机拍的“天空|风筝”▼ 在原图基础上手机一键改变N种天空特效1-云清风淡的天空:2-晚霞似火的天空:3-雨后彩虹…

ae抖音文字教程_ae积雪文字教程

【急】AE怎么做出这种文字效果AE中打好字后,text的下拉属性列表中有个Animate(动画)属性,可以通过调整各个属性(位置、缩放、透明度、倾斜度等等)关键帧达到文字随机出现或者放大缩小及透明度等多种动画的效果,总之这是个大工程,具体方法可以在网上搜索相关如AE文字动画…

ae抖音文字快闪教程_ae文字快闪视频教程

AE立体抖动字幕怎么制作?就像这个视频里面的一样AE自带的字幕效果在效果控制面板,你在里面找一个叫“沸腾”的效果,拖到你的字幕上,就会出现这种抖动的效果。至于立体效果,很有可能是插件,你找找相关插件展开全部这个我不太知道你好!人家带着公司的LOGO,百度下模板下载…

ae抖音文字动画教程_ae文字飞入动画教程

如何用AE快速的制作出文字逐字显现动画打开AE合成软件,新建合成,并命名为“文字动画”。点击文字输入按钮,输入文字“好好学习天天向上”。打开文字属性栏,在动画栏中找到“透明度”,并添加到文字属性中。将透明度降低至零。打开“范围选择器”,在开始处激活关键帧,并在…

ae抖音文字动画教程_ae制作文字动画教程

如何用AE快速的制作出文字逐字显现动画打开AE合成软件,新建合成,并命名为“文字动画”。点击文字输入按钮,输入文字“好好学习天天向上”。打开文字属性栏,在动画栏中找到“透明度”,并添加到文字属性中。将透明度降低至零。打开“范围选择器”,在开始处激活关键帧,并在…