需要获得正确的AVI Player类来播放Android应用程序内的所有AVI视频文件

时间:2015-10-22 11:09:31

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

我尝试使用正确的AVI视频播放器播放AVI文件,因为我目前的AVI播放器课程看起来不再适用了。

某些AVI文件可以正常播放,但其他AVI文件无法播放。

知道哪个AVI视频播放器类完全播放所有avi文件的人

请帮助我,

谢谢,

p / s:

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

以下代码是我用来播放AVI文件的最新代码:

AVI Player.java     包runnable;

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;
}
}

1 个答案:

答案 0 :(得分:0)

我不知道你的意图。但在你的位置,我会使用一个库。对于考试jVLC

问题是AVI只是声音和视频数据的容器,可以由任何编解码器编码。声音可以是mp3,ogg等等,视频可以是几个版本的mpeg,divx,xvid。

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