很长的故事:
不久:
如何处理这些原始UDP数据以便通过H264/MPEG-4解码器过滤器进行解码?任何人都可以清楚地确定我与H264/MPEG流有关的步骤吗?
额外信息:
我可以用FFmpeg做到这一点......但是我无法弄清楚FFmpeg如何处理原始数据以便解码器可以解码.
我知道FFMPEG是可能的,但是如果我有一个部分文件(比如没有开头和结尾)该怎么办.有可能从中提取一些帧吗?
我正在从事在线电视服务.其中一个目标是在没有任何其他浏览器插件的情况下播放视频(Flash除外).
我决定使用MP4,因为大多数HTML5浏览器和Flash支持它(用于后备).视频由FFMpeg在服务器上从ASF转码.
但是,我发现MP4不能实时流式传输,因为它有一个moov原子用于必须指定长度的元数据.FFMpeg无法直接将mp4流式传输到stdout,因为它将moov放在文件的末尾.(MP4的实时转码和流式传输在Android中有效,但在Flash Player中无法使用NetStream.Play.FileStructureInvalid错误)
当然,MPEG-TS存在,但HTML5不支持<video>
.
我想到的是一种将流实时转码为MP4的方法,并且在每个新的HTTP请求中,首先发送一个指定视频长度非常长的数字的moov,然后开始发送其余的MP4文件.
是否可以使用MP4进行流式传输?
经过一些研究和av501的回答,我知道框架的尺寸必须是已知的,以便它可以工作.
mp4文件可以分割成更小的部分,以便可以流式传输吗?
当然,切换到另一个容器/格式是一个选项,但唯一兼容Flash和HTML5的格式是mp4/h264,所以如果我必须支持两者,我必须转码两次.
我试图从H264流中获取尺寸(高度和宽度).我知道要从mpeg2流中获取相同的详细信息,您必须查看序列头开始代码后面的四个字节((01B3)).H264的逻辑是否相同?非常感谢我得到的任何帮助..
我正在编写一个视频解码器(使用FFMPEG/AVCodec)来自定义实现mpeg4视频流.这个视频流的特点是它可以分成许多"子"流,根据同一个父节点创建许多P帧.我正在尝试解码的视频流实际上是一种"视频树".像这样的东西:
I <--P <--P <---------------------P <-------------- P <------------ P
\ <--P <--P <--P \ <--P <--P \ <--P <--P
Run Code Online (Sandbox Code Playgroud)
我已经写了一个基本的解码器,当我决定遵循一条路径时工作正常,问题是当我尝试在视频树中跟随多个路径时.此时我需要"解析"我的解码器以跟随两个不同的视频流.拆分不仅可能发生在关键帧之后,甚至在P帧之后,所以我需要复制AVCodecContext(我使用avcodec_copy_context
)但它似乎从干净的状态创建新的解码器..它似乎忽略了以前的视频状态因此,解码的P帧被"应用"到空视频帧.可能复制上下文使用avcodec_copy_context
是不够的...任何建议?如何复制上下文和解码器的完整状态?或者,有没有其他方法使用引用解码我的流?谢谢!
我正在使用MediaCodec
并MediaExtractor
以可变速率播放视频,包括向前和向后.代码使用类似SpeedControlCallback的东西来建立帧间暂停 - presentationTimeUs
从输出缓冲区向它提供字段.
99%的情况下,这种方法很好,但是看起来三星S6上的AVC编解码器在向后搜索时提供了错误的演示时间 - 它们被固定在寻求转发的最高价值时,如果这有意义的话.缓冲区中的数据是正确/更改的 - 它只是与固定的显示时间不对应.
S6可以处理具有品牌/ ftype的MP4文件中的后向搜索avc1
,但我尝试过的其他品牌的H.264视频(mp42
,isom
)在100%的时间内都不起作用.相同的文件在三星S5以及我尝试过的所有其他设备上都能正常工作.
编解码器记录这个:
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)解决方案?
有没有办法使用标准Android API 获取MPEG-4视频文件的个人资料代码?
示例配置文件的代码如下:baseline
,main
,high
等.
我不想ffmpeg
在Android应用程序中包含二进制文件以获取此信息.
我在MediaCodecInfo.CodecProfileLevel类中找到了配置文件列表的引用.任何人都可以确认这是否是我应该使用的那个?
以下是从MX Player应用程序中
获取的视频信息的示例屏幕截图
ffmpeg
二进制文件,所以我可以肯定地说他们使用它来提取profile-code
. android mpeg-4 android-mediaplayer mediaextractor android-mediacodec
在过去的几周里,我有机会阅读两份文件:
在阅读了"mpeg-4"中所有很酷的想法之后,比如识别面部表情,四肢动作和精灵,我真的很兴奋.对于1999年的想法,这些想法听起来非常有趣,甚至可能很棒.
但后来我读了"h.264"标准,并没有那些想法.关于如何编码像素有很多讨论,但没有一个非常酷的想法.
发生了什么?为什么删除这些想法?
这不是一个代码问题,但作为程序员,我觉得我应该尝试理解规范背后的意图.如果我编写的代码遵循了使用规范的精神,那么更有可能定位于利用整个规范.
我已经下载了MPD" http://dash.edgesuite.net/adobe/hdworld_dash/HDWorld.mpd "以及所有相关的.m4s文件.我试过在VLC播放器上运行它.但VLC播放器无法识别该格式.
我已经使用wget
(1到14个段可用)
下载了这个媒体片段http://dash.edgesuite.net/adobe/hdworld_dash/hdworld_seg_hdworld_0696kbps_ffmpeg.mp4.video_temp2.m4s.
谁能告诉我如何在播放器上运行.m4s格式文件?
系统:Ubuntu 11.10
我正在尝试将视频(或使用渐进式下载)流式传输到摩托罗拉Droid浏览器,并且没有太多运气.使用我的iPhone,我可以将Safari 导向http://xxx.xxx.xxx/FileName.mp4(这是一个MPEG-4视频文件),Safari可以快速打开,并播放视频.但是,使用Droid,我会转到同一个网址,并面临一个错误,指出"无法播放视频......很抱歉,此视频无法播放到此设备".
当我将Droid的浏览器导向WMV文件时,它将完全下载视频文件,然后在看起来像Droid视频播放器的情况下播放它,如果我点击它.
理想情况下,我想在Droid上复制iPhone的行为,视频播放器弹出,视频在完全下载之前启动.视频格式不是问题,因为我可以将视频编码为几乎任何标准.我正在尝试.mp4文件,因为Droid文档说它支持MPEG-4视频,虽然我无法从浏览器中使用它.
任何见解都会非常感激.