🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

FFmpeg

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

Q&A

1回答

3430閲覧

ffmpeg-pythonでcodec等を一方の動画にそろえる

horiegom

総合スコア152

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

FFmpeg

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

0グッド

0クリップ

投稿2020/12/02 10:01

ffmpeg-pythonで動画編集をしています。

2種類の動画ファイルをエンコードなしで結合したいと考えています。

動画1は
10秒程度の動画です。

動画2は5分程度の動画群です。

[動画1]と[動画2の任意の1本]を結合する際に
双方のコーデック等が異なる場合はエンコードが必要になるかと思います。

ただ、動画1が短くて1本しかないことから
予め動画1のコーデック等を動画2に揃えて変換しておけば、結合時にはノーエンコードでできると考えました。
(オープニング動画と本編のような関係を想定してもらえればと思います。)

質問はまずこの考え方は正しいでしょうかというのが1点目。

実際にffmpeg-pythonでコードを書いて、動画1のコーデックとサイズを変換したのですが、
微妙にコーデック情報が異なり、ノーエンコードで結合できません。

動画1:変換後
Stream #0:1(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuvj444p(pc), 1920x1080 [SAR 1:1 DAR 16:9], 433 kb/s, 1 fps, 1 tbr, 16384 tbn, 2 tbc (default)

動画2
Stream #1:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), yuv420p(top first), 1920x1080 [SAR 1:1 DAR 16:9], 29.97 fps, 59.94 tbr, 90k tbn, 59.94 tbc

Predictive
yuvj444p(pc)
あたりが違うのはわかるのですが、コーデックとサイズをそろえるだけではだめなのでしょうか?

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

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

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

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

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

yohhoy

2020/12/02 16:44

「結合」とありますが、動画のコンテナ形式は何を想定されていますか?(もしご存知でなければ;コンテナ形式=MPEG-2 TS/.tsファイル や、MPEG-4/.mp4ファイル という動画コーデックで圧縮された動画データの"入れ物"を指します。)
horiegom

2020/12/03 12:40

コンテナはおぼろ気にしか理解していませんが、動画2は拡張子.MTS(JVCのビデオカメラで録画) 動画1は画像ファイルをffmpegでスライドショー化したものです。 こんな回答でよろしいでしょうか。 結合後の動画のコンテナは特に指定ありません。
guest

回答1

0

予め動画1のコーデック等を動画2に揃えて変換しておけば、結合時にはノーエンコードでできると考えました。
質問はまずこの考え方は正しいでしょうかというのが1点目。

原理的には正しい考え方です。
ただし、実際に再エンコードなしにストリーム結合だけで済ませるには様々な制約条件が課せられます。

実際にffmpeg-pythonでコードを書いて、動画1のコーデックとサイズを変換したのですが、
微妙にコーデック情報が異なり、ノーエンコードで結合できません。
Predictive
yuvj444p(pc)
あたりが違うのはわかるのですが、コーデックとサイズをそろえるだけではだめなのでしょうか?

究極的には、動画ファイルを再生するプレイヤーの能力次第です。多くの動画再生プレイヤでは、動画データの途中で突然コーデックやサイズ情報が切り替わることに対応できません。

動画1
Stream #0:1(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuvj444p(pc), 1920x1080 [SAR 1:1 DAR 16:9], 433 kb/s, 1 fps, 1 tbr, 16384 tbn, 2 tbc (default)
動画2
Stream #1:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), yuv420p(top first), 1920x1080 [SAR 1:1 DAR 16:9], 29.97 fps, 59.94 tbr, 90k tbn, 59.94 tbc

上記の組み合わせで正しく再生するプレイヤーは、相当にロバストでなければなりません(多分存在しないのでは?)
FFmpegの上記ログから読み取れるだけでも、動画1/2で下記が異なっています。

  • H.264コーデックプロファイル(High 4:4:4 Predictive vs. High)
  • 色差サブサンプリング(yuvj444p vs. yuv420p)
  • 映像フレーム/フィールド構造(pc vs. top first)
  • 映像フレームレート(- vs. top 29.97 fps)

投稿2020/12/04 06:47

yohhoy

総合スコア6191

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

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

horiegom

2020/12/05 03:49 編集

ffmpeg-pythonのオプションで http://mobilehackerz.jp/archive/wiki/index.php?%BA%C7%BF%B7ffmpeg%A4%CE%A5%AA%A5%D7%A5%B7%A5%E7%A5%F3%A4%DE%A4%C8%A4%E1 output_stream = ffmpeg.output(output_stream, save_path ,vcodec='h264', vprofile='high', pix_fmt='yuv420p', top=1, r=29.97) と指定することで、多少近づきましたが、まだffmpeg上でノーエンコード結合はできてません。 Stream #0:1(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 319 kb/s, 29.97 fps, 29.97 tbr, 11988 tbn, 59.94 tbc (default) Stream #1:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), yuv420p(top first), 1920x1080 [SAR 1:1 DAR 16:9], 29.97 fps, 59.94 tbr, 90k tbn, 59.94 tbc 今回はプレイヤーでの再生は問題にしておらず、まずはffmpeg-python(0.2.0)上でノーエンコード(vcodec='copy)で結合することを目標としています。 あとはavc1, HDMVの違いとtbr,tbn,tbc?が問題でしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問