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 […]

解码在Android的原始H264stream?

我有一个项目,我被要求在android中显示videostream,stream是原始的H.264,我连接到服务器,并将从服务器接收字节stream。 基本上我想知道有没有办法将原始字节发送到Android中的解码器,并将其显示在表面上? 我已经成功解码包装在mp4容器中的H264使用Android 4.1中的新的MediaCodec和MediaExtractor API,不幸的是,我还没有find一种方法来解码原始的H264文件或使用这些API的stream。 我明白,一种方法是编译和使用FFmpeg,但我宁愿使用内置的方法,可以使用硬件加速。 我也理解Android的RTSPstream支持,但这不是一个选项。 Android版本不是问题。

在Android和IOS上加载什么h.264格式?

理论上,IOS和ANDROID都会播放h.264文件,但我无法弄清楚一个设置来编码它们,所以它们实际上是跨平台的。 有谁知道如何使用一个文件编码Android和IOS? ps我知道所有关于html5video和后备资源,我只是不想编码和托pipe一个新的video为每个设备来到派克。

如何在Android上使用硬件加速video解码?

我需要一个研究项目的硬件加速的H.264解码,来testing一个自定义的协议。 正如我在网上search一样,我发现了一些在Android上执行硬件加速video解码的方法。 使用ffmpeg libstagefright(libstagefright的概述 )或直接在操作系统中使用libstagefright,就​​像这里一样。 在特定的硬件平台上使用OpenMax 。 像这里关于三星设备和这里关于高通Snapdragon系列 有人提到PVplayer , 有些人“说” libstagefright是高通公司人员取得成功的唯一途径。 目前我不确定哪种方式可以工作 。 我现在有点困惑。 如果一切都可以工作,我肯定会喜欢硬件独立的方法。 正如我testing了几个video播放器的H / W加速与Galaxy Tab 7.7(3.2&Enxyos),VLC,Mobo,摇滚,vplayer,摇滚和主板工作正常,VLC不起作用,vplayer似乎有一个渲染错误,其性能的成本。 无论如何,我在Rockplayer上做了一个“操作”,并在data \ data \ com.redirecting \ rockplayer中删除了它的所有.so库文件,而软件解码崩溃,而hw解码工作仍然很好! 我想知道他们是怎么做到的。 在我看来,硬件加速可以独立于硬件平台。 有人可以指出这个问题吗? 或提供更多的信息或更好的细节的任何参考?