国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

HarmonyOS 實(shí)戰(zhàn)開發(fā)案例-仿抖音短視頻應(yīng)用

這篇具有很好參考價(jià)值的文章主要介紹了HarmonyOS 實(shí)戰(zhàn)開發(fā)案例-仿抖音短視頻應(yīng)用。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前段時(shí)間看到一篇文章,但是沒(méi)有源碼,是一個(gè)仿寫抖音的文章,最近也在看這塊,順便寫個(gè)簡(jiǎn)單的短視頻小應(yīng)用。

技術(shù)點(diǎn)拆分

1、http請(qǐng)求數(shù)據(jù);

2、measure計(jì)算文本寬度;

3、video播放視頻;

4、onTouch上滑/下拉切換視頻;

5、List實(shí)現(xiàn)滾動(dòng)加載;

效果展示

HarmonyOS 實(shí)戰(zhàn)開發(fā)案例-仿抖音短視頻應(yīng)用,鴻蒙,Harmony?OS,OpenHarmony,harmonyos,音視頻,移動(dòng)開發(fā),IT互聯(lián)網(wǎng),實(shí)戰(zhàn)開發(fā),華為

http請(qǐng)求數(shù)據(jù)

通過(guò)對(duì)@ohos.net.http進(jìn)行二次封裝,進(jìn)行數(shù)據(jù)請(qǐng)求。

1、封裝requestHttp;


import http from '@ohos.net.http';

// 1、創(chuàng)建RequestOption.ets 配置類
export interface RequestOptions {
  url?: string;
  method?: RequestMethod; // default is GET
  queryParams ?: Record<string, string>;
  extraData?: string | Object | ArrayBuffer;
  header?: Object; // default is 'content-type': 'application/json'
}

export enum RequestMethod {
  OPTIONS = "OPTIONS",
  GET = "GET",
  HEAD = "HEAD",
  POST = "POST",
  PUT = "PUT",
  DELETE = "DELETE",
  TRACE = "TRACE",
  CONNECT = "CONNECT"
}

/**
 * Http請(qǐng)求器
 */
export class HttpCore {
  /**
   * 發(fā)送請(qǐng)求
   * @param requestOption
   * @returns Promise
   */
  request<T>(requestOption: RequestOptions): Promise<T> {
    return new Promise<T>((resolve, reject) => {
      this.sendRequest(requestOption)
        .then((response) => {
          if (typeof response.result !== 'string') {
            reject(new Error('Invalid data type'));

          } else {
            let bean: T = JSON.parse(response.result);
            if (bean) {
              resolve(bean);
            } else {
              reject(new Error('Invalid data type,JSON to T failed'));
            }

          }
        })
        .catch((error) => {
          reject(error);
        });
    });
  }

  private sendRequest(requestOption: RequestOptions): Promise<http.HttpResponse> {
    // 每一個(gè)httpRequest對(duì)應(yīng)一個(gè)HTTP請(qǐng)求任務(wù),不可復(fù)用
    let httpRequest = http.createHttp();

    let resolveFunction, rejectFunction;
    const resultPromise = new Promise<http.HttpResponse>((resolve, reject) => {
      resolveFunction = resolve;
      rejectFunction = reject;
    });

    if (!this.isValidUrl(requestOption.url)) {
      return Promise.reject(new Error('url格式不合法.'));
    }

    let promise = httpRequest.request(this.appendQueryParams(requestOption.url, requestOption.queryParams), {
      method: requestOption.method,
      header: requestOption.header,
      extraData: requestOption.extraData, // 當(dāng)使用POST請(qǐng)求時(shí)此字段用于傳遞內(nèi)容
      expectDataType: http.HttpDataType.STRING // 可選,指定返回?cái)?shù)據(jù)的類型
    });

    promise.then((response) => {
      console.info('Result:' + response.result);
      console.info('code:' + response.responseCode);
      console.info('header:' + JSON.stringify(response.header));

      if (http.ResponseCode.OK !== response.responseCode) {
        throw new Error('http responseCode !=200');
      }
      resolveFunction(response);

    }).catch((err) => {
      rejectFunction(err);
    }).finally(() => {
      // 當(dāng)該請(qǐng)求使用完畢時(shí),調(diào)用destroy方法主動(dòng)銷毀。
      httpRequest.destroy();
    })
    return resultPromise;
  }


  private appendQueryParams(url: string, queryParams: Record<string, string>): string {
    // todo 使用將參數(shù)拼接到url上
    return url;
  }

  private isValidUrl(url: string): boolean {
    //todo 實(shí)現(xiàn)URL格式判斷
    return true;
  }
}

// 實(shí)例化請(qǐng)求器
const httpCore = new HttpCore();


export class HttpManager {
  private static mInstance: HttpManager;

  // 防止實(shí)例化
  private constructor() {
  }

  static getInstance(): HttpManager {
    if (!HttpManager.mInstance) {
      HttpManager.mInstance = new HttpManager();
    }
    return HttpManager.mInstance;
  }


  request<T>(option: RequestOptions): Promise<T> {
    return new Promise(async (resolve, reject) => {
      try {
        const data: any = await httpCore.request(option)
        resolve(data)
      } catch (err) {
        reject(err)
      }
    })
  }
}

export default HttpManager;

2、使用requestHttp請(qǐng)求視頻接口;

import httpManager, { RequestMethod } from '../../utils/requestHttp';

measure計(jì)算文本寬度


import httpManager, { RequestMethod } from '../../utils/requestHttp';

@State total: number = 0
@State listData: Array<ResultType> = []
private url: string = "https://api.apiopen.top/api/getHaoKanVideo?size=10";
private page: number = 0

private httpRequest() {
    httpManager.getInstance()
    .request({
      method: RequestMethod.GET,
      url: `${this.url}&page=${this.page}` //公開的API
    })
      .then((res: resultBean) => {
        this.listData = [...this.listData, ...res.result.list];
        this.total = res.result.total;
        this.duration = 0;
        this.rotateAngle = 0;
      })
      .catch((err) => {
        console.error(JSON.stringify(err));
      });
  }

video播放視頻

1、通過(guò)videoController控制視頻的播放和暫停,當(dāng)一個(gè)視頻播放結(jié)束,播放下一個(gè)

import measure from '@ohos.measure'

@State textWidth : number = measure.measureText({
  //要計(jì)算的文本內(nèi)容,必填
  textContent: this.title,
})
  
// this.textWidth可以獲取this.title的寬度

2、Video的一些常用方法

屬性:

名稱 參數(shù)類型 描述
muted boolean 是否靜音。
默認(rèn)值:false
autoPlay boolean 是否自動(dòng)播放。
默認(rèn)值:false
controls boolean 控制視頻播放的控制欄是否顯示。
默認(rèn)值:true
objectFit ImageFit 設(shè)置視頻顯示模式。
默認(rèn)值:Cover
loop boolean 是否單個(gè)視頻循環(huán)播放。
默認(rèn)值:false

事件:

名稱 功能描述
onStart(event:()?=>?void) 播放時(shí)觸發(fā)該事件。
onPause(event:()?=>?void) 暫停時(shí)觸發(fā)該事件。
onFinish(event:()?=>?void) 播放結(jié)束時(shí)觸發(fā)該事件。
onError(event:()?=>?void) 播放失敗時(shí)觸發(fā)該事件。
onPrepared(callback:(event:?{?duration:?number?})?=>?void) 視頻準(zhǔn)備完成時(shí)觸發(fā)該事件。
duration:當(dāng)前視頻的時(shí)長(zhǎng),單位為秒(s)。
onSeeking(callback:(event:?{?time:?number?})?=>?void) 操作進(jìn)度條過(guò)程時(shí)上報(bào)時(shí)間信息。
time:當(dāng)前視頻播放的進(jìn)度,單位為s。
onSeeked(callback:(event:?{?time:?number?})?=>?void) 操作進(jìn)度條完成后,上報(bào)播放時(shí)間信息。
time:當(dāng)前視頻播放的進(jìn)度,單位為s。
onUpdate(callback:(event:?{?time:?number?})?=>?void) 播放進(jìn)度變化時(shí)觸發(fā)該事件。
time:當(dāng)前視頻播放的進(jìn)度,單位為s。
onFullscreenChange(callback:(event:?{?fullscreen:?boolean?})?=>?void) 在全屏播放與非全屏播放狀態(tài)之間切換時(shí)觸發(fā)該事件。
fullscreen:返回值為true表示進(jìn)入全屏播放狀態(tài),為false則表示非全屏播放。

onTouch上滑/下拉切換視頻

通過(guò)手指按壓時(shí),記錄Y的坐標(biāo),移動(dòng)過(guò)程中,如果移動(dòng)大于50,則進(jìn)行上一個(gè)視頻或者下一個(gè)視頻的播放。


private onTouch = ((event) => {
  switch (event.type) {
    case TouchType.Down: // 手指按下
      // 記錄按下的y坐標(biāo)
      this.lastMoveY = event.touches[0].y
      break;
    case TouchType.Up: // 手指按下
      this.offsetY = 0
      this.isDone = false
      break;
    case TouchType.Move: // 手指移動(dòng)
      const offsetY = (event.touches[0].y - this.lastMoveY) * 3;
      let isDownPull = offsetY < -80
      let isUpPull = offsetY > 80
      this.lastMoveY = event.touches[0].y
      if(isUpPull || isDownPull) {
        this.offsetY = offsetY
        this.isDone = true
      }

      console.log('=====offsetY======', this.offsetY, isDownPull, isUpPull)

      if (isDownPull && this.isDone) {
        this.playNext()
      }
      if (isUpPull && this.isDone) {
        this.playNext()
      }
      break;
  }
})

List實(shí)現(xiàn)滾動(dòng)加載

1、由于視頻加載會(huì)比較慢,因此List中僅展示一個(gè)視頻的圖片,點(diǎn)擊播放按鈕即可播放;

2、通過(guò)onScrollIndex監(jiān)聽滾動(dòng)事件,如果當(dāng)前數(shù)據(jù)和滾動(dòng)的index小于3,則進(jìn)行數(shù)據(jù)下一頁(yè)的請(qǐng)求;


List({ scroller: this.scroller, space: 12 }) {
  ForEach(this.listData, (item: ResultType, index: number) => {
    ListItem() {
      Stack({ alignContent: Alignment.TopStart }) {
        Row() {
          Image(item.userPic).width(46).height(46).borderRadius(12).margin({ right: 12 }).padding(6)
          Text(item.title || '標(biāo)題').fontColor(Color.White).width('80%')
        }
        .width('100%')
        .backgroundColor('#000000')
        .opacity(0.6)
        .alignItems(VerticalAlign.Center)
        .zIndex(9)

        Image(item.coverUrl)
          .width('100%')
          .height(320)
          .alt(this.imageDefault)

        Row() {
          Image($rawfile('play.png')).width(60).height(60)
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .alignItems(VerticalAlign.Center)
        .opacity(0.8)
        .zIndex(100)
        .onClick(() => {
          this.currentPlayIndex = index;
          this.coverUrl = item.coverUrl;
          this.playUrl = item.playUrl;
          this.videoController.start()
        })
      }
      .width('100%')
      .height(320)
    }
  })
}
.divider({ strokeWidth: 1, color: 'rgb(247,247,247)', startMargin: 60, endMargin: 0 })
.onScrollIndex((start, end) => {
  console.log('============>', start, end)
  if(this.listData.length - end < 3) {
    this.page = this.page++
    this.httpRequest()
  }
})

完整代碼


import httpManager, { RequestMethod } from '../../utils/requestHttp';
import measure from '@ohos.measure'
import router from '@ohos.router';

type ResultType = {
  id: number;
  title: string;
  userName: string;
  userPic: string;
  coverUrl: string;
  playUrl: string;
  duration: string;
}

interface resultBean {
  code: number,
  message: string,
  result: {
    total: number,
    list: Array<ResultType>
  },
}

@Entry
@Component
export struct VideoPlay {
  scroller: Scroller = new Scroller()
  private videoController: VideoController = new VideoController()
  @State total: number = 0
  @State listData: Array<ResultType> = []
  private url: string = "https://api.apiopen.top/api/getHaoKanVideo?size=10";
  private page: number = 0

  private httpRequest() {
    httpManager.getInstance()
    .request({
      method: RequestMethod.GET,
      url: `${this.url}&page=${this.page}` //公開的API
    })
      .then((res: resultBean) => {
        this.listData = [...this.listData, ...res.result.list];
        this.total = res.result.total;
        this.duration = 0;
        this.rotateAngle = 0;
      })
      .catch((err) => {
        console.error(JSON.stringify(err));
      });
  }

  aboutToAppear() {
    this.httpRequest()
  }

  @State currentPlayIndex: number = 0
  @State playUrl: string = ''
  @State coverUrl: string = ''
  @State imageDefault: any = $rawfile('noData.svg')

  @State offsetY: number = 0
  private lastMoveY: number = 0

  playNext() {
    const currentItem = this.listData[this.currentPlayIndex + 1]
    this.currentPlayIndex = this.currentPlayIndex + 1;
    this.coverUrl = currentItem?.coverUrl;
    this.playUrl = currentItem?.playUrl;
    this.videoController.start()
    this.scroller.scrollToIndex(this.currentPlayIndex - 1)

    if(this.listData.length - this.currentPlayIndex < 3) {
      this.page = this.page++
      this.httpRequest()
    }
  }

  playPre() {
    const currentItem = this.listData[this.currentPlayIndex - 1]
    this.currentPlayIndex = this.currentPlayIndex +- 1;
    this.coverUrl = currentItem?.coverUrl;
    this.playUrl = currentItem?.playUrl;
    this.videoController.start()
    this.scroller.scrollToIndex(this.currentPlayIndex - 2)
  }

  private title: string = 'Harmony短視頻';
  @State screnWidth: number = 0;
  @State screnHeight: number = 0;
  @State textWidth : number = measure.measureText({
    //要計(jì)算的文本內(nèi)容,必填
    textContent: this.title,
  })
  @State rotateAngle: number = 0;
  @State duration: number = 0;

  private isDone: boolean = false

  @State isPlay: boolean = true

  build() {
    Stack({ alignContent: Alignment.TopEnd }) {
      Row() {
        Stack({ alignContent: Alignment.TopStart }) {
          Button() {
            Image($r('app.media.ic_public_arrow_left')).width(28).height(28).margin({ left: 6, top: 3, bottom: 3 })
          }.margin({ left: 12 }).backgroundColor(Color.Transparent)
          .onClick(() => {
            router.back()
          })
          Text(this.title).fontColor(Color.White).fontSize(18).margin({ top: 6 }).padding({ left: (this.screnWidth - this.textWidth / 3) / 2 })

          Image($r('app.media.ic_public_refresh')).width(18).height(18)
            .margin({ left: this.screnWidth - 42, top: 8 })
            .rotate({ angle: this.rotateAngle })
            .animation({
              duration: this.duration,
              curve: Curve.EaseOut,
              iterations: 1,
              playMode: PlayMode.Normal
            })
            .onClick(() => {
              this.duration = 1200;
              this.rotateAngle = 360;
              this.page = 0;
              this.listData = [];
              this.httpRequest();
            })
        }
      }
      .width('100%')
      .height(60)
      .backgroundColor(Color.Black)
      .alignItems(VerticalAlign.Center)

      if(this.playUrl) {
        Column() {
          Text('')
        }
        .backgroundColor(Color.Black)
        .zIndex(997)
        .width('100%')
        .height('100%')
        if(!this.isPlay) {
          Image($r('app.media.pause')).width(46).height(46)
            .margin({
              right: (this.screnWidth - 32) / 2,
              top: (this.screnHeight - 32) / 2
            })
            .zIndex(1000)
            .onClick(() => {
              this.isPlay = true
              this.videoController.start()
            })
        }

        Image($rawfile('close.png')).width(32).height(32).margin({
          top: 24,
          right: 24
        })
          .zIndex(999)
          .onClick(() => {
            this.videoController.stop()
            this.playUrl = ''
          })
        Video({
          src: this.playUrl,
          previewUri: this.coverUrl,
          controller: this.videoController
        })
          .zIndex(998)
          .width('100%')
          .height('100%')
          .borderRadius(3)
          .controls(false)
          .autoPlay(true)
          .offset({ x: 0, y: `${this.offsetY}px` })
          .onFinish(() => {
            this.playNext()
          })
          .onClick(() => {
            this.isPlay = false
            this.videoController.stop()
          })
          .onTouch((event) => {
            switch (event.type) {
              case TouchType.Down: // 手指按下
                // 記錄按下的y坐標(biāo)
                this.lastMoveY = event.touches[0].y
                break;
              case TouchType.Up: // 手指按下
                this.offsetY = 0
                this.isDone = false
                break;
              case TouchType.Move: // 手指移動(dòng)
                const offsetY = (event.touches[0].y - this.lastMoveY) * 3;
                let isDownPull = offsetY < -80
                let isUpPull = offsetY > 80
                this.lastMoveY = event.touches[0].y
                if(isUpPull || isDownPull) {
                  this.offsetY = offsetY
                  this.isDone = true
                }

                console.log('=====offsetY======', this.offsetY, isDownPull, isUpPull)

                if (isDownPull && this.isDone) {
                  this.playNext()
                }
                if (isUpPull && this.isDone) {
                  this.playNext()
                }
                break;
            }
          })
      }
      List({ scroller: this.scroller, space: 12 }) {
        ForEach(this.listData, (item: ResultType, index: number) => {
          ListItem() {
            Stack({ alignContent: Alignment.TopStart }) {
              Row() {
                Image(item.userPic).width(46).height(46).borderRadius(12).margin({ right: 12 }).padding(6)
                Text(item.title || '標(biāo)題').fontColor(Color.White).width('80%')
              }
              .width('100%')
              .backgroundColor('#000000')
              .opacity(0.6)
              .alignItems(VerticalAlign.Center)
              .zIndex(9)

              Image(item.coverUrl)
                .width('100%')
                .height(320)
                .alt(this.imageDefault)

              Row() {
                Image($rawfile('play.png')).width(60).height(60)
              }
              .width('100%')
              .height('100%')
              .justifyContent(FlexAlign.Center)
              .alignItems(VerticalAlign.Center)
              .opacity(0.8)
              .zIndex(100)
              .onClick(() => {
                this.currentPlayIndex = index;
                this.coverUrl = item.coverUrl;
                this.playUrl = item.playUrl;
                this.videoController.start()
              })
            }
            .width('100%')
            .height(320)
          }
          .padding({
            left: 6,
            right: 6,
            bottom: 6
          })
        })
      }
      .width('100%')
      .margin(6)
      .position({ y: 66 })
      .divider({ strokeWidth: 1, color: 'rgb(247,247,247)', startMargin: 60, endMargin: 0 })
      .onScrollIndex((start, end) => {
        console.log('============>', start, end)
        if(this.listData.length - end < 3) {
          this.page = this.page++
          this.httpRequest()
        }
      })
    }
    .onAreaChange((_oldValue: Area, newValue: Area) => {
      this.screnWidth = newValue.width as number;
      this.screnHeight = newValue.height as number;
    })
  }
}

為了能讓大家更好的學(xué)習(xí)鴻蒙 (OpenHarmony) 開發(fā)技術(shù),這邊特意整理了《鴻蒙 (OpenHarmony)開發(fā)學(xué)習(xí)手冊(cè)》(共計(jì)890頁(yè)),希望對(duì)大家有所幫助:https://qr21.cn/FV7h05

《鴻蒙 (OpenHarmony)開發(fā)學(xué)習(xí)手冊(cè)》

入門必看:https://qr21.cn/FV7h05

  1. 應(yīng)用開發(fā)導(dǎo)讀(ArkTS)
  2. ……

HarmonyOS 實(shí)戰(zhàn)開發(fā)案例-仿抖音短視頻應(yīng)用,鴻蒙,Harmony?OS,OpenHarmony,harmonyos,音視頻,移動(dòng)開發(fā),IT互聯(lián)網(wǎng),實(shí)戰(zhàn)開發(fā),華為

HarmonyOS 概念:https://qr21.cn/FV7h05

  1. 系統(tǒng)定義
  2. 技術(shù)架構(gòu)
  3. 技術(shù)特性
  4. 系統(tǒng)安全

HarmonyOS 實(shí)戰(zhàn)開發(fā)案例-仿抖音短視頻應(yīng)用,鴻蒙,Harmony?OS,OpenHarmony,harmonyos,音視頻,移動(dòng)開發(fā),IT互聯(lián)網(wǎng),實(shí)戰(zhàn)開發(fā),華為

如何快速入門?:https://qr21.cn/FV7h05

  1. 基本概念
  2. 構(gòu)建第一個(gè)ArkTS應(yīng)用
  3. 構(gòu)建第一個(gè)JS應(yīng)用
  4. ……

HarmonyOS 實(shí)戰(zhàn)開發(fā)案例-仿抖音短視頻應(yīng)用,鴻蒙,Harmony?OS,OpenHarmony,harmonyos,音視頻,移動(dòng)開發(fā),IT互聯(lián)網(wǎng),實(shí)戰(zhàn)開發(fā),華為

開發(fā)基礎(chǔ)知識(shí):https://qr21.cn/FV7h05

  1. 應(yīng)用基礎(chǔ)知識(shí)
  2. 配置文件
  3. 應(yīng)用數(shù)據(jù)管理
  4. 應(yīng)用安全管理
  5. 應(yīng)用隱私保護(hù)
  6. 三方應(yīng)用調(diào)用管控機(jī)制
  7. 資源分類與訪問(wèn)
  8. 學(xué)習(xí)ArkTS語(yǔ)言
  9. ……

HarmonyOS 實(shí)戰(zhàn)開發(fā)案例-仿抖音短視頻應(yīng)用,鴻蒙,Harmony?OS,OpenHarmony,harmonyos,音視頻,移動(dòng)開發(fā),IT互聯(lián)網(wǎng),實(shí)戰(zhàn)開發(fā),華為

基于ArkTS 開發(fā):https://qr21.cn/FV7h05

1.Ability開發(fā)
2.UI開發(fā)
3.公共事件與通知
4.窗口管理
5.媒體
6.安全
7.網(wǎng)絡(luò)與鏈接
8.電話服務(wù)
9.數(shù)據(jù)管理
10.后臺(tái)任務(wù)(Background Task)管理
11.設(shè)備管理
12.設(shè)備使用信息統(tǒng)計(jì)
13.DFX
14.國(guó)際化開發(fā)
15.折疊屏系列
16.……

HarmonyOS 實(shí)戰(zhàn)開發(fā)案例-仿抖音短視頻應(yīng)用,鴻蒙,Harmony?OS,OpenHarmony,harmonyos,音視頻,移動(dòng)開發(fā),IT互聯(lián)網(wǎng),實(shí)戰(zhàn)開發(fā),華為文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-836257.html

到了這里,關(guān)于HarmonyOS 實(shí)戰(zhàn)開發(fā)案例-仿抖音短視頻應(yīng)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 仿抖音短視頻小程序APP組件(超高性能)自動(dòng)預(yù)加載-uniapp

    注:組件使用 vue3+typescript 開發(fā) 全局僅渲染 3 個(gè) swiper-item 實(shí)測(cè),不管加載多少數(shù)據(jù)也能絲滑滾動(dòng) 適用于 vue3,vue2 請(qǐng)自行修 自動(dòng)預(yù)加載視頻 首次渲染優(yōu)化 安裝 nodejs: https://nodejs.org/en/ 安裝依賴: npm i 運(yùn)行項(xiàng)目: npm run dev:mp-weixin 構(gòu)建項(xiàng)目資源: npm run build:mp-weixin 打開小程序開發(fā)

    2024年02月09日
    瀏覽(371)
  • uniapp 開發(fā)之仿抖音,上下滑動(dòng)切換視頻、點(diǎn)擊小愛心效果

    uniapp 開發(fā)之仿抖音,上下滑動(dòng)切換視頻、點(diǎn)擊小愛心效果

    效果圖:?? 功能描述: 上下滑動(dòng)視頻,雙擊暫停,然后第一個(gè)視頻再往上滑顯示”已經(jīng)滑到頂了“ 開始代碼: 首先視頻接口使用的公開的視頻測(cè)試接口 開放API-2.0? 官網(wǎng)展示? ? ? ? ? ? ? ? ? ? ??Swagger UI? 接口文檔 一開始編寫如下:? 注解: autoplay=\\\"true\\\" :設(shè)置視頻在

    2024年02月09日
    瀏覽(100)
  • 抖音短視頻seo源碼矩陣系統(tǒng)開發(fā)

    抖音短視頻seo源碼矩陣系統(tǒng)開發(fā)

    抖音SEO源碼矩陣系統(tǒng)開發(fā)是一項(xiàng)專為抖音平臺(tái)設(shè)計(jì)的SEO優(yōu)化系統(tǒng),能夠幫助用戶提升抖音視頻的搜索排名和曝光度。為了確保系統(tǒng)運(yùn)行正常,需要安裝FFmpeg和FFprobe工具。FFmpeg是一個(gè)用于處理多媒體數(shù)據(jù)的開源工具集,而FFprobe則是FFmpeg的一部分,用于分析多媒體文件的信息。

    2024年02月14日
    瀏覽(97)
  • 【Android App】實(shí)戰(zhàn)項(xiàng)目之仿抖音的短視頻分享App(附源碼和演示視頻 超詳細(xì)必看)

    【Android App】實(shí)戰(zhàn)項(xiàng)目之仿抖音的短視頻分享App(附源碼和演示視頻 超詳細(xì)必看)

    需要全部代碼請(qǐng)點(diǎn)贊關(guān)注收藏后評(píng)論區(qū)留言私信~~~ 與傳統(tǒng)的影視行業(yè)相比,誕生于移動(dòng)互聯(lián)網(wǎng)時(shí)代的短視頻是個(gè)全新行業(yè),它制作方便又容易傳播,一出現(xiàn)就成為大街小巷的時(shí)髦潮流。 各行各業(yè)的人們均可通過(guò)短視頻展示自己,短小精悍的視頻片段原來(lái)能夠容納如此豐富的

    2024年02月03日
    瀏覽(93)
  • 抖音短視頻賬號(hào)矩陣seo分發(fā)系統(tǒng)--開發(fā)源代

    抖音短視頻賬號(hào)矩陣seo分發(fā)系統(tǒng)--開發(fā)源代

    ? ? ? ? ?短視頻獲客系統(tǒng)開發(fā)原型支持短視頻智能批量剪輯、短視頻多賬號(hào)管理定時(shí)發(fā)布,短視頻排名查詢及優(yōu)化,智能客服私信回復(fù)等,那么短視頻seo系統(tǒng)開發(fā)時(shí)需要開發(fā)哪些功能呢?今天我就跟大家分享一下我們的開發(fā)思路。 目前我們是開發(fā)了手機(jī)版小程序端和網(wǎng)頁(yè)版

    2024年02月10日
    瀏覽(47)
  • 抖音短視頻矩陣系統(tǒng)源碼開發(fā)搭建技術(shù)開源分享

    抖音短視頻矩陣系統(tǒng)源碼開發(fā)搭建技術(shù)開源分享

    抖音短視頻矩陣系統(tǒng)源碼開發(fā)采用模塊化設(shè)計(jì),包括賬號(hào)分析、營(yíng)銷活動(dòng)、數(shù)據(jù)監(jiān)控、自動(dòng)化管理等功能。通過(guò)綜合分析賬號(hào)數(shù)據(jù),快速發(fā)現(xiàn)賬號(hào)的優(yōu)勢(shì)和不足,并提供全面的營(yíng)銷方案,以提高賬號(hào)曝光率和粉絲數(shù)量。同時(shí),系統(tǒng)還支持多賬號(hào)管理和自動(dòng)化操作,有效降低賬

    2024年02月19日
    瀏覽(26)
  • 抖音短視頻矩陣管理系統(tǒng)源碼開發(fā)部署(開源定制)

    抖音短視頻矩陣管理系統(tǒng)源碼開發(fā)部署(開源定制)

    ? 短視頻矩陣管理系統(tǒng)是專門為企業(yè)號(hào)商家、普通號(hào)商家提供帳號(hào)運(yùn)營(yíng)從流量 到轉(zhuǎn)化成交的一站式服務(wù)方案,具體包含:點(diǎn)贊關(guān)注評(píng)論主動(dòng)私信 ,評(píng)論區(qū)回復(fù),自動(dòng)潛客戶挖掘,矩陣號(hào)營(yíng)銷,自動(dòng)化營(yíng)銷,粉絲 管理等功能,可以幫助企業(yè)或商家快速批量制作高質(zhì)量短視頻,

    2024年02月13日
    瀏覽(23)
  • 抖音短視頻矩陣系統(tǒng)源碼:技術(shù)開發(fā)與實(shí)踐

    抖音短視頻矩陣系統(tǒng)源碼:技術(shù)開發(fā)與實(shí)踐

    一. 短視頻賬號(hào)矩陣管理系統(tǒng)囊括的技術(shù) 1. 開發(fā)必備的開發(fā)文檔說(shuō)明: 二. 技術(shù)文檔分享: 1.底層框架 系統(tǒng)架構(gòu): 2.數(shù)據(jù)庫(kù)接口設(shè)計(jì) 1.1系統(tǒng)架構(gòu): 抖音SEO排名系統(tǒng)主要由以下幾個(gè)模塊組成: 1. 數(shù)據(jù)采集模塊:負(fù)責(zé)采集抖音上的相關(guān)數(shù)據(jù),包括視頻、用戶、話題等。 2. 數(shù)據(jù)

    2024年02月11日
    瀏覽(34)
  • 抖音短視頻seo矩陣系統(tǒng)源碼開發(fā)部署技術(shù)分享

    抖音短視頻seo矩陣系統(tǒng)源碼開發(fā)部署技術(shù)分享

    抖音短視頻的SEO矩陣系統(tǒng)是一個(gè)非常重要的部分,它可以幫助視頻更好地被搜索引擎識(shí)別和推薦。以下是一些關(guān)于開發(fā)和部署抖音短視頻SEO矩陣系統(tǒng)的技術(shù)分享: 研究:在開發(fā)抖音短視頻SEO矩陣系統(tǒng)之前,需要進(jìn)行研究。這包括了解用戶搜索的,以及了解

    2024年02月15日
    瀏覽(24)
  • 抖音短視頻SEO矩陣系統(tǒng)源碼開發(fā)及開發(fā)者思路分享......

    抖音短視頻SEO矩陣系統(tǒng)源碼開發(fā)及開發(fā)者思路分享......

    抖音矩陣號(hào)/抖音短視頻SEO矩陣系統(tǒng)源碼開發(fā)及開發(fā)者思路分享: ? ? ? ? ?短視頻獲客系統(tǒng)支持短視頻智能剪輯、短視頻定時(shí)發(fā)布,短視頻排名查詢及優(yōu)化,智能客服等,那么短視頻seo系統(tǒng)開發(fā)時(shí)需要開發(fā)哪些功能呢?今天我就跟大家分享一下我們的開發(fā)思路。 首先,目前公

    2024年02月11日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包