RickBlog

恩返し

CollectionViewのCellで動画を再生(Twitter風)

やりたいこと

CollectionViewのCellに動画を配置し、スクロールした画面中央あたりの動画のみを再生させたい。(Twitterのようなイメージ)

参考にした記事

swift 画面上に表示されているcollectionviewの中心のcellを取得する - Qiita
iOS - 【iOS,Swift】CollectionViewの画面内に表示されているセルの取得方法|teratail
【Swift3】UITableViewで一番下までスクロールしたことを検知する - Qiita

実装方法について

画面中央あたりの動画のみを再生する

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
  print("画面中央より上のcellの動画を止める処理")
  print("画面中央より下のcellの動画を止める処理")
  print("画面中央のcellの動画を再生する処理")

}

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
        guard let cell = cell else {
            return
        }

        let center = self.view.convert(collectionView.center, to: collectionView)
        guard let index = collectionView.indexPathForItem(at: center) else { 
            return 
        }
        
        if let beforCell = collectionView.cellForItem(at: [0,index.row - 1]) {
            beforCell.pause()
        }
        
        if let afterCell = collectionView.cellForItem(at: [0,index.row + 1]) {
            afterCell.pause()
        }
        
        if let centerCell = collectionView.cellForItem(at: index) {
            centerCell.play()
        }

}

画面の一番下にスクロールしたときの処理

func scrollViewDidScroll(_ scrollView: UIScrollView) {
  if collectionView.contentOffset.y + collectionView.frame.size.height > collectionView.contentSize.height && collectionView.isDragging {
    print("画面中央より上のcellの動画を止める処理")
    print("画面中央のcellの動画を再生する処理")
  }
}

画面の一番上にスクロールしたときの処理

func scrollViewDidScroll(_ scrollView: UIScrollView) {
  if videoCollectionView.contentOffset.y < 0 && videoCollectionView.isDragging {
    print("画面中央より下のcellの動画を止める処理")
    print("画面中央のcellの動画を再生する処理")
  }
}

画面の最上部をタップし、画面が1番上に戻ったときの処理

func scrollViewDidScroll(_ scrollView: UIScrollView) {
  if videoCollectionView.contentOffset.y == 0 {
    print("画面中央より下のcellの動画を止める処理")
    print("画面中央のcellの動画を再生する処理")
  }
}

streamio-ffmpegを使ったRailsAPIをGAEでデプロイ(2)[Ruby][GCP][Docker]

以下の記事で書いたDockefileを使っていたのだが、エラーが出るようになった。
streamio-ffmpegを使ったRailsAPIをGAEでデプロイ[Ruby][GCP][Docker] - RickBlog

エラー内容

E: Package 'libav-tools' has no installation candidate

解決法

libav-toolsをffmpegに変更

何のゲームか認識したい[Google Cloud AutoML Vision]

やりたいこと

ゲーム動画のサムネから何のゲームなのかを認識したい

使った技術

cloud.google.com

用意した画像

・学習用の画像 150枚(apex:58,cod:49,fortnite:21,pubg:22)
・予測用の画像 4枚

f:id:rickbox:20190608122612p:plain

結果

apexの画像なので正解
f:id:rickbox:20190608122441p:plain

apexの画像なので正解 f:id:rickbox:20190608122343p:plain fortniteの画像なので正解 f:id:rickbox:20190608122507p:plain fortniteの画像なので不正解 f:id:rickbox:20190608122556p:plain

まとめ

学習用の画像も予測用の画像も少なすぎるのでこのような結果になったと思う、、
とてつもなく簡単な操作でこのようなことができるのすごすぎ😐

streamio-ffmpegを使ったRailsAPIをGAEでデプロイ[Ruby][GCP][Docker]

streamio-ffmpeg(gem)を使ったRailsAPIを、Google App Engineでデプロイしようとしたら以下のエラーが発生した。

Errno::ENOENT (No such file or directory - the ffprobe binary could not be found in /app/vendor/bundle/ruby/2.6.0/bin:/opt/rbenv/versions/2.6.3/bin:/opt/rbenv/libexec:/opt/rbenv/plugins/ruby-build/bin:/opt/nodejs/bin:/opt/rbenv/shims:/opt/rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin):

Dockerを使ってffmpegをインストールする必要があるらしい。 qiita.com

いろいろと試行錯誤してうまくいったDockerfileがこちら。

FROM ruby:2.6.3

WORKDIR /app
COPY . /app

ENV RACK_ENV=production \
  RAILS_ENV=production

EXPOSE 8080
ENV PORT=8080

RUN apt-get update && \
  DEBIAN_FRONTEND=noninteractive \
  apt-get install -y \
  libav-tools gpac \
  && \
  apt-get clean && \
  rm -rf /var/lib/apt/lists/

RUN bundle install

CMD bundle exec rackup --port $PORT

mp4をFFmpegでHLS(m3u8,ts)に変換[Ruby]

mp4をffmpegを使ってm3u8とtsファイルに変換する方法はこちらの記事を参考にした。

https://qiita.com/korsmic/items/fac1d737f48aabb1294fqiita.com

Rubyを使って変換したい場合はstreamio-ffmpegというgemを使う。 https://github.com/streamio/streamio-ffmpeg

optionsを以下のようにするとmp4をm3u8とtsファイルに変換できる。

options = { custom: ["-codec", "copy", "-map", "0", "-f", "segment", "-vbsf", "h264_mp4toannexb", "-segment_format", "mpegts", "-segment_time", "4", "-segment_list", "[output file path]", " [output file name] -%03d.ts" ]}

基本情報技術者試験 合格した

受かった!

勉強は過去問を解きまくった。 このサイトを使って。 www.fe-siken.com

来年からは午後問題の形式が変わるっぽい。

次は応用か情報セキュリティかなー。