2014-07-23 4 views
0

미디어 파일을 읽는 대신 사용자 지정 입력 버퍼에서 읽는 IContainer 개체를 열려고합니다. 이 사용자 정의 입력 버퍼의 구현은 다음과 같습니다.IContainer.open()에서 사용자 ByteChannel을 사용하여 읽을 때 오류가 발생합니다.

컨테이너를 만들고 여는 코드는 다음과 같습니다.

// Open up the container for READING 
mInputCStore = new CStore(); 

IContainerFormat format = IContainerFormat.make(); 
if (format.setInputFormat("flv") < 0) { 
    throw new IllegalArgumentException("Failed to initialize the input format"); 
} 

// Open up the container 
mInputContainer = IContainer.make(); 
int retval = mInputContainer.open(mPlaybackContainerStore, IContainer.Type.READ, format);  
if (retval < 0) { 
    // This little trick converts the non friendly integer return value into 
    // a slightly more friendly object to get a human-readable error name 
    IError error = IError.make(retval); 
    throw new IllegalArgumentException("could not open input container: " + mPlaybackContainerStore + "; Error: " + error.getDescription()); 
} 

그 말을 예외를 던지는 위의 코드는 - 컨테이너에 쓰기가 성공적으로 작동하는 동안

Exception in thread "main" java.lang.IllegalArgumentException: could not open input container: [email protected]; Error: Operation not permitted 

같은 맞춤 버퍼 사용하는 경우. 누군가가 내가 READ 모드에서 그것을 사용하는 한 맞춤 버퍼 구현에서 누락 된 부분을 이해하는 데 도움을 줄 수 있으며 왜 실패 이유가 무엇입니까?

package test; 

import java.io.IOException; 
import java.nio.ByteBuffer; 
import java.nio.channels.ByteChannel; 
import java.util.concurrent.ConcurrentLinkedQueue; 

public class CStore implements ByteChannel { 
    private ConcurrentLinkedQueue<DataChunk> mChunkQueue = null; 
    private int mQueueSize = 0; 

    // constructor 
    public CStore(String type) { 
     mQueueSize = 0; 
     mChunkQueue = new ConcurrentLinkedQueue<DataChunk>(); 
     mChunkQueue.clear(); 
    } 

    @Override 
    public void close() throws IOException { 
     return; 
    } 

    @Override 
    public boolean isOpen() { 
     return false; 
    } 

    @Override 
    public int write(ByteBuffer buffer) throws IOException { 
     DataChunk chunk = new DataChunk(buffer); 
     mChunkQueue.add(chunk); 
     mQueueSize += chunk.getLength(); 
     return 0; 
    } 

    public int read(ByteBuffer buffer) throws IOException { 

     int result = 0; 

     DataChunk chunk = mChunkQueue.poll(); 
     if (chunk != null) { 
      buffer = chunk.getBuffer(); 
      if (buffer != null) { 
       result = 0; 
      } else { 
       result = 1; 
      } 
     } 

     return result; 
    } 
} 
+0

누군가이 문제를 해결할 수 있도록 도와 줄 수 있습니까? 이 접근법이 맞습니까? – AnilJ

답변

0

다음과 같이 read() 메서드를 다시 구현하여이 문제를 해결했습니다. 나는이 함수를 호출하기 전에, 내가 ByteBuffer를 mBuff에 mChunkQueue 변환 오전

public int read(ByteBuffer buffer) { 
    int bytesRead = 0; 

    if (buffer == null) 
     return 0; 

    while (buffer.hasRemaining()) { 
     byte b = mBuff.get(); 
     buffer.put(b); 
     bytesRead++; 
    } 

    return bytesRead; 
} 

참고. 이 클래스/구현을 정리하는 범위는 여전히 있습니다. 그러나 지금은 해결되었습니다.

0

InputStream의 사용자 지정 구현을 읽는 IContainer를 열었습니다. 이렇게하려면 파일에서 읽을 때 일반적으로 자동 감지되는 정보 (예 : 입력 형식, 코덱, 코덱 세부 정보)를 수동으로 설정해야합니다.

// Example input stream (raw audio encoded with mulaw). 
InputStream input = new FileInputStream("/tmp/test.ul"); 

// Manually set the input format. 
IContainerFormat inputFormat = IContainerFormat.make(); 
inputFormat.setInputFormat("mulaw"); 

// Open the container. 
IContainer container = IContainer.make(); 
container.open(input, inputFormat); 

// Initialize the decoder. 
IStreamCoder coder = container.getStream(0).getStreamCoder(); 
coder.setSampleRate(8000); 
coder.setChannels(1); 
coder.open(null, null); 

이제 평소처럼 컨테이너에서 읽을 수 있습니다. [container.readNextPacket (packet)].

+0

나는이 파일 기반 입력 스트림을 가지고 있는데, 여기서 나는 데이터를 읽을 수있다. 내가 뭘하려고하는지는 - 실시간 비디오 스트리밍의 경우를 생각해 보자. 아직이 데이터 스트림이없는 화상 통화. IContainer를 초기화하여 아직 코드에 비디오 스트림이 도착하지 않도록하려고합니다. 나는 그것이 유효하고 정확하다고 추정한다. 이 때문에 container.open() 메서드의 첫 번째 인수로 ByteChannel을 구현하는 CStore 개체를 제공하고 있습니다. 이 시점에서 내 코드가 실패합니다. 그런 다음 실시간으로 비디오 스트림을 수신 할 때 바이트 채널에 쓸 계획입니다. – AnilJ

+0

죄송하지만 바이트 채널을 사용한 적이 없습니다. 그러나 컨테이너를 열기 전에 입력 형식을 정의해야한다고 가정합니다. – 11101101b

+0

안녕하세요, 아무도 전에 이것을 시도 했습니까? 어떤 단서 나 해결책이이 상황에서 크게 도움이 될 것입니다. – AnilJ