single.php

ffmpegの変換時に[Could not find codec parameters for stream 0 (Video: png, none)]が表示される(その3)

先回、途中で諦めかけていたEXTM3U形式(拡張子 .m3u8)を利用して動画変換をしていた時に[Could not find codec parameters for stream 0 (Video: png, none): unspecified size Consider increasing the value for the ‘analyzeduration’ (0) and ‘probesize’ (5000000) options]が表示された場合の解決できたので備忘録的に投稿しておきます。

前回までの内容は、別記事をご覧ください。

Could not find codec parameters for stream 0 (Video: png, none)

[FFmpeg]で「EXTM3U」形式のファイルを利用して動画ファイルを作成する場合に次のような[Could not find codec parameters for stream 0 (Video: png, none): unspecified size Consider increasing the value for the ‘analyzeduration’ (0) and ‘probesize’ (5000000) options]エラーが発生しました。

/bin/ffmpeg -protocol_whitelist file,http,https,tcp,tls -i "H:\Users\...\Downloads\test.m3u8" -c copy "H:\Users\...\Downloads\test.mp4"

詳しい内容は別記事をご覧ください。

偽装のTSファイル

先回「EXTM3U」形式の内容を読み取って、扱いやすいように事前にダウンロードしてファイルをバイナリエディタで確認して1つ発見がありました。

ファイルのヘッダー情報には、PNG形式を表す[59 50 4E 47]が並んでいて、FFmpegは、拡張子ではなくヘッダーの応じてコーデックを選択しているようです。

しかし、メディアプレイヤーで再生すると動画が再生される。

「何なんでしょう、このファイル…」で先回は終わっていたのですが、複数のファイルをバイナリエディターで確認していると、1つ発見がありました。

先頭から581バイト目までは固定値が始まっており、582バイト目は[0x47]になっています。

調べてみると、[0x47]で始まるファイルは[.ts]形式の動画ファイルなので、どうやら本来、TS形式のファイル先頭にPNG形式が追加されたファイルのようです。

PNG部分を除去

ここまで分かれば、やることは1つ。先頭の581バイトを除去して、TS形式のファイルとして再保存します。

先回と同様にPythonでスクリプトを作成。

import os

dir_path = '[ファイルの保存場所]'

for f in os.listdir(dir_path):
    fname = os.path.splitext(f)[0]
    srcf = open(dir_path + fname + '.mp4', 'rb') #読み込み対象
    distf = open(dir_path + fname + '.ts', 'wb') #書き込み対象

    # 0x47 の位置まで移動
    srcf.seek(581)

    data = srcf.read()  #全読み込み
    distf.write(data)   #全書き込み

    srcf.close()
    distf.close()

読み込み位置を固定値にしていますが、1回しか使わないのでご愛敬。

実行して、先頭から581バイトを除去したファイルが新しく作成されます。

エクスプローラーでプレビューもされるようになったので、TS形式で間違いないと推察されます。

あとは「EXTM3U」のファイル拡張子を “.mp4” から “.ts” に置換してFFmpegのコマンドを実行させると、あっさり1つの “.mp4” に繋げることができました。

今回の場合は、「EXTM3U」で指定されたURLから配信されるストリームの先頭に、PNGの形式が追加しているようです。

まとめ

今回はEXTM3U形式(拡張子 .m3u8)を利用して動画変換をしていた時に[Could not find codec parameters for stream 0 (Video: png, none): unspecified size Consider increasing the value for the ‘analyzeduration’ (0) and ‘probesize’ (5000000) options]が表示された場合の理由について、続きを書きました。

m3u8形式のファイルのURLで読み込まれるファイルをダウンロードして調べてみると、PNG形式の画像ファイルと、TS形式の動画ファイルを1つにまとめたファイルでした。

そのため、ファイルのヘッダー情報からFFmpegが、PNGだと判定してコーデックで解析をしても、実際にはTSファイルの余分な部分が追加されているのでエラーになっていると考えらます。

先頭部分を除去して再保存することで、エラーを解決することが出来ました。

EXTM3U形式から[FFmpeg]で変換する場合にエラーが発生する人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です