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

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

ただいまの
回答率

88.06%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 771

score 36

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

cmd = f'ffmpeg -y -i "{mv_temp_out_path}" -vcodec h264 "{mv_ffmpeg_path}"'
# cmd = f'ffmpeg -y -i "{mv_temp_out_path}" -vcodec h264_nvenc "{mv_ffmpeg_path}"' # gpu
subprocess.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)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kuma_kuma_

    2020/10/02 13: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 19:00

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

    キャンセル

  • u.sayaka0112

    2020/10/03 12:47

    >FFmpegはロバスト性が高いため可能な限り処理継続を試みはしますが、まずは正しい入力データを用意するところにフォーカスすべきかと思いました。
    この可能性もあると考え、cv2 で生成したものではなく既存の動画に対して同じ処理をしても同様のエラーが発生しました。

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

    キャンセル

回答 1

check解決した方法

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る