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

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

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

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

FFmpeg

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

Q&A

解決済

1回答

3686閲覧

ffmpegで数枚の画像に音声をつけて動画を作成したい

makisg

総合スコア18

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

FFmpeg

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

0グッド

0クリップ

投稿2017/06/16 07:09

編集2017/06/16 08:28

ffmpegを初めて触っています。
「紙芝居ジェネレータ」みたいなものを作ろうとしており、以下のことを実現したいと考えています。

1:画像数枚を用意
2:ナレーション音声ファイルを用意
3:画像が切り替わるタイミングを時間指定して、1つの動画ファイルを生成

例えば、jpeg画像が3枚、ナレーション音声が40秒あったとして、
1枚目の画像:0から12.4秒
2枚目の画像:12.4秒から28.8秒
3枚目の画像:28.8秒から最後(40秒)まで
という指定を行い、指定通りの時間で画像表示しつつナレーションが入る動画をサーバ上で作成したいです。

ffmpegで実現しようとしております。ffmpeg利用時の画質低下について見識が足りず複数回動画を作成したり合成したりすると画質が落ちるのではと考えており、一発のコマンドで上記の動画作成までたどり着けたら良いなと考えています。
しかしながら、複数回の処理に別れるのでも画質低下がないか少なければば良いと思っています。

コマンド一発でうまく作成できる方法があれば、ご教示いただけたら助かります。

現在、例えば画像1つで指定秒数の無音の動画は

bash

1$ ffmpeg -r 1/12.4 -i img1.jpg out1.avi 2ffmpeg version 3.2.4 Copyright (c) 2000-2017 the FFmpeg developers 3 built with Apple LLVM version 8.1.0 (clang-802.0.42) 4 configuration: --prefix=/opt/local --enable-swscale --enable-avfilter --enable-avresample --enable-libmp3lame --enable-libvorbis --enable-libopus --enable-libtheora --enable-libschroedinger --enable-libopenjpeg --enable-libmodplug --enable-libvpx --enable-libsoxr --enable-libspeex --enable-libass --enable-libbluray --enable-lzma --enable-gnutls --enable-fontconfig --enable-libfreetype --enable-libfribidi --disable-libxcb --disable-libxcb-shm --disable-libxcb-xfixes --disable-indev=jack --disable-outdev=xv --enable-audiotoolbox --enable-sdl2 --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/clang --enable-vda --enable-videotoolbox --arch=x86_64 --enable-yasm --enable-libx265 --enable-gpl --enable-postproc --enable-libx264 --enable-libxvid 5 libavutil 55. 34.101 / 55. 34.101 6 libavcodec 57. 64.101 / 57. 64.101 7 libavformat 57. 56.101 / 57. 56.101 8 libavdevice 57. 1.100 / 57. 1.100 9 libavfilter 6. 65.100 / 6. 65.100 10 libavresample 3. 1. 0 / 3. 1. 0 11 libswscale 4. 2.100 / 4. 2.100 12 libswresample 2. 3.100 / 2. 3.100 13 libpostproc 54. 1.100 / 54. 1.100 14Input #0, image2, from 'img1.jpg': 15 Duration: 00:00:00.04, start: 0.000000, bitrate: 37410 kb/s 16 Stream #0:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 1131x707 [SAR 72:72 DAR 1131:707], 25 tbr, 25 tbn, 25 tbc 17[swscaler @ 0x7fb1d700e800] deprecated pixel format used, make sure you did set range correctly 18Output #0, avi, to 'out1.avi': 19 Metadata: 20 ISFT : Lavf57.56.101 21 Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 1131x707 [SAR 1:1 DAR 1131:707], q=2-31, 200 kb/s, 0.08 fps, 0.08 tbn, 0.08 tbc 22 Metadata: 23 encoder : Lavc57.64.101 mpeg4 24 Side data: 25 cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1 26Stream mapping: 27 Stream #0:0 -> #0:0 (mjpeg (native) -> mpeg4 (native)) 28Press [q] to stop, [?] for help 29frame= 1 fps=0.0 q=7.2 Lsize= 65kB time=00:00:12.40 bitrate= 42.9kbits/s speed= 397x 30video:59kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 9.540216% 31

とすると作成できました。
(再生すると12.4秒とシークバーに表示はされますが、最終の手前で再生が終了してしまいます。再生終了の原因は不明です。Macで5Kplayerで再生しています)

2つの動画の合成については、
out1.avi
out2.avi
の2つの動画があったとして、
input.txtに

input.txt

1file /path/to/out1.avi 2file /path/to/out2.avi

という内容を記述した上で、

bash

1$ ffmpeg -f concat -safe 0 -i input.txt -c copy out3.avi

とするとout3.aviで動画が合成されることが確認できました。

音声合成については、

bash

1$ ffmpeg -i out3.avi -i voice.mp3 last.avi

で合成が可能でした。

一発で作成するコマンドがあればそれにしたいなと考えていますが、難しそうなら上記の手順をプログラムで動的に生成するようにして、動画を作ろうかと思います。

ffmpeg以外でもコマンドかプログラムから操作できる方法であれば良いので、違う方法のアドバイスをいただけるのでも助かります。
ご指摘、ご教示いただけることがあれば、是非よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

やはり一度で全部作成するのはできませんでした。
段階を踏んで作成するようにしました。

ありがとうございました。

投稿2017/10/26 08:46

makisg

総合スコア18

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問