Articles of h.264

使用MediaCodec H264stream媒体

我目前正在尝试将Android用作Skype端点。 在这个阶段,我需要将video编码为H.264(因为它是Skype支持的唯一格式),并使用RTP进行封装,以使stream媒体能够正常工作。 MediaRecorder显然不是很适合这个由于各种原因。 一个是因为它完成后添加MP4或3GP头。 另一个原因是为了将延迟降到最低,硬件加速可能派上用场。 这就是为什么我想利用最近低层次的框架,如MediaCodec , MediaExtractor等 目前,我打算如下工作。 相机将其video写入缓冲区。 MediaCodec使用H264编码video并将结果写入另一个缓冲区。 该缓冲区由RTP封装器读取,该封装器将stream数据发送到服务器。 这是我的第一个问题:这个计划对您来说听起来是否可行? 现在我已经陷入了第一步。 由于互联网上有关使用相机的所有文档都使用MediaRecorder ,所以在编码之前,我找不到将其原始数据存储到缓冲区的方法。 是addCallbackBuffer适合这个? 任何人都有一个例子的链接? 接下来,我找不到很多关于MediaCodec的文档(因为它是相当新的)。 谁有一个坚实的教程? 最后:关于RTP库的任何build议? 提前感谢!

使用android低级别api解码H264stream媒体

我在android中使用MediaCodec低级别的Api解码从IP CAMERA接收到的h264原始数据stream。 来自IP摄像机的原始数据stream,通过TCP / IP连接进行接收。 为了解码stream,我的代码是: @Override protected void onCreate(Bundle savedInstanceState) { MediaCodec mCodecc; MediaFormat mFormat; BufferInfo mInfo; ByteBuffer[] inputBuffers ; ByteBuffer[] outputBuffers ; } protected void Init_Codec() { mCodecc = MediaCodec.createDecoderByType("video/avc"); mFormat = MediaFormat.createVideoFormat("video/avc", width, height); mInfo = new BufferInfo(); mFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar); mCodecc.configure(mFormat, holder.getSurface(), null,0); } protected void Start_Codec() { mCodecc.start(); inputBuffers = mCodecc.getInputBuffers(); outputBuffers […]

通过MP4video向后search时呈现时间戳不正确

我正在使用MediaCodec和MediaExtractor以可变的速率播放video,无论是向前还是向后。 该代码使用类似SpeedControlCallback的东西来build立帧间暂停 – 从输出缓冲区中为其提供presentationTimeUs字段。 99%的时间都可以正常工作,但是三星S6上的AVC编解码器在向后寻找时提供了不正确的显示时间 – 如果这样做有意义的话,它们会被locking在最高价值的任何位置。 缓冲区中的数据是正确的/正在改变 – 它只是不符合固定的显示时间。 S6可以处理avc1品牌/ ftype的MP4文件的avc1 ,但是我试过的其他品牌的H.264video( mp42 , mp42 )不能100%的工作。 相同的文件在三星S5和我尝试过的其他设备上工作正常。 编解码器logging这个: 09-15 11:16:21.611 2992-16618/? W/EXYNOS_VIDEO_DEC﹕ sCurrentTimestamp(6002033) is smaller than latestTimeStamp(7001744), uses latestTimeStamp 在每个向后寻找( SEEK_TO_PREVIOUS_SYNC ),并将提供错误的所有关键帧latestTimestampValue 。 有没有人遇到类似的问题在Galaxy S6的AVC编解码器,或者有能力提供任何(非hacky)的解决scheme?

为什么我得到“不支持格式”的错误,用Android MediaPlayer读取H.264编码的rtspstream?

我试图在Android设备上显示H.264编码的rtspvideo。 该stream来自Raspberry Pi,使用vlc编码/dev/video1 ,这是一个“Pi NoIR摄像机板”。 vlc-wrapper -vvv v4l2:///dev/video1 –v4l2-width $WIDTH –v4l2-height $HEIGHT –v4l2-fps ${FPS}.0 –v4l2-chroma h264 –no-audio –no-osd –sout "#rtp{sdp=rtsp://:8000/pi.sdp}" :demux=h264 > /tmp/vlc-wrapper.log 2>&1 我现在正在使用非常小的Android代码: final MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setDisplay(holder); try { mediaPlayer.setDataSource(url); mediaPlayer.prepare(); 并得到“准备失败:状态= 0x1” IOException 。 当我看到日志,我看到像线 06-02 16:28:05.566 W/APacketSource( 316): Format:video 0 RTP/AVP 96 / MIME-Type:H264/90000 06-02 16:28:05.566 W/MyHandler( 316): […]

在Android的H264编码器?

我试图修复一个简单的video录制应用程序*时遇到了一些问题。 我想我正确地按照步骤顺序。 以下是给我的问题的部分代码的简化。 一旦按下button,该代码仅作为callback执行: if ( mRecorder != null){ mRecorder.reset(); mRecorder.release(); } mRecorder = new MediaRecorder(); if(mViewer.hasSurface){ mRecorder.setPreviewDisplay(mViewer.holder.getSurface()); Log.d(TAG,"Surface has been set"); } try { Log.d(TAG,"Sleeping for 4000 mili"); Thread.sleep(4000); Log.d(TAG,"Waking up"); } catch (InterruptedException e) { Log.e(TAG,"InterruptedException"); e.printStackTrace(); } mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mRecorder.setVideoFrameRate(12); mRecorder.setVideoSize(176, 144); mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); mRecorder.setMaxDuration(MAX_DURATION_TEST); String targetFile = "/sdcard/webcamera/temp.mp4"; File localFile […]

如何在没有MediaExtractor的情况下使用MediaCodec for H264

我需要使用没有MediaExtractor的MediaCodec,我正在使用FileInputStream读取文件。 目前它不工作,它在屏幕上显示一个绿色的混乱的图像。 这是整个源代码: FileInputStream in = new FileInputStream("/sdcard/sample.ts"); String mimeType = "video/avc"; MediaCodec decoder = MediaCodec.createDecoderByType(mimeType); MediaFormat format = MediaFormat.createVideoFormat(mimeType, 1920, 1080); byte[] header_sps = { 0, 0, 0, 1, 103, 100, 0, 40, -84, 52, -59, 1, -32, 17, 31, 120, 11, 80, 16, 16, 31, 0, 0, 3, 3, -23, 0, 0, -22, […]

如何使用MediaCodec将位图编码成video?

我想编码一组位图到h264。 这可能通过MediaEncoder? 我写了一些代码为了做到这一点,但输出不能在我尝试过的任何媒体播放器播放。 以下是我主要从其他在Stackoverflow上find的源代码的一些代码。 mMediaCodec = MediaCodec.createEncoderByType("video/avc"); mMediaFormat = MediaFormat.createVideoFormat("video/avc", 320, 240); mMediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 125000); mMediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15); mMediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar); mMediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5); mMediaCodec.configure(mMediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); mMediaCodec.start(); mInputBuffers = mMediaCodec.getInputBuffers(); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream); // image is the bitmap byte[] input = byteArrayOutputStream.toByteArray(); int inputBufferIndex = mMediaCodec.dequeueInputBuffer(-1); if (inputBufferIndex >= 0) { ByteBuffer […]

MediaCodec和Camera:颜色空间不匹配

我一直在尝试使用H264编码来处理Android平板电脑上使用新的低级别MediaCodec的摄像头捕获的input。 我经历了一些困难,因为MediaCodecAPIlogging不完整,但我终于有了一些工作。 我正在设置相机,如下所示: Camera.Parameters parameters = mCamera.getParameters(); parameters.setPreviewFormat(ImageFormat.YV12); // <1> parameters.setPreviewFpsRange(4000,60000); parameters.setPreviewSize(640, 480); mCamera.setParameters(parameters); 对于编码部分,我正在实例化MediaCodec对象,如下所示: mediaCodec = MediaCodec.createEncoderByType("video/avc"); MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", 640, 480); mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 500000); mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15); mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar); // <2> mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5); mediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); mediaCodec.start(); 最后的目标是创build一个RTPstream(和Skype相对应),但到目前为止,我只是将原始的H264直接传输到我的桌面。 在那里我使用以下GStreamerpipe道来显示结果: gst-launch udpsrc port=5555 ! video/x-h264,width=640,height=480,framerate=15/1 ! ffdec_h264 ! autovideosink 一切运作良好,除了颜色。 我需要在计算机中设置2种颜色格式:一种用于摄像机预览(标有<1> ),另一种用于MediaCodec对象(标有<2> ) 要确定行<1>的可接受值,我使用了parameters.getSupportedPreviewFormats() […]

使用ffmpeg实时解码android的硬件编码H264相机馈送

我正尝试使用Android上的硬件H264编码器来创build摄像头的video,并使用FFmpeg在audio中进行多路复用(所有这些都在Android手机上) 到目前为止,我所完成的工作是将H264video打包成rtsp数据包,并使用VLC(通过UDP )进行解码,因此我知道video至less能正确格式化。 但是,我无法以可以理解的格式将video数据转换为ffmpeg 。 我已经尝试发送相同的rtsp数据包到本地主机上的端口5006(通过UDP),然后提供ffmpeg的sdp文件,告诉它哪个本地端口的videostream进来,如何解码video,如果我明白rtsp正确stream式传输。 然而,这不起作用,我在诊断原因时遇到了麻烦,因为ffmpeg只是在那里等待input。 由于延迟和可扩展性的原因,我不能只是将video和audio发送到服务器,并将其复用到那里,而是必须在电话上以尽可能轻的方式完成。 我想我正在寻找的是如何实现这一点的build议。 最佳解决scheme是将分组化的H264video通过pipe道发送到ffmpeg ,但是我无法发送ffmpeg来解码video所需的sdp文件参数。 我可以根据请求提供更多的信息,比如ffmpeg是如何编译为Android的,但是我怀疑这是必要的。 哦,我开始ffmpeg的方式是通过命令行,我真的宁愿避免与jni混淆,如果这是可能的。 和帮助将不胜感激,谢谢。

使用Android MediaCodec从相机编码H.264

我试图让这个工作在Android 4.1(使用升级的华硕Transformer平板电脑)。 感谢Alex对我以前的问题的回应 ,我已经能够将一些原始的H.264数据写入一个文件,但是这个文件只能用ffplay -f h264来ffplay -f h264 ,好像丢失了关于帧率的所有信息快速播放)。 此外颜色空间看起来不正确(atm使用摄像机在编码器侧的默认值)。 public class AvcEncoder { private MediaCodec mediaCodec; private BufferedOutputStream outputStream; public AvcEncoder() { File f = new File(Environment.getExternalStorageDirectory(), "Download/video_encoded.264"); touch (f); try { outputStream = new BufferedOutputStream(new FileOutputStream(f)); Log.i("AvcEncoder", "outputStream initialized"); } catch (Exception e){ e.printStackTrace(); } mediaCodec = MediaCodec.createEncoderByType("video/avc"); MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", 320, […]