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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

FFmpeg

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

Q&A

解決済

1回答

5639閲覧

ffmpeg をデーモン化されたプロセスの中で実行するとエラーが発生する

u.sayaka0112

総合スコア38

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

FFmpeg

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

0グッド

2クリップ

投稿2020/10/01 03:09

編集2020/10/01 04:39

こんにちは。
python ファイル内で ffmpeg(4.3.1) を subprocess.call() 関数を使って実行しています。

python

1cmd = f'ffmpeg -y -i "{mv_temp_out_path}" -vcodec h264 "{mv_ffmpeg_path}"' 2# cmd = f'ffmpeg -y -i "{mv_temp_out_path}" -vcodec h264_nvenc "{mv_ffmpeg_path}"' # gpu 3subprocess.call(cmd, shell=True)

しかし、python ファイルを gunicorn で動作させるとき、-D オプションをつけて動かす(デーモン化)した際、エラーが発生します。-D オプションをつけずに動かすと正常に動作します。gpu が使えてないのかと思い、cpu を使うようにしても同じエラーが発生します。

実行結果は以下の通りです。

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from './Outputs/TempSaveMovie/200703_4_short_5fr_p2(100_20)_r(50_20).mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2mp41 encoder : Lavf58.35.100 Duration: 00:00:06.15, start: 0.000000, bitrate: 10246 kb/s Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 10244 kb/s, 13 fps, 13 tbr, 13312 tbn, 13 tbc (default) Metadata: handler_name : VideoHandler Stream mapping: Stream #0:0 -> #0:0 (mpeg4 (native) -> h264 (h264_nvenc)) Press [q] to stop, [?] for help [mpeg4 @ 0x55cec17c5480] header damaged [mpeg4 @ 0x55cec17c6840] header damaged [mpeg4 @ 0x55cec1855f80] header damaged [mpeg4 @ 0x55cec1866e00] header damaged Output #0, mp4, to './Outputs/MovieOutputs/200703_4_short_5fr_p2(100_20)_r(50_20).mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2mp41 encoder : Lavf58.45.100 Stream #0:0(und): Video: h264 (h264_nvenc) (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=-1--1, 2000 kb/s, 13 fps, 13312 tbn, 13 tbc (default) Metadata: handler_name : VideoHandler encoder : Lavc58.91.100 h264_nvenc Side data: cpb: bitrate max/min/avg: 0/0/2000000 buffer size: 4000000 vbv_delay: N/A Error while decoding stream #0:0: Invalid data found when processing input [mpeg4 @ 0x55cec17c8780] header damaged Error while decoding stream #0:0: Invalid data found when processing input [mpeg4 @ 0x55cec17c5480] header damaged ... ... ... [mpeg4 @ 0x55cec1855f80] header damaged Error while decoding stream #0:0: Invalid data found when processing input [mpeg4 @ 0x55cec1866e00] header damaged Error while decoding stream #0:0: Invalid data found when processing input Last message repeated 3 times frame= 83 fps=0.0 q=14.0 Lsize= 1800kB time=00:00:06.30 bitrate=2337.4kbits/s dup=76 drop=0 speed=18.7x video:1799kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.064613% Conversion failed!

同じエラーを解決した方がいらっしゃれば共有いただけると幸いです。

追記1
エラーは生じていますが、変換自体はされています。しかし、フレームが欠落しています(fps-1だけ欠落している様子)。

追記2

mv_ffmpeg_path = 'xxx.mp4' try: self.__main_detection(filename, mv_original_path, mv_temp_out_path, downward_config, beam_config, interval) except TypeError as e: traceback.print_exc() else: cmd = f'ffmpeg -y -i "{mv_temp_out_path}" -vcodec h264_nvenc "{mv_ffmpeg_path}"' subprocess.call(cmd, shell=True)

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

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

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

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

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

kuma_kuma_

2020/10/01 03:17

inputの記載がないけどローカル上のファイルじゃないんじゃないの?
u.sayaka0112

2020/10/01 03:46

``` ffmpeg -y -i "{mv_temp_out_path}" ... ``` この部分でinput データは指定していて、実際に処理は行われているのですが、出力された動画を確認すると何フレームか落ちているんですよね。。
kuma_kuma_

2020/10/01 03:51

いや「指定されてない」ではなく「inputのファイルがローカルにないのでは?」というお話です。 > 出力された動画を確認すると何フレームか落ちているんですよね。。 これ重要な情報ですよね...追記しておいて下さい。
yohhoy

2020/10/01 03:57

入力ファイルが部分的にデータ破損している旨のエラーが頻発しているようですが、FFmpegへの入力ファイルは直接実行/デーモン化状態で同一(厳密一致)するものを使っているのでしょうか?
u.sayaka0112

2020/10/01 04:18

@kuma_kuma_ さん 失礼いたしました。。確かに変換が実行されているかは重要でした。 @yohhoy さん >FFmpegへの入力ファイルは直接実行/デーモン化状態で同一(厳密一致)するものを使っているのでしょうか? こちらは厳密一致しています。データ破損については、cv2 で書き込みをしたファイルを読み込んでいるため、可能性があるとすれば書き込み途中でプロセスが走っているのかもしれません。(Try, finaly で実行しているのでその可能性は低そうですが)。
kuma_kuma_

2020/10/01 04:24 編集

いや「inputのファイルがローカルにありますか?」の答えが判らないと回答できないですよ 追記 > cv2 で書き込みをしたファイルを ええと「そのファイルはローカルに存在するのですか?」またその情報の記載が無いようですが...
kuma_kuma_

2020/10/01 04:29

うーん。可能性を書きます。 「cv2で書き込みをしている最中からffmpegを実行していませんか?」 「cv2で書き込みをしている場所が悪く読み込みエラーになっていませんか?」 ffmpegは結構デリケートで処理をclone化する事でinputの読み込みに遅れが生じるとエラーになる場合があります。そのような事ありませんか?
yohhoy

2020/10/01 04:36

最後に出力される統計情報「frame=83 ... dup=76」によれば、83フレームを出力したがうち76フレームは複製されたものであると言っています。つまり83-76=7フレームしか違う映像が含まれないようです。これは期待通りの振る舞いなのでしょうか?
kuma_kuma_

2020/10/01 04:41

追記見ましたが「fpsの30と29.97の違い」が落ちじゃないですよね...
u.sayaka0112

2020/10/01 04:42

@kuma_kuma_ >「inputのファイルがローカルにありますか?」 ローカルに存在します。追記したコードでは、try ブロックでcv2 の書き込みを行っており、else ブロックで変換を行っているため確かに存在します。デーモン化していない場合は正しく実行されるので、コードに誤りはなさそうです。 @yohhoy > 最後に出力される統計情報「frame=83 ... dup=76」によれば、83フレームを出力したがうち76フレームは複製されたものであると言っています。つまり83-76=7フレームしか違う映像が含まれないようです。これは期待通りの振る舞いなのでしょうか? これは期待通りの振る舞いではないです。。
u.sayaka0112

2020/10/01 04:50

@kuma_kuma_ フレームが欠落しているというのは語弊がありました。すみません。 >83-76=7フレームしか違う映像が含まれない こちらが正しいです。
kuma_kuma_

2020/10/01 07:43

元々なぜデーモン化されるのですか?非同期化ではだめのですか? プロセス自体をデーモン(複製)するのでffmpegの非同期処理に影響する可能性があります。
u.sayaka0112

2020/10/01 08:10

> 元々なぜデーモン化されるのですか?非同期化ではだめのですか? アップロードされたファイルを処理し、それを圧縮・変換して s3 に送るプログラムを作成して、それをサーバーに常駐プログラムとして起動しておきたいので、デーモン化しようとしています。 > プロセス自体をデーモン(複製)するのでffmpegの非同期処理に影響する可能性があります 処理するプロセスの問題なのかもしれないですね。。
kuma_kuma_

2020/10/02 01:31

ffmpegはマルチに動かすほど非同期処理をおこないます。 なので複数稼働でさえ不安定になる場合もあります。 方法論ですがメインを1つ作りこちらをデーモン化、ffmpegはメインからの非同期実行で動かすのはどうでしょうか?(ただ大丈夫という保証がない。)
u.sayaka0112

2020/10/02 02:42

> 方法論ですがメインを1つ作りこちらをデーモン化、ffmpegはメインからの非同期実行で動かすのはどうでしょうか?(ただ大丈夫という保証がない。) 私もこれを思ってやってみました。「ffmpegはメインからの非同期実行」こちらの部分は、子プロセスを作成するという認識であってますかね?実際、main から子プロセスを使って実行してみましたが同じエラーでした。 ですので、次はdocker を使ってやってみようと思います。
u.sayaka0112

2020/10/02 04:11

> う~ん手ごわいですね…あと思いつくのは https://qiita.com/kodai100/items/f953e92d78f4ae345ee6 osによるコマンドファイル実行ぐらいでしょうか...。 実はこれもやってみましたが、同じエラーでした。 デーモン化されたプロセスから ffmpeg 呼べないんですかね。。
kuma_kuma_

2020/10/02 04:51

私も以前言語が違うのですがffmpeg で苦戦しました。 結局親プロセスから離れた状態で実行できれば安定するんですよね (それで非同期やbatでの実行をどうでしょうと書いたわけです。) Pythonの場合親(実行者)から子(ffmpeg)接続が切れた状態での実行ができないんですよ (それがふつうなんですが...) 私が成功したのは http://jscript.zouri.jp/Source/ApplicationCtrl.html の様に「WSH JScript」の「Run」を途中にかませる方法 今回だと「Python」(callコマンド) → 「WSH JScript」」(Runコマンド) → 「ffmpeg」となります ただやはり確実か?と言われると疑問が付きます。 理由が理由だけにデーモン化はしたいですよね...
yohhoy

2020/10/02 10:00

> データ破損については、cv2 で書き込みをしたファイルを読み込んでいるため、可能性があるとすれば書き込み途中でプロセスが走っているのかもしれません。(Try, finaly で実行しているのでその可能性は低そうですが)。 上記言及で少し気になったのですが、FFmpegへの入力ファイルは同プログラム内で自己生成 → 子FFmpegプロセスに処理させようとしていますか? FFmpegへはMP4形式を入力させているようですが、MP4ファイルはその構造上ファイルを閉じる処理(=データ整合性を取る)が非常に重要なため、この処理がおこなわれていないMP4ファイルを読み込もうとすると「壊れたデータ」に見えます。 FFmpegはロバスト性が高いため可能な限り処理継続を試みはしますが、まずは正しい入力データを用意するところにフォーカスすべきかと思いました。
u.sayaka0112

2020/10/03 03:47

>FFmpegはロバスト性が高いため可能な限り処理継続を試みはしますが、まずは正しい入力データを用意するところにフォーカスすべきかと思いました。 この可能性もあると考え、cv2 で生成したものではなく既存の動画に対して同じ処理をしても同様のエラーが発生しました。 最終的にdocker を立ち上げて ffmpeg を使うことで解決できました。 コメントくださり本当にありがとうございました。
guest

回答1

0

自己解決

最終的にdocker を立ち上げて ffmpeg を使うことで解決できました。
コメントくださり本当にありがとうございました。

投稿2020/10/03 03:48

u.sayaka0112

総合スコア38

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問