AndroidのFFmpegコマンドによるオーディオとビデオの編集と処理

次の記事は、DevYk、著者DevYKからのものです

オーディオおよびビデオエディタ

序文

ビデオ編集、サブタイトルの追加、トリミング、その他の機能処理など、オーディオとビデオを処理したい場合があります。Githubではいくつかの優れたプロジェクトがオープンソースですが、たとえば、このプロジェクトで二次開発を実行したい場合は、このプロジェクトの動的ライブラリは、YUVをエンコードするためにOpenH264に基づいています。現時点では、動的ライブラリがOpenH64ライブラリを統合していない可能性があるため、拡張性のために、基本的にすべての一般的に使用されるライブラリを含むユニバーサルライブラリのセットを作成しました。オーディオおよびビデオ処理ライブラリ。コンパイルする必要はありません。

コンパイルされたヘッダーファイルと動的ライブラリは、プロジェクトのcore / cppディレクトリ(「完全にオープンソース」)で単独で取得できます

前書き

「ビデオおよびオーディオエディタ」は、 主にFFmpeg v4.4-dev + libx264 + freetype + fontconfig + fribidi + openh264 + libfdk-aac + gnutls + speex + libwebp + lame + opus + opencore-amr + httpsおよびその他のライブラリを移植します。 Androidプラットフォームでのオーディオとビデオの編集およびビデオ編集の高速処理フレームワークには、現在、オーディオとビデオの編集、編集、複数のビデオファイルのマージ、サブタイトル、透かし、逆再生などの組み込み機能があり ます。処理のために「FFmpeg」コマンドを渡すこともでき ます。

「組み込み関数の効果を最初に見てみましょう:」

オーディオおよびビデオクリップ:

オーディオとビデオの合成:

オーディオとビデオの編集:

使い方

1.依存関係を追加します

implementation 'com.devyk.ffmpeglib:AVFFmpegCore:1.0.1'

2.関数APIの紹介

「コールバック処理」

public interface ExecuteCallback {
  /**
  *开始处理
  */
    void onStart(Long executionId);
    /**
     * 如果外部传递了当前操作视频的时长,那么返回的是百分比进度,反之返回的是操作视频对应的微妙时长
     *
     * @param v
     */
    void onProgress(float v);
  /**
  *处理成功
  */
    void onSuccess(long executionId);
  /**
  *处理失败
  */
    void onFailure(long executionId, String error);
  /**
  *取消处理
  */
    void onCancel(long executionId);
  /**
  * ffmpeg 执行的 log
  */
    void onFFmpegExecutionMessage(LogMessage logMessage);
}

「AVEditor」

  • クリップ:

AVVideo://開始:開始時間単位秒
//期間:
funクリップを編集する秒数(開始:Float、期間:Float)
AVEditor:
fun exec(
epVideo:AVVideo、 
outputOption:OutputOption、 
executeCallback:ExecuteCallback)

  • 回転:

AVVideo://回転:回転角度(
90、180、270度の回転のみをサポート)// isFlip:
楽しい回転をミラーリングするかどうか(回転:Int、isFlip:ブール値)
AVEditor:
fun exec(
epVideo:AVVideo、 
outputOption:OutputOption、 
executeCallback:ExecuteCallback)

  • 切る:

AVVideo://幅:トリミングの幅
//高さ:トリミングの高さ
// x:xポイントから開始
// y:yポイントから開始funcrop

幅:フロート、 
高さ:フロート、 
x:フロート、y:フロート)
AVEditor:
fun exec(
epVideo:AVVideo、 
outputOption:OutputOption、 
executeCallback:ExecuteCallback)

  • テキスト透かしを追加します。

AVVideo:fun addText(avText:AVText)
AVEditor:
fun exec(
epVideo:AVVideo、 
outputOption:OutputOption、 
executeCallback:ExecuteCallback)

  • 画像の透かしを追加します。

AVVideo:fun addDraw(epDraw:AVDraw)
AVEditor:
fun exec(
epVideo:AVVideo、 
outputOption:OutputOption、 
executeCallback:ExecuteCallback)

  • ビデオマージ:

AVEditor:fun merge(
epVideos:List、 
outputOption:OutputOption、 
executeCallback:ExecuteCallback)

  • 背景音楽を追加する:

AVEditor:
music(
videoin:String、
audioin:String、
output:String、
videoVolume:Float、
audioVolume:Float、
executeCallback:ExecuteCallback

  • オーディオとビデオの分離:

AVEditor:fun demuxer(
inSource:String、outSource:String、 
format:Format、 
executeCallback:ExecuteCallback)

  • プレイバック:

AVEditor:fun reverse(
videoin:String、out:String、 
vr:Boolean、//ビデオが反転されているかどうか
ar:Boolean、//オーディオが反転されているかどうか
executeCallback:ExecuteCallback)

  • 写真へのビデオ:

AVEditor:fun video2pic(
videoin:String、//ビデオ入力ファイル
出力:String、//画像出力パス-ディレクトリ
w:Int、h:Int、//出力画像
レートの幅と高さ:Float、// 1秒あたりのビデオ生成写真の数
executeCallback:ExecuteCallback)

  • ビデオをGifに変換します。

AVEditor:fun video2Gif(
videoin:String、
gifOut:String、
startDuration:Int、
stopDuration:Int、
executeCallback:ExecuteCallback

  • カスタムコマンド:

AVEditor:// cmd:FFmpegコマンド
// duration:ビデオ処理の期間、VideoUitls.getDuration(videoPath
)を介してexecCmd(cmd:String、duration:Long、executeCallback:ExecuteCallback)を楽しむことができます

FFmpegコンパイルのヒント

ijkplayer、RxFFmpegなど、GithubでFFmpegに基づく優れたプロジェクトが見つかることがあります。コンパイル方法がわからず、FFmpegをコンパイルするためにどのノードを開く必要があるかわからないため、これに基づいて二次開発を行いたいと考えています。当時、私は特定のプロジェクトのコンパイルスクリプトを取得し、それらを使用して2次コンパイルを実行したいと考えていました。一般的に言って、一部のプロジェクトはFFmpegスクリプトをコンパイルするためのオープンソースではありません。この時点で、オープンソースプロジェクトの静的または動的ライブラリを取得できます。ここでは、例としてRxFFmpegを取り上げます。コンパイルスクリプトを取得するかどうかを確認できます。

1、先 clone RxFFmpeg

git clone https://github.com/microshow/RxFFmpeg.git

2.librxffmpeg-core.soを関連付けます

そうすることで、FFmpegによってコンパイルされた動的ライブラリである必要があることがわかり、cmakeを介してsoに関連付けられます。

cmake_minimum_required(VERSION 3.4.1)
#JNI 路径
set(FFMpeg_include_PATH ${CMAKE_SOURCE_DIR})
include_directories(${FFMpeg_include_PATH}/include/)
add_library(RxFFmpeg SHARED IMPORTED)
set_target_properties(RxFFmpeg PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/../../../libs/${CMAKE_ANDROID_ARCH_ABI}/librxffmpeg-core.so)
find_library(
        log-lib
        log)
FILE(GLOB JNI_ALL_C ${JNI_PATH}/*.cpp)
add_library(
        ffmpeg-tools
        SHARED
        ${JNI_ALL_C}
)
target_link_libraries(
        ffmpeg-tools
        RxFFmpeg
${log-lib}
)

3. JNI関数を記述し、コンパイルスクリプトを取得します

//
// Created by DevYK on 2020-10-02.
//
#include <android/log.h>
extern "C"
{
#include "libavutil/avutil.h"
}
#include <jni.h>
#define  AV_TAG   "AVLOG"
#define LOGE(format, ...)  __android_log_print(ANDROID_LOG_ERROR, AV_TAG, format, ##__VA_ARGS__)
int JNI_OnLoad(JavaVM *javaVM, void *pVoid) {
    const char *config = avutil_configuration();
    LOGE("FFMPEG VERSION%s \n", av_version_info());
    LOGE("FFMPEG configuration %s \n", avutil_configuration());
    return JNI_VERSION_1_6;
}

次のように、構成ポインタがデバッグを通じて指すメモリ内の情報を表示します。

さて、コンパイル情報を取得したら、それに基づいてプロジェクトのコンパイルを改善できます。それよりも多くの関数でコンパイルできます。冒頭の紹介と同じように、市場で一般的に使用されているC ++ライブラリをいくつか追加しました。基本的に全能に達した。

総括する

プロジェクトアドレス:AVFFmpegLib

ここではコンパイル方法を紹介しません。興味があれば、mobile-ffmpegプロジェクトをご覧ください。また、ここでそれに基づいた二次パッケージ開発も行っています。

参照

  • EpMedia
  • FFmpegの一般的なコマンド
  • mobile-ffmpeg
  • Androidオーディオおよびビデオ編集エクスペリエンスの概要とオープンソースプロジェクトの共有

オーディオやビデオに関連するその他のAndroid学習資料が必要な友達は、[プライベートメッセージ]またはクリックして入手できます

おすすめ

転載: blog.csdn.net/ajsliu1233/article/details/109291630