如何知道H.264流中代表一张图片的NAL单元的数量?
我使用的是用AVCODEC解码的RTSP上的H.264流的相机.对于大多数摄像机,收到的每个数据包(NAL单元)代表一个完整的框架(I帧或帧),当我解码时,我每次都会获得一个框架. 但是对于另一台摄像机,一个框架在许多恒定尺寸的NAL单位中被拆分,当我解码每个数据包时,我没有每个数据包的帧. 我看到NAL单元中有一个开始和结束标志.除PPS或SPS外,永远不会设置末端标志.尽管如此,我可以检测到启动代码,并在新帧开始时告诉每个帧结束. 我想在单个框架内缓冲每个nal单元,然后将其发送到解码器(此录制功能并最小化框架索引). 这里一个示例(start_flags在nal [1]字节中为128) NALU: 10 bytes: SPS, NAL[1]={0,64,0,2} // Start Frame 1 NALU: 5 bytes: PPS, NAL[1]={128,64,0,14} NALU: 551 bytes: I-Frame, NAL[1]={128,0,0
16 2023-05-16
编程技术问答社区
.mp4视频文件中avcC框中的数值是否只受FFmpeg版本影响?
我正在研究视频文件的源识别,尤其是智能手机s. 的 我必须知道,.mp4视频文件中的AVCC框中的值具有编码选项(H.264),解码器在处理编码流时必须知道. 我想大多数智能手机都使用自定义的FFMPEG编码原始流.我想知道AVCC框中的值是否仅受FFMPEG版本的影响(如果未使用自定义版本). 我没有深入研究这一点,但认为ffmpeg中的libavcodec.so在执行编码时填充了AVCC框中的值(这是对吗?). 因此,我想问的是,是否使用了两个不同的智能手机使用相同的libavcodec.so(即使在其他.SO文件,用于录制的.APK文件等的情况下,也有不同)和两个视频文件从每个智能手机拍摄了哪些分辨率,AVCC框中的值相同? 我认为这个问题可能等于" AVCC框中的值是其他FFMPEG库或整个Android框架中其他层的影响"? ++还有一个问题!是否有任何具有相同分辨率从同一智能手机的视频在AVCC框中具有不同值的视频? (我建议源自低温模式,其他应用
14 2023-04-20
编程技术问答社区
我怎么能知道某个文件是视频文件?
我试图弄清楚某个用户上传是否是视频文件. 我首先尝试了ffprobe, # a png file Input #0, png_pipe, from '': Duration: N/A, bitrate: N/A Stream #0:0: Video: png, rgba(pc), 920x2094 [SAR 4724:4724 DAR 460:1047], 25 tbr, 25 tbn, 25 tbc # a text file Input #0, tty, from '': Duration: 00:00:00.24, bitrate: 40 kb/s Stream #0:0: Video: ansi, pal8, 640x400, 25 fps, 25 tbr, 25 tbn, 25 tbc # a video file Input #0, matroska,webm, from '': Metad
14 2023-04-20
编程技术问答社区
FFMPEG解码太慢(avcodec_send_packet() / avcodec_receive_frame()
我正在使用FFMPEG库在MPEG传输流中解码,扩展和重新编码视频.我刚刚从源重新编译为v3.3.2,并从旧的Avcodec_decode_video2()API更改为新的发送/接收API. 旧的和新的API都非常缓慢地解码视频. 25 fps视频=每40ms 1帧.但是,我看到每帧70至120ms进行解码.这是一个文件翻译器,因此需要它比实时运行更快. 代码大纲在下面.有人对如何提高解码速度有任何想法吗?关于弃用的avcodec_decode_video2()还有其他帖子;这些都没有解决.新的API不会更快地运行... gettimeofday(&tv1, NULL); int rc = av_read_frame(pFormatContext, pESPacket); gettimeofday(&tv2, NULL); int ret = avcodec_send_packet(pDecoderContext, pESPacket); if (ret
62 2023-04-20
编程技术问答社区
libavformat/libavcodec提供无效的容器头
我正在使用libavcodec将流编码为H264和libavformat将其存储在MP4中.最终的容器具有无效的标头,可以在VLC中播放,但没有其他玩家. 我发现使用MP4容器和" MPEG4"编解码器会产生有效的MP4文件,但是使用Libx265(HEVC)或Libx264编解码器会产生无效的MP4. . 我可以使用ffmpeg -i invalid.mp4 -vcodec copy valid.mp4,并且在有效的容器中获得了一个几乎完全相同的文件. 这些文件的示例在这里:损坏和 重新添加文件 [使用下载链接 我使用十六进制编辑器查看两个文件的标题的差异,而无效的一个字节小于有效的字节. 我用来打开容器和编解码器并编写标题的代码在这里: AVOutputFormat *container_format; AVFormatContext *container_format_context; AVStream *video_stream; int ret
6 2023-04-20
编程技术问答社区
在ffmpeg命令行中,"copy "的作用是什么?
我知道它复制了一些东西,但除此之外,它做了什么(扩展它会影响输出文件)?是开关还是选项?为什么在单词本身之前没有连字符? 我从其他问题中可以看到它可以复制不带transcode的流但是什么是我可以操纵它的其他可能性? 我已经完成了ffmpeg --help,但我看不到任何文档.有一个网站,我可以阅读更多有关它的信息吗? 解决方案 copy既不是开关也不是选项.这是可以为编解码器设置的值,并表示它建议的内容,即复制框架,而不是通过decode-> filter->编码过程. 在您链接的问题中,字符串为-c copy,这意味着将所有编解码器操作设置为复制视频,音频,字幕,数据和附件(如果有). -c -codec. 很短 如果您设置-c:v copy,则意味着复制正在处理的任何视频流.对于-c:a或-c:s或-c:d,也有相同的保留.当然,FFMPEG必须支持将目标流纳入输出容器.如果没有,命令将失败. 在要求复制流时,您不能使用音频/视频/多媒体过滤器,
14 2023-04-20
编程技术问答社区
在mp4容器中保存视频时FPS过高
当我从AVI文件中解码帧,然后将它们解码为X264并保存到MP4文件时,输出文件的FPS始终为12,800.因此,文件播放非常快.但是,当我以AVI格式而不是MP4保存在H264帧中编码时,因此FPS如我想要的-25. 有什么问题? 在这里我在VS2010中写的代码: #include "stdafx.h" #include "inttypes.h" extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libavutil/avutil.h" #include #include #include #include } #include using na
4 2023-04-02
编程技术问答社区
FFMPEG与QT内存泄漏
让我从代码剪辑开始: QByteArray ba; ba.resize(500000); int encsize = avcodec_encode_video(context, (uint8_t*)ba.data(), 500000, frame.unownedPointer()); 我正在做的是从帧中编码数据,并将数据放入指向QByTearray的缓冲区中.如果我评论avcodec_encode_video线,我的内存泄漏就会消失. Unhownedpointer()看起来像这样: if (this->frame != NULL) return this->frame; this->frame = avcodec_alloc_frame(); uchar *data = this->img.bits(); frame->data[0] = (uint8_t *)data; frame->data[1] = (uint8_t *)da
12 2023-03-25
编程技术问答社区
ffmpeg: 音频样本的内建性
我使用FFMPEG的AVCODEC从我的C ++应用程序中的音乐文件中检索原始音频样本.对于文件,我对此进行了测试,看来这些文件示例的endianness很小,但是我想知道我尝试解码的所有文件是否总是正确的(即来自ffmpeg的实现,或者至少它的架构 - 特定于我的计算机的架构使用了Little Endian).如果没有,我认为这将取决于特定文件的编码格式.在这种情况下,我如何检查哪个endianess适用于我要解码的每个文件?我在文档中找不到任何相关信息. 解决方案 内部FFMPEG始终将本机端性用于音频样本,因为它使对数据执行各种操作变得更加容易(有关此问题的某些文档,请参见libavutil/samplefmt.h文件);根据文件格式规定,转换到适当的端度的任务是编解码器的任务.作为一个简单的例子:有一个琐碎的有声ocodec家族,用于阅读/编写名为pcm_*的原始样本;例如有pcm_s16le和pcm_s16be.在小型架构上pcm_s16le pcm_s16be在解码/
14 2023-03-01
编程技术问答社区
为什么avcodec_fill_audio_frame在只有样本数不同的情况下会返回-22?
我的问题很快解释:我必须使用FFMPEG(RAW PCM到G.711 MU-LAW)编码音频样本.这是我的代码的有罪部分(我在此示例中将原始参数显式): AVFrame* frame = av_frame_alloc(); frame->nb_samples = 8000; frame->format = AV_SAMPLE_FMT_S16; frame->channels = 1; frame->channel_layout = AV_CH_LAYOUT_MONO; frame->sample_rate = 8000; frame->quality = 1; int res = avcodec_fill_audio_frame(frame, 1, AV_SAMPLE_FMT_S16, /*my samples data*/, 16000, 0); // If res >= 0, continue with avcodec_encode_audio2 它有效:) ...好吧
10 2023-03-01
编程技术问答社区
为什么在ffmpeg'的libavcodec输出容器中添加音频流会导致崩溃?
就目前而言,我的项目正确地使用了libavcodec解码视频,每个帧都被操纵(无关紧要)并输出到新视频.我已经从在线找到的示例拼凑在一起,并且有效.结果是操纵帧的完美.mp4,减去音频. 我的问题是,当我尝试在输出容器中添加音频流时,我在mux.c中崩溃了,我无法解释.它在static int compute_muxer_pkt_fields(AVFormatContext *s, AVStream *st, AVPacket *pkt)中.其中尝试st->internal->priv_pts->val = pkt->dts;,priv_pts是nullptr. 我不记得版本编号,但这是从2020年11月4日ffmpeg构建的. 我的MediaContentMgr比我这里的东西大得多.我正在删除与框架操纵有关的所有内容,因此,如果我缺少任何东西,请告诉我并将编辑. 添加时触发nullptr异常的代码将被称为inline .h: #ifndef _API
2 2023-03-01
编程技术问答社区
libav以极高的帧率制作MP4文件
我正在尝试编写一个程序,以生成通过FFMPEG/LIBAV编码的帧,并使用单个H264流中的MP4文件.我找到了这两个示例,并试图将它们合并在一起以制作我想要的东西:[视频transcoder ] a>] 我已经能够获得视频输出(绿色圆圈更改尺寸),但是无论我如何设置帧的pts值或time_base我在AVCodecContext>或AVStream中指定的内容,我都会获得约7000-15000而不是60的帧速率,导致视频文件持续70ms而不是1000帧/60 fps = 166秒.每次我更改一些代码时,帧速率都会发生变化,几乎就像是从非初始化的内存读数一样.在Stackoverflow上对此类问题的其他引用似乎与错误设置PTS值有关.但是,我尝试打印出我能找到的所有PT,DTS和时间基础值,它们似乎都很正常.这是我的概念验证代码(为了清楚起见,删除了Libav呼叫的错误): #include #include
20 2023-02-28
编程技术问答社区
创建一个AVPacket结构的副本
我想制作一个avpacket的副本,以便以后可以解码. avpacket来自音频流. av_dup_packet似乎不起作用. avpacket复制构造函数不起作用. 创建我自己的复制构造函数会导致内存损坏. 解决方案 复制Avpacket结构的一种方法:(可行) AVPacket newPacket(oldPacket); newPacket->data = reinterpret_cast(new uint64_t[(oldPacket->size + FF_INPUT_BUFFER_PADDING_SIZE)/sizeof(uint64_t) + 1]); memcpy(newPacket->data, oldPacket->data, oldPacket->size); 原因是某些解码器使用需要某些字节对准和填充的优化.简单地分配oldpacket->大小不能分配足够的分配,它也不以适当的字节对齐方式分配. 请注
10 2023-02-28
编程技术问答社区
用C++访问网络摄像头的FFMPEG
我已经在四处搜索,找不到有关如何使用C ++中FFMPEG访问网络摄像头的任何示例或教程.任何示例代码或任何帮助我指向某些文档的帮助,都将不胜感激. 预先感谢. 解决方案 我已经在此工作了几个月.您的第一个"问题"是FFMPEG(LibavCodec和其他FFMPEG LIB)无法访问Web Cams或任何其他设备. 对于基本的USB网络摄像头或音频/视频捕获卡,您首先需要驱动程序软件来访问该设备.对于Linux,这些驱动程序属于Video4linux(已知的V4L2)类别,它们是大多数发行版的一部分模块.如果您正在使用MS Windows,则需要获得允许您访问设备的SDK. MS可能有一些用于访问通用设备的东西(但是,根据我的经验,如果您做到这一点,那么它们的功能不是很有能力),那么您现在拥有原始框架(视频和/或音频). 然后,您进入FFMPEG部分-libavcodec-将其拿到原帧(音频和/或视频)并将其编码到流中,然后将其ffmpeg可以误入您的最终容器
16 2023-02-27
编程技术问答社区
用libavcodec对mJPEG进行解码
我正在创建视频会议应用程序.我发现网络摄像头(至少有3个)为MJPEG输出格式提供了更高的分辨率和帧速率.到目前为止,我正在使用YUY2,并在I420转换为X264进行压缩.要将MJPEG转到I420,我需要先解码它.我试图用LibavCodec从网络摄像头解码图像.这是我的代码. 初始化: // mJPEG to I420 conversion AVCodecContext * _transcoder = nullptr; AVFrame * _outputFrame; AVPacket _inputPacket; avcodec_register_all(); _outputFrame = av_frame_alloc(); av_frame_unref(_outputFrame); av_init_packet(&_inputPacket); AVCodec * codecDecode = avcodec_find_decoder(AV_CODEC_ID_MJPEG
38 2023-02-27
编程技术问答社区
FFMpeg将RGB图像编码为H264
我正在开发一个具有2个输入引脚的直接滤波器(1个音频,1个用于视频).我正在使用ffmpeg的libavcodec/libavformat/libavutil将视频编码为H264,音频到AAC并使用RTP使用RTP.到目前为止,我能够使用libavcodec正确编码视频和音频,但是现在我看到FFMPEG似乎也支持RTP Muxing.不幸的是,我找不到任何示例代码,这些代码显示了如何执行H264编码和RTP Muxing.有人知道好样品吗? 解决方案 尝试在 Handbrake 中查看代码.具体而言,此文件 muxmp4.c JEM我发现与FFMPEG/RTP一起工作.确保并使用 av_interleaved_write_frame()和 feltradata 字段正确.这些是我记得RTP的一些关键区别. 仍然,我与ffmpeg的RTP/RTSP遇到了一些稳定性问题(我敢肯定它会好转). live555 ,我的运气好得多,您可以在 vlc 和 mplayer "> mpla
14 2023-02-27
编程技术问答社区
FFMPEG不能显示视频的持续时间
我正在尝试使用FFMPEG从视频文件中捕获帧,但我什至无法获得视频的持续时间.每次尝试使用pFormatCtx->duration访问它时,我都会得到0.我知道指针初始化并包含正确的持续时间,因为如果我使用av_dump_format(pFormatCtx, 0, videoName, 0);,我实际上会获取持续时间数据以及有关视频的其他信息. 这就是我使用av_dump_format(pFormatCtx, 0, videoName, 0);时得到的: Input #0, avi, from 'futurama.avi': Duration: 00:21:36.28, start: 0.000000, bitrate: 1135 kb/s Stream #0.0: Video: mpeg4 (Advanced Simple Profile), yuv420p, 512x384 [PAR 1:1 DAR 4:3], 25 tbr, 25 tbn, 25 tbc Stream #0.
10 2023-02-25
编程技术问答社区
FFMPEG不能显示视频的持续时间
我正在尝试使用FFMPEG从视频文件中捕获帧,但我什至无法获得视频的持续时间.每次尝试使用pFormatCtx->duration访问它时,我都会得到0.我知道指针初始化并包含正确的持续时间,因为如果我使用av_dump_format(pFormatCtx, 0, videoName, 0);,我实际上会获取持续时间数据以及有关视频的其他信息. 这就是我使用av_dump_format(pFormatCtx, 0, videoName, 0);时得到的: Input #0, avi, from 'futurama.avi': Duration: 00:21:36.28, start: 0.000000, bitrate: 1135 kb/s Stream #0.0: Video: mpeg4 (Advanced Simple Profile), yuv420p, 512x384 [PAR 1:1 DAR 4:3], 25 tbr, 25 tbn, 25 tbc Stream #0.
8 2023-02-25
编程技术问答社区
如何在libavcodec中设置解码像素格式?
i通过LibavCodec解码视频,使用以下代码: //Open input file if(avformat_open_input(&ctx, filename, NULL, NULL)!=0) return FALSE; // Couldn't open file if(avformat_find_stream_info(ctx, NULL)nb_streams; i++) { if((ctx->streams[i])->codec->codec_type==AVMEDIA_TYPE_VIDEO) { videoStream=i; break; } } if (videoStrea
8 2023-02-25
编程技术问答社区
问题:用av_seek_frame寻找FFMPEG的字节位置
我正在尝试使av_seek_frame()函数转到我指定的字节位置.我正在为我的应用程序实现帧准确的寻求机制,并且我的看法是,我将扫描整个视频文件,并为结构中的每个密钥帧存储字节位置.我发现从哪里获得当前字节位置:avpacket.pos.我现在用av_seek_frame这样测试这个位置: av_seek_frame( pFormatCtx, videoStream, 110285594, AVSEEK_FLAG_BYTE); 但是,这似乎不是做对的事情,当我打电话av_read_frame时,它只是从帧23开始.如果我不寻求,它从框架1开始. 解决方案 对于那些有兴趣的人,我找到了解决方案.经过数小时的谷歌搜索和一些简单的反向工程形式,我找到了如何获取和设置开放视频的字节位置. 获得文件位置: avformatcontext.pb.pos 例如: int64_t byteposition = pFormatCtx->pb->pos; 设置文件位
8 2023-02-24
编程技术问答社区