我正在尝试从.mov文件解析H.264帧.我想我已经得出结论,来自AVFormat的mov.c - FFMPEG的一部分是要走的路.但mov.c是未注释代码旁边约2600行.我正在寻找FFMPEG的使用示例,尤其是解析任何文件类型的结构.无论是MPEG4还是Quicktime Movie都没关系,因为它们在结构上非常相似.
如果没有现有的例子(我找不到)可能有人使用过它并且可以给我几行代码,或者解释如何开始?
我正在尝试做的事情:我使用AVCaptureSession从摄像机捕获样本,然后在H264中对这些样本进行编码,并借助AVAssetsWriter,AVAssetsWriterInput和AVAssetsWriterInputPixelBufferAdaptor将其写入文件.原因是我无法直接访问硬件H264编码,因为苹果不允许这样做.我现在需要做的事情(我认为不确定)是解析出来的:
.mov文件中的" mdat "-atom(电影数据,我认为可能不止一个).那么" 视频 "-atom然后在视频原子内(视频数据样本,可能有不止一个).我想我会相信几个原子是帧.这些将是"avc1"类型(这是H264的类型).请纠正我,因为我很确定我还没有正确地完成这一切.
我的问题是,我将如何解析单帧.我一直在阅读文档并查看了iFrameExtractor(由于它对帧进行解码,因此不是很有帮助).我想我理解正确的话时,我应该使用mov.c从FFMPEG-AVFormat,但我不知道.
编辑:我现在正在尝试这样:
我运行稍微减少的init函数i iFrameExtractor,它在.mov文件中找到了视频流.
我得到框架的数据,如下所示:
AVPacket packet;
av_read_frame(pFormatCtx, &packet);
NSData *frame;
if(packet.stream_index == videoStream){
frame = [NSData dataWithBytes:packet.data length:packet.size];
}
videoStream++;
av_free_packet(&packet);
return frame;
Run Code Online (Sandbox Code Playgroud)然后我将它传递给NSOperation的子类,在那里保留等待上传.但我收到一个EXC_BAD_ACC,从框架中复制数据时我做错了什么?有任何想法吗.当我尝试NSData* frame
使用其(非原子,保留)属性设置类变量时,我得到了EXC _... (它在合成行上说EXC_BAD_ACC)
我想针对以下问题寻求某种明确的答案:
ffprobe
?我在这个主题上找到了一些链接:
此外,基于H.264的QuickTime电影现在也支持透明的Alpha层,它是H.264规范的可选部分。
H.264解码器中对alpha通道的支持现在可以在Intel®Integrated Performance Primitives 6.0版本中获得。
MPEG4 Simple Studio Profile支持辅助通道,这些通道可用于alpha或深度-甚至可能包括位移,运动矢量,法线等。
但是,我从未见过具体的示例,甚至从未见过有关如何使用这些已宣布功能的详细信息。
如何将 MPEG4 数据写入(包装)到 android 中的 MP4 文件中?
我正在 android 平台上进行某种视频处理,但我不知道如何将处理后的数据(以某种标准编码,如 MPEG4)写回像 mp4 这样的视频文件。我认为最好使用 API 来执行此操作,但是我找不到所需的 API。
有没有人有任何想法?
我正在尝试录制一段10秒钟的视频进行监控.在Android中使用MediaRecorder非常简单.我所要做的就是打电话
mediaRecorder.setMaxDuration(10000);
Run Code Online (Sandbox Code Playgroud)
但是,我想连续覆盖相同的10秒视频.同样,这是一项微不足道的任务.
@Override
public void onInfo(MediaRecorder mr, int what, int extra) {
switch (what) {
case MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED:
stopRecording();
startRecording();
break;
}
}
Run Code Online (Sandbox Code Playgroud)
停止和启动(重新设定)MediaRecorder大约需要两秒钟.如果在这两秒钟内发生了重要事情,我就不会记录下来.
因此,我通过使用LocalSocket跟踪其他几个具有相同问题的人,并将其描述符传递给MediaRecorder
mediaRecorder.setOutputFile(sender.getFileDescriptor());
Run Code Online (Sandbox Code Playgroud)
然后是一个包含LocalServerSocket和接收器LocalSocket的AyncTask
public class VirtualServer extends AsyncTask<Void, Void, Void> {
...
server = new LocalServerSocket(SOCKET_ADDRESS);
while (true) {
receiver = server.accept();
...
int len = 0;
byte[] data = new byte[1024];
while ((len = input.read(data)) >= 0) {
...
Run Code Online (Sandbox Code Playgroud)
看看这是怎么回事?一旦解决了,就会出现一个新问题,在StackOverflow上也会多次解决.问题是传递给MediaRecorder的文件描述符不可搜索.
对我而言,这是我的理解停止的地方.不幸的是,没有明确的问题描述.如果有人可以向我描述问题,我可以开始寻找解决方案.有些地方提到"moot"必须重新定位,但随后讨论会转向一般的mp4编码,我迷失在所有细节中.
我希望我的问题得到明确说明.我不想播放任何形式的视频.深入研究打包成RTP并尝试提取我真正需要的部分的代码让我更加困惑.
我已经看过的链接:
干杯.
android video-encoding mpeg-4 mediarecorder android-mediarecorder
我有两个关于 MPEG4 视频中的图片组 (GOP) 的问题(对于 MPEG4 Part2 和 H.264):
如何使用 FFmpeg 提取视频序列的 GOP 结构和大小?我知道av_get_picture_type_char
该结构体的功能AVPicture
会产生每一帧的图片类型,但我想知道是否有更直接的方法来获取GOP信息?
如何检测序列是否具有开放 GOP 或封闭 GOP,即是否允许一个 GOP 中的 B 帧引用相邻 GOP 中的 I 和 P 帧?
我想使用Android Media Player播放录制的mp4数据,但在尝试播放时此错误显示:
java.io.IOException:setDataSource失败.
在android.media.MediaPlayer.setDataSource(MediaPlayer.java:1086)
在android.media.MediaPlayer.setDataSource(MediaPlayer.java:1032)
这是我的代码:
final ImageView play = (ImageView) root.findViewById(R.id.voice_play);
play.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
player = new MediaPlayer();
if (player.isPlaying()) {
player.reset();
}
player.setDataSource("file://mnt/sdcard/Android/data/com.myapp.apptalk/AudioRecorder/22-Oct-2015 11:26:14.mp4");
player.prepare();
seekbar.setMax(player.getDuration());
if (isPlay) {
player.stop();
play.setImageResource(R.drawable.play);
handler.removeCallbacks(runnable);
isPlay = false;
} else {
player.start();
runnable = new Runnable() {
@Override
public void run() {
seekbar.setProgress(player.getCurrentPosition());
handler.postDelayed(this, 1000);
}
};
handler = new Handler();
handler.post(runnable);
play.setImageResource(R.drawable.stop);
isPlay = true;
}
} catch (Exception e) { …
Run Code Online (Sandbox Code Playgroud) 我正试图查看我从eBay下车的这台IP摄像机(是的,是的,我知道).型号BL-5720IPW-L4MM.
无论如何,它们带有非常糟糕的基于Windows的应用程序,主要使用中文,而且功能非常差.我已经问过供应商我是否可以使用视频流的格式,所以我可以为他们提供Linux替代品 - 但是他们拒绝了...无论如何,它们非常昂贵,我需要从我的Linux读取视频流服务器(No X)并计划将流集成到linux应用程序'motion'中.但我无法弄清楚原始视频的开始位置,以及它的流媒体格式.
From what I can gather (in byte offset/length - desc - example):
0/4 Firmware Version - 8.4.4.5
5/2 H-res - 1280
7/2 V-res - 720
And what I know about the stream:
* 264/MPEG4 based codec
* 25fps
Run Code Online (Sandbox Code Playgroud)
以下是从TCP 9001捕获的原始数据(一旦连接就开始流式传输).如果任何人能够帮助我掌握这种格式,我们将不胜感激.完整的24MB(约60秒)捕获在这里可用,如果解码正确,应该显示我非常凌乱的桌子.
hexdump -n 1024 -C camera-capture.raw
00000000 08 04 04 05 00 05 d0 02 b0 01 f0 00 00 00 00 00 |................|
00000010 00 00 00 00 42 66 00 00 00 …
Run Code Online (Sandbox Code Playgroud) 我正在测试一个项目.我需要将来自用户的百分比的MPEG-4 ts数据包的有效载荷数据(零个字节)分开.我是通过按包读取".ts"文件(188字节)来完成的.但视频正在变得非常泥泞.(顺便说一下,我用C编写程序)
所以我决定找到属于I帧的数据/数据包,然后不接触它们,而是按百分比加扰其他数据.我可以在下面找到
(十六进制)00 00 00 01 E0视频开始PES包.. 00 00 01 B8开始图像组头... .. 00 00 01 00图像开始代码.这是32位.紧随其后的10位称为时间参考.因此,时间参考将包括图像起始码之后的字节和图像起始码之后的第二字节的前两位,即一个字节(8位)+2位.这些我们需要跳过.现在存在的三个位(来自图像起始码的第二个字节的3,4和5位)将指示帧类型,即I,B或P.因此,为了得到这个简单的逻辑AND和来自图像起始码的第二个字节用0x38和右移>>用3.
例如,数据就是这样;
00 00 01 00 00 0F FF F8 00 00 01 B5 ...........依此类推.
这里前四个字节00 00 01 00是图像起始码.第六字节的第五字节和前两位是时间参考.所以我们关注的是第六个字节 - > 0F
((0F & 38)>>3)
Run Code Online (Sandbox Code Playgroud)
帧类型= 1 ==> I帧
框架类型000禁止
帧类型001帧内编码(I) - iframe
帧类型010预测编码(P)-p帧
帧类型011双向预测编码(B)-b帧
但这是针对MPEG-2的.是否有一些这样的模式,所以我认识并获得MPEG-4传输流的按位操作的帧类型(扩展名为".ts")?
我需要得到多少字节或数据包属于该帧?
非常感谢你的帮助
我试图在分段文件(styp)的mp4容器中找到h264帧.对于分段我目前正在使用MP4Box破折号.我使用了MP4Box解析器,我注意到在每个关键帧(IDR)中,样本的大小不同于原始文件中同一帧的大小.我计算了差异,其他段中的同一文件总是37个字节.
这些字节代表什么?它们仅出现在每个关键帧之前的分段mp4文件类型中.我测试了其他文件,这些字节的数量略有不同(其他文件为39字节)并且不是相同的数据(尽管它们共享一些字节模式).这是来自mp4标准还是H264甚至MP4Box?我没有线索.
我试图从来自轴摄像机的rtp流解析不同的mpeg4帧,并使用avcodec_decode_video函数将数据包提供给ffmpeg库.这里是我正在做的步骤1. rtsp流初始化2. rtp流开始流入3.第一个数据包我开始000001b0 ...配置数据跟随,然后该帧开始于000001b6 ..第二个rtp有效载荷会有所不同,直到我得到一个rtp数据包,其中标记位被设置.之后我再次收到以000001b6开头的数据包并继续使用5-10 rtp数据包..这种模式重复
我正在做的是,如果我检测到000001b0/b6 - 我会累积所有后来的数据包,并在正确初始化解码器上下文之后将较大的缓冲区提供给libavcodec的avcodec_decode_video函数.
但是我在这里得到了一张糟糕的照片,最顶部的部分,一个水平条纹 - 水晶般清晰的图片,剩下的就是蹩脚的.我不确定为什么它会像这样.请帮我
我在rtp数据包中获得的数据是动态-96.
需要注意的是:当我传递iframes和p帧时,这些帧全神贯注于其他制造商的propreitary协议中,ffmpeg能够解析并提供非常好的pcitures.
任何帮助表示赞赏