public byte[][] DecodeAudio (Packet packet) { if (packet == null) throw new ArgumentNullException ("packet"); List<byte[]> buffers = new List<byte[]>(); byte[] buffer = new byte[FFmpeg.AVCODEC_MAX_AUDIO_FRAME_SIZE]; int audio_pkt_size = packet.Size; fixed (byte* bptr = buffer) { while (audio_pkt_size > 0) { int data_size = buffer.Length; int len = FFmpeg.avcodec_decode_audio2 (this.context.ptr, (IntPtr)bptr, ref data_size, packet.packet->data, audio_pkt_size); if (len < 0) break; #if !X64 packet.packet->data = new IntPtr (packet.packet->data.ToInt32() + len); #else packet.packet->data = new IntPtr (packet.packet->data.ToInt64() + len); #endif audio_pkt_size -= len; byte[] pcm = new byte[data_size]; Array.Copy (buffer, pcm, data_size); buffers.Add (pcm); } } return buffers.ToArray(); }
public bool ReadPacket (out Packet packet) { packet = null; IntPtr pptr = Marshal.AllocHGlobal (sizeof (AVPacket)); if (FFmpeg.av_read_frame (this.ptr, pptr) < 0) return false; packet = new Packet (pptr, this.streams[((AVPacket*)pptr)->stream_index]); return true; }