AndroidでMPEG4データをMP4ファイルに書き込む(ラップする)方法は?
Androidプラットフォームである種のビデオ処理を行っていますが、処理されたデータ(MPEG4などの何らかの標準でエンコードされたもの)をmp4などのビデオファイルに書き戻す方法がわかりません。これを行うには API を使用するのが最善だと思いますが、必要な API が見つかりません。
アイデアを持っている人はいますか?
AndroidでMPEG4データをMP4ファイルに書き込む(ラップする)方法は?
Androidプラットフォームである種のビデオ処理を行っていますが、処理されたデータ(MPEG4などの何らかの標準でエンコードされたもの)をmp4などのビデオファイルに書き戻す方法がわかりません。これを行うには API を使用するのが最善だと思いますが、必要な API が見つかりません。
アイデアを持っている人はいますか?
OpenCVはこの仕事には少し多すぎるかもしれませんが、これ以上簡単なものは思いつきません。OpenCV は、C、C++、および Python 用の API を提供するコンピューター ビジョン ライブラリです。
Android を使用しているため、 JavaCVという名前の OpenCV 用の Java ラッパーをダウンロードする必要があります。これはサードパーティ API です。Windows に OpenCV/JavaCV をインストールし、Netbeans で使用するための手順を記載した小さな投稿を書きましたが、最後に、Android プラットフォームに OpenCV/JavaCV をインストールする方法を示すチュートリアルを検索する必要があります。
これは、入力ビデオを開いてフレームを出力ファイルにコピーする方法を示すC++ の例です。ただし、Android を使用しているため、JavaCV を使用した例の方が優れているため、次のコードは入力ビデオからフレームをコピーし、それを という名前の出力ファイルに書き込みますout.mp4
。
package opencv_videowriter;
import static com.googlecode.javacv.cpp.opencv_core.*;
import static com.googlecode.javacv.cpp.opencv_imgproc.*;
import static com.googlecode.javacv.cpp.opencv_highgui.*;
public class OpenCV_videowriter
{
public static void main(String[] args)
{
CvCapture capture = cvCreateFileCapture("cleanfish47.mp4");
if (capture == null)
{
System.out.println("!!! Failed cvCreateFileCapture");
return;
}
int fourcc_code = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FOURCC);
double fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
int w = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);
int h = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);
CvVideoWriter writer = cvCreateVideoWriter("out.mp4", // filename
fourcc_code, // video codec
fps, // fps
cvSize(w, h), // video dimensions
1); // is colored
if (writer == null)
{
System.out.println("!!! Failed cvCreateVideoWriter");
return;
}
IplImage captured_frame = null;
while (true)
{
// Retrieve frame from the input file
captured_frame = cvQueryFrame(capture);
if (captured_frame == null)
{
System.out.println("!!! Failed cvQueryFrame");
break;
}
// TODO: write code to process the captured frame (if needed)
// Store frame in output file
if (cvWriteFrame(writer, captured_frame) == 0)
{
System.out.println("!!! Failed cvWriteFrame");
break;
}
}
cvReleaseCapture(capture);
cvReleaseVideoWriter(writer);
}
}
注: OpenCV のフレームは、BGRの順序でピクセルを格納します。