【问题标题】:Need get correct AVI Player class to play all AVI video files inside android application需要获得正确的 AVI Player 类来播放 android 应用程序中的所有 AVI 视频文件
【发布时间】:2015-10-22 11:09:31
【问题描述】:

我尝试使用正确的 AVI 视频播放器来播放 AVI 文件,因为我当前的 AVI Player 类看起来不能再正常工作了。

一些 AVI 文件可以正常播放,但其他的不能。

知道哪个 AVI 视频播放器类可以准确播放所有 avi 文件的人,

请帮帮我,

谢谢,

p/s:

我不想让第三个应用程序播放 AVI 文件。

以下代码是我用来播放AVI文件的当前代码:

AVI Player.java 包可运行;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;

import iterface.IVideoSink;

public class VideoPlayer implements Runnable {
private final int FPS = 24;
/**
 * String section
 */
private boolean IS_ALIVE = true;
private long LAST_FRAME_TIME;
/**
 * Data section
 */
private ArrayList<IVideoSink> mAlVideoSinks;
/**
 * Others section
 */
private BufferedInputStream mBufferedInputStream;

public VideoPlayer(String filename) {
    mAlVideoSinks = new ArrayList<IVideoSink>();

    try {
        mBufferedInputStream = new BufferedInputStream(new FileInputStream(filename));
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


}

public void addVideoSink(IVideoSink videoSink) {
    synchronized (mAlVideoSinks) {
        mAlVideoSinks.add(videoSink);
    }
}

public void removeVideoSink(IVideoSink videoSink) {
    synchronized (mAlVideoSinks) {
        if (mAlVideoSinks.contains(videoSink))
            mAlVideoSinks.remove(videoSink);
    }
}

@Override
public void run() {
    int count = 0;

    while (IS_ALIVE) {
        if (LAST_FRAME_TIME == 0) {
            LAST_FRAME_TIME = System.currentTimeMillis();
        }

        try {
            long currentTime = System.currentTimeMillis();
            if (currentTime - LAST_FRAME_TIME < 1000 / FPS) {
                Thread.sleep(1000 / FPS - (currentTime - LAST_FRAME_TIME));
            }
            LAST_FRAME_TIME = System.currentTimeMillis();

            int b0 = mBufferedInputStream.read();
            if (b0 == -1) break;
            int b1 = mBufferedInputStream.read();
            int b2 = mBufferedInputStream.read();
            int b3 = mBufferedInputStream.read();

            count = b0 + (b1 << 8) + (b2 << 16) + (b3 << 24);
            byte[] buffer = new byte[count];
            int readCount = mBufferedInputStream.read(buffer, 0, count);
            for (IVideoSink videoSink : mAlVideoSinks) {
                videoSink.onFrame(buffer, null);
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    try {
        mBufferedInputStream.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    for (IVideoSink videoSink : mAlVideoSinks) {
        videoSink.onVideoEnd();
    }

}

public void stop() {
    IS_ALIVE = false;
}

}

PCM Player.java

package runnable;

import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;

import java.util.ArrayList;

public class PCMPlayer implements Runnable {
/**
 * String section
 */
private boolean IS_ALIVE = true;
/**
 * Data section
 */
private ArrayList<byte[]> mAlBuffers = new ArrayList<byte[]>();
/**
 * Other section
 */
private AudioTrack mAudioTrack;

public PCMPlayer() {
}

@Override
public void run() {
    int bufSize = AudioTrack.getMinBufferSize(8000,
            AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT);
    mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
            8000,
            AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT,
            bufSize,
            AudioTrack.MODE_STREAM);
    mAudioTrack.play();

    while (IS_ALIVE) {
        byte[] buffer = null;
        boolean dataFlag = true;

        while (dataFlag) {
            synchronized (mAlBuffers) {
                if (mAlBuffers.size() > 0) {
                    buffer = mAlBuffers.remove(0);
                } else {
                    dataFlag = false;
                    break;
                }
            }

            mAudioTrack.write(buffer, 0, buffer.length);
        }

        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    mAudioTrack.stop();
    mAudioTrack.release();
}

public void writePCM(byte[] pcm) {
    synchronized (mAlBuffers) {
        byte[] buffer = new byte[pcm.length];
        System.arraycopy(pcm, 0, buffer, 0, buffer.length);
        mAlBuffers.add(buffer);
    }
}

public void stop() {
    IS_ALIVE = false;
}
}

【问题讨论】:

    标签: java android video android-video-player avi


    【解决方案1】:

    我不知道你的意图。但在你的位置,我会为此使用图书馆。例如jVLC

    问题在于 AVI 只是声音和视频数据的容器,可以由任何编解码器进行编码。声音可以是mp3、ogg等,视频可以是mpeg、divx、xvid等多种版本。

    您不能指望所有 AVI 都包含相同的声音/视频格式。这就是为什么您当前的程序无法播放您的某些 AVI。

    【讨论】:

    • 您的库看起来适合 java 应用程序。我需要的是android应用程序
    • libVLC 也可以在 Android 上使用。它是多平台库。见link
    • 请指导如何与这个 libvlc 集成......我不知道如何使用它。我只看到源代码,功能,...
    • 您必须从 Android 的源代码构建库。您可以将二进制文件链接到您的项目并使用其接口。我在上一篇文章中提供的链接中描述了这些步骤。它有点复杂,因为它是用 C++ 编写的并且使用 Java Native Interface,你必须使用 NDK 和 Linux 来构建库。但我无法为您提供比这更详细的指南。我只会重复那里写的内容,对不起。不幸的是,如果您想播放所有编解码器,就必须为此付出代价。
    猜你喜欢
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 2014-01-14
    • 1970-01-01
    相关资源
    最近更新 更多