当前位置:操作系统 > 安卓/Android >>

Android本地视频播放器开发--ffmpeg解码视频文件中的音频

[cpp]
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
 
#include <assert.h>  
#include <android/log.h>  
 
// for native audio  
#include <SLES/OpenSLES.h>  
#include <SLES/OpenSLES_Android.h>  
 
#include "VideoPlayerDecode.h"  
#include "../ffmpeg/libavutil/avutil.h"  
#include "../ffmpeg/libavcodec/avcodec.h"  
#include "../ffmpeg/libavformat/avformat.h"  
 
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "graduation", __VA_ARGS__))  
 
AVFormatContext *pFormatCtx = NULL; 
int             audioStream, delay_time, videoFlag = 0; 
AVCodecContext  *aCodecCtx; 
AVCodec         *aCodec; 
AVFrame         *aFrame; 
AVPacket        packet; 
int  frameFinished = 0; 
 
// engine interfaces  
static SLObjectItf engineObject = NULL; 
static SLEngineItf engineEngine; 
 
// output mix interfaces  
static SLObjectItf outputMixObject = NULL; 
static SLEnvironmentalReverbItf outputMixEnvironmentalReverb = NULL; 
 
// buffer queue player interfaces  
static SLObjectItf bqPlayerObject = NULL; 
static SLPlayItf bqPlayerPlay; 
static SLAndroidSimpleBufferQueueItf bqPlayerBufferQueue; 
static SLEffectSendItf bqPlayerEffectSend; 
static SLMuteSoloItf bqPlayerMuteSolo; 
static SLVolumeItf bqPlayerVolume; 
 
// aux effect on the output mix, used by the buffer queue player  
static const SLEnvironmentalReverbSettings reverbSettings = 
    SL_I3DL2_ENVIRONMENT_PRESET_STONECORRIDOR; 
 
// file descriptor player interfaces  
static SLObjectItf fdPlayerObject = NULL; 
static SLPlayItf fdPlayerPlay; 
static SLSeekItf fdPlayerSeek; 
static SLMuteSoloItf fdPlayerMuteSolo; 
static SLVolumeItf fdPlayerVolume; 
 
// pointer and size of the next player buffer to enqueue, and number of remaining buffers  
static short *nextBuffer; 
static unsigned nextSize; 
static int nextCount; 
 
// this callback handler is called every time a buffer finishes playing  
void bqPlayerCallback(SLAndroidSimpleBufferQueueItf bq, void *context) 

    assert(bq == bqPlayerBufferQueue); 
    assert(NULL == context); 
    // for streaming playback, replace this test by logic to find and fill the next buffer  
    if (--nextCount > 0 && NULL != nextBuffer && 0 != nextSize) { 
        SLresult result; 
        // enqueue another buffer  
        result = (*bqPlayerBufferQueue)->Enqueue(bqPlayerBufferQueue, nextBuffer, nextSize); 
        // the most likely other result is SL_RESULT_BUFFER_INSUFFICIENT,  
        // which for this code example would indicate a programming error  
        assert(SL_RESULT_SUCCESS == result); 
    } 

 
 
void createEngine(JNIEnv* env, jclass clazz) 

    SLresult result; 
 
    // create engine  
    result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL); 
    assert(SL_RESULT_SUCCESS == result); 
 
    // realize the engine  
    result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE); 
    assert(SL_RESULT_SUCCESS == result); 
 
    // get the engine interface, which is needed in order to create other objects  
    result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine); 
    assert(SL_RESULT_SUCCESS == result); 
 
    // create output mix, with environmental reverb specified as a non-required interface  
    const SLInterfaceID ids[1] = {SL_IID_ENVIRONMENTALREVERB}; 
    const SLboolean req[1] = {SL_BOOLEAN_FALSE}; 
    result = (*engineEngine)->CreateOutputMix(engineEngine, &outputMixObject, 1, ids, req); 
    assert(SL_RESULT_SUCCESS == result); 
 
    // realize the output mix  
    result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE); 
    assert(SL_RESULT_SUCCESS == result); 
 
    // get the environmental reverb interface  
    // this could fail if the environmental reverb effect is not available,  
    // either because the feature is not present, excessive CPU load, or  
    // the required MODIFY_AUDIO_SETTINGS permission was not requested and granted  
    result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_ENVIRONMENTALREVERB, 
            &outputMixEnvironmentalReverb); 
    if (SL_RESULT_SUCCESS == result) { 
        result = (*outputMixEnvironmentalReverb)->SetEnvironmentalReverbProperties( 
                outputMixEnvironmentalReverb, &reverbSettings); 
    } 
    // ignore unsuccessful result codes for environmental reverb, as it is optional for this example  

 
void createBufferQueueAudioPlayer(JNIEnv* env, jclass clazz, int rate, int channel,int bitsPerSample) 

    SLresult result; 
 
    // configure audio source  
    SLDataLocator_AndroidSimpleBufferQueue loc_bufq = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2}; 
//    SLDataFormat_PCM format_pcm = {SL_DATAFORMAT_PCM, 2, SL_SAMPLINGRATE_16,  
//        SL_PCMSAMPLEFORMAT_FIXED_16, SL_PCMSAMPLEFORMAT_FIXED_16,  
//        SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT, SL_BYTEORDER_LITTLEENDIAN};  
   SLDataFormat_PCM format_pcm; 
   format_pcm.formatType = SL_DATAFORMAT_PCM; 
format_pcm.numChannels = channel; 
format_pcm.samplesPerSec = rate * 1000; 
 format_pcm.bitsPerSample = bitsPerSample;&

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,