android上的视频处理,如何将MPEG4数据写入MP4文件?

gua*_*lin 5 containers android video-processing mpeg-4

如何将 MPEG4 数据写入(包装)到 android 中的 MP4 文件中?

我正在 android 平台上进行某种视频处理,但我不知道如何将处理后的数据(以某种标准编码,如 MPEG4)写回像 mp4 这样的视频文件。我认为最好使用 API 来执行此操作,但是我找不到所需的 API。

有没有人有任何想法?

kar*_*lip 1

OpenCV可能有点难以胜任这项工作,但我想不出还有什么更简单的方法。OpenCV 是一个计算机视觉库,提供 C、C++ 和 Python 的 API。

由于您使用的是 Android,因此您必须下载名为JavaCV的 OpenCV Java 包装器,它是第 3 方 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);        
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:OpenCV 中的帧按BGR顺序存储像素。