ビデオファイルの長さ、サイズなどの基本的な機能を実行するためのライブラリが必要だったので(メタデータやタグから推測しています)、ffmpegを選択しました。有効なビデオ形式は、主に映画ファイルで一般的な形式です。 wmv、wmvhd、avi、mpeg、mpeg-4など。可能であれば、知るために使用する方法を教えてください。 ビデオファイルの長さ。私はLinuxプラットフォームを使用しています。
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);
_
編集:
avformat_find_stream_info(pFormatCtx, NULL)
を追加しましたに電話を追加する必要がありました
avformat_find_stream_info(pFormatCtx,NULL)
後avformat_open_input
mgiucaの答えを得るには。 (コメントできません)
#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で割って秒を取得します。
この関数を使用してその動作:
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)を使用している場合、このビデオの長さが間違っています。