web-dev-qa-db-ja.com

libavcodec / ffmpegを使用してビデオファイルの長さを見つける方法

ビデオファイルの長さ、サイズなどの基本的な機能を実行するためのライブラリが必要だったので(メタデータやタグから推測しています)、ffmpegを選択しました。有効なビデオ形式は、主に映画ファイルで一般的な形式です。 wmv、wmvhd、avi、mpeg、mpeg-4など。可能であれば、知るために使用する方法を教えてください。 ビデオファイルの長さ。私はLinuxプラットフォームを使用しています。

17
Kunal Vyas

libavcodecはプログラミングが非常に難しく、ドキュメントを見つけるのも難しいので、あなたの苦痛を感じます。 このチュートリアル は良いスタートです。 ここ はメインのAPIドキュメントです。

ビデオファイルをクエリするための主なデータ構造は AVFormatContext です。チュートリアルでは、_av_open_input_file_を使用して最初に開きます。そのドキュメントでは、非推奨であると記載されているため、代わりに avformat_open_input を使用する必要があります。

そこから、AVFormatContextからプロパティを読み取ることができます:duration秒単位(ドキュメントを参照)、_file_size_バイト単位、_bit_rate_など。

したがって、まとめると次のようになります。

_AVFormatContext* pFormatCtx = avformat_alloc_context();
avformat_open_input(&pFormatCtx, filename, NULL, NULL);
int64_t duration = pFormatCtx->duration;
// etc
avformat_close_input(&pFormatCtx);
avformat_free_context(pFormatCtx);
_

MPEGのようにヘッダーのないファイル形式の場合、パケットから情報を読み取るために_avformat_open_input_の後に次の行を追加する必要がある場合があります(これは遅い場合があります)。

_avformat_find_stream_info(pFormatCtx, NULL);
_

編集

  • コード例にpFormatCtxの割り当てと割り当て解除を追加しました。
  • MPEGなどのヘッダーを持たないビデオタイプで動作するようにavformat_find_stream_info(pFormatCtx, NULL)を追加しました
35
mgiuca

に電話を追加する必要がありました

avformat_find_stream_info(pFormatCtx,NULL)

avformat_open_inputmgiucaの答えを得るには。 (コメントできません)

#include <libavformat/avformat.h>
...
av_register_all();
AVFormatContext* pFormatCtx = avformat_alloc_context();
avformat_open_input(&pFormatCtx, filename, NULL, NULL);
avformat_find_stream_info(pFormatCtx,NULL)
int64_t duration = pFormatCtx->duration;
// etc
avformat_close_input(&pFormatCtx);
avformat_free_context(pFormatCtx);

継続時間はuSecondsで、AV_TIME_BASEで割って秒を取得します。

13
seeseac

この関数を使用してその動作:

extern "C"
JNIEXPORT jint JNICALL
Java_com_ffmpegjni_videoprocessinglibrary_VideoProcessing_getDuration(JNIEnv *env,
                                                                      jobject instance,
                                                                      jstring input_) {
    av_register_all();
    AVFormatContext *pFormatCtx = NULL;
    if (avformat_open_input(&pFormatCtx, jStr2str(env, input_), NULL, NULL) < 0) {
        throwException(env, "Could not open input file");
        return 0;
    }


    if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {
        throwException(env, "Failed to retrieve input stream information");
        return 0;
    }

    int64_t duration = pFormatCtx->duration;

    avformat_close_input(&pFormatCtx);
    avformat_free_context(pFormatCtx);
    return (jint) (duration / AV_TIME_BASE);
}

(jint)(duration/AV_TIME_BASE)を使用している場合、このビデオの長さが間違っています。

0
axita.savani