質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

FFmpeg

FFmpegは、動画と音声を交換できるフリーソフトウェアです。UNIX系OSから派生した、MS-DOSから操作するコマンドラインツールです。libavcodecやlibavformat、libswscale、libavfilterなどを含みます。ライセンスは、コンパイルの際のオプションによりLGPLもしくはGPLに決定されます。対応コーデックや使用できるオプションが多く、幅広く利用されています。

Q&A

解決済

1回答

1163閲覧

Railsでgem 'twitter'を用いて動画を投稿したいが、Not valid videoというエラーが出る。

joru

総合スコア45

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

FFmpeg

FFmpegは、動画と音声を交換できるフリーソフトウェアです。UNIX系OSから派生した、MS-DOSから操作するコマンドラインツールです。libavcodecやlibavformat、libswscale、libavfilterなどを含みます。ライセンスは、コンパイルの際のオプションによりLGPLもしくはGPLに決定されます。対応コーデックや使用できるオプションが多く、幅広く利用されています。

0グッド

0クリップ

投稿2021/06/29 01:54

編集2021/06/29 06:38

ruby

1require 'twitter' 2require 'open-uri' 3require 'streamio-ffmpeg' 4 5twitter_client = Twitter::REST::Client.new do |config| 6 config.consumer_key = ENV['TWITTER_CONSUMER_KEY'] 7 config.consumer_secret = ENV['TWITTER_CONSUMER_SECRET'] 8 config.access_token = ENV['TWITTER_ACCESS_TOKEN'] 9 config.access_token_secret = ENV['TWITTER_ACCESS_SECRET'] 10end 11 12tweet_content = "・・・" 13movie_url = "https:/・・・" 14p local = File.new(open(movie_url)) 15p local.size 16movie = FFMPEG::Movie.new(local.path) 17movie.transcode("tmp/movie.mp4", %w(-t 00:02:00.00 -c copy)) 18p mov = File.new(open("tmp/movie.mp4")) 19p mov.size 20init_request = Twitter::REST::Request.new(twitter_client, :post, "https://upload.twitter.com/1.1/media/upload.json", { command: 'INIT', total_bytes: mov.size, media_type: 'video/mp4', media_category: 'tweet_video' }).perform 21until mov.eof? 22 base64_chunk = Base64.encode64(mov.read(5_000_000)) 23 base64_chunk.delete("\n") 24 seg ||= -1 25 Twitter::REST::Request.new(twitter_client, :post, "https://upload.twitter.com/1.1/media/upload.json", { command: 'APPEND', media_id: init_request[:media_id], media_data: base64_chunk, segment_index: seg += 1, key: :media }).perform 26end 27mov.close 28Twitter::REST::Request.new(twitter_client, :post, "https://upload.twitter.com/1.1/media/upload.json", { command: 'FINALIZE', media_id: init_request[:media_id] }).perform 29twitter_client.update(tweet_content, media_ids: init_request[:media_id])

以上はRailsで、外部サイトのmp4を一時的にローカルに展開して、ffmpegで動画の時間を切り出し(Twitterに投稿する動画は140秒以下という制限があるため。)Twitter gemのINIT、APPEND、FINALIZEにて動画をアップロードし、投稿できるようにmedia_idを取得。
最後にupdateで投稿するというコードです。
しかし、以下のエラーが出てしまいエラーの原因がわかりません。

error

1#<Twitter::Error::BadRequest: Not valid video>
#<File:/var/folders/8s/5mzgwvks1pgg5pcswk0qpbv80000gn/T/open-uri20210629-76193-15yrwh1> 31120633 I, [2021-06-29T10:36:16.440604 #74369] INFO -- : Running transcoding... ["/usr/local/bin/ffmpeg", "-y", "-i", "/var/folders/8s/5mzgwvks1pgg5pcswk0qpbv80000gn/T/open-uri20210629-74369-9k8g4y", "-t", "00:02:00.00", "-c", "copy", "tmp/movie.mp4"] I, [2021-06-29T10:36:16.805879 #74369] INFO -- : Transcoding of /var/folders/8s/5mzgwvks1pgg5pcswk0qpbv80000gn/T/open-uri20210629-74369-9k8g4y to tmp/movie.mp4 succeeded #<File:tmp/movie.mp4> 22951395

とあるので、movie.transcodeまでは成功していそうなので、Twitter gemの周りだとは思うのですが、、、

参考にしたサイト:
rails内でのffmpegの利用
twitter gemのINIT、APPEND、STATUS
140秒動画
ソースコード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

どうやら、FINALIZEしてから一定時間経過しないとツイートに使えないらしく以下のように書き換えたところ成功した

Twitter::REST::Request.new(twitter_client, :post, "https://upload.twitter.com/1.1/media/upload.json", { command: 'FINALIZE', media_id: init_request[:media_id_string] }).perform begin twitter_client.update(tweet_content, media_ids: init_request[:media_id_string]) rescue Twitter::Error::BadRequest sleep 5 retry end

投稿2021/06/30 12:37

joru

総合スコア45

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問