使用FFmpeg avcodec_receive_frame解码h264视频流出现延时?
 ret = avcodec_send_packet(avctx, pkt);
    if (ret < 0) {
        return -1;
    }
    while (ret >= 0){
        ret = avcodec_receive_frame(avctx, frame);
        }

解码网络H264数据 在网络出现中断丢失帧的时候有几率出现解码延时
重置解码器后又恢复正常,有什么方法可以不用重置解码器吗?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
ffmpeg avcodec_receive_frame 解码效率慢

``` if (pPacket->stream_index == videoIndex) { Uint32 pretimer = SDL_GetTicks(); /* ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, pPacket); if (ret < 0) { printf("解帧失败!\n"); return -1; } */ ret = avcodec_send_packet(pCodecCtx, pPacket); if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) return -1; ret = avcodec_receive_frame(pCodecCtx, pFrame); if (ret < 0 && ret != AVERROR_EOF) { //fprintf(stderr, "Could not open audio codec: %s\n", av_err2str(ret)); continue; } Uint32 a = SDL_GetTicks() - pretimer; cout << "avcodec_receive_frame" << a << endl; } ``` ffmpeg 我是用3.4版本 解码时,使用函数avcodec_send_packet avcodec_receive_frame 获取一帧4K高清视频,30ms左右 使用2.8老版本时 avcodec_decode_video2 获取一帧4K高清视频 10ms左右,请问这种情况如何解决。为什么新版本的解码速度反倒是变慢了。

ffmpeg 硬编码时avcodec_encode_video2返回错误码-11(Resource temporarily unavailable)

用ffmpeg将bmp文件序列编码为h264,使用软编码器AV_CODEC_ID_H264时 程序可以正常运行,换成硬编码器h264_nvenc后,程序有时可以正常运行,但有时会报错,错误现象为: 编码生成的h264文件大小为0KB,avcodec_encode_video2()函数返回错误码-11,使用av_strerror显示错误码映射为“Resource temporarily unavailable”。 换成新的API(avcodec_send_frame和avcodec_receive_packet)后,已经返回-11。程序如下: ``` #include<stdio.h> #include<iostream> #include<afx.h> using namespace std; extern"C" { #include <libavcodec\avcodec.h> #include <libavformat\avformat.h> #include <libswscale\swscale.h> #include <libavutil\pixfmt.h> #include <libavutil\imgutils.h> #include <libavutil/opt.h> #include "libavutil/time.h" } #define bmpImagePath "F:/laboratory/holiday/bmp2H264/image_bmp1/%03d.bmp" //bmp图像路径 #define H264FilePath "F:/laboratory/holiday/bmp2H264/h264/text.h264" //H264文件输出路径 const int image_number = 100; //bmp图片数量 int main() { CFile file[image_number + 1000]; BYTE *szTxt[image_number + 1000]; int nWidth = 0; int nHeight = 0; int nDataLen = 0; int nLen; CString csFileName; for (int fileI = 1; fileI <= image_number; fileI++) { csFileName.Format(bmpImagePath, fileI); file[fileI - 1].Open(csFileName, CFile::modeRead | CFile::typeBinary); nLen = file[fileI - 1].GetLength(); szTxt[fileI - 1] = new BYTE[nLen]; file[fileI - 1].Read(szTxt[fileI - 1], nLen); file[fileI - 1].Close(); BITMAPFILEHEADER bmpFHeader; BITMAPINFOHEADER bmpIHeader; memcpy(&bmpFHeader, szTxt[fileI - 1], sizeof(BITMAPFILEHEADER)); int nHeadLen = bmpFHeader.bfOffBits - sizeof(BITMAPFILEHEADER); memcpy(&bmpIHeader, szTxt[fileI - 1] + sizeof(BITMAPFILEHEADER), nHeadLen); nWidth = bmpIHeader.biWidth; nHeight = bmpIHeader.biHeight; szTxt[fileI - 1] += bmpFHeader.bfOffBits; nDataLen = nLen - bmpFHeader.bfOffBits; cout << "fileI:" << fileI << endl; } av_register_all(); avcodec_register_all(); AVFrame *m_pRGBFrame = new AVFrame[1]; //RGB帧数据 AVFrame *m_pYUVFrame = new AVFrame[1];; //YUV帧数据 AVCodecContext *c = NULL; //AVCodecContext *in_c = NULL; AVCodec *pCodecH264 = NULL; //编码器 uint8_t * yuv_buff = NULL;// //查找h264编码器 //pCodecH264 = avcodec_find_encoder(AV_CODEC_ID_H264); //软编码器 pCodecH264 = avcodec_find_encoder_by_name("h264_nvenc"); //硬编码器 if (!pCodecH264) { fprintf(stderr, "h264 codec not found\n"); exit(1); } c = avcodec_alloc_context3(pCodecH264); if (!c) { throw exception("avcodec_alloc_context3 failed!"); } c->bit_rate = 3000000;// put sample parameters //c->bit_rate = 2500000;// put sample parameters c->width = nWidth; c->height = nHeight; AVRational rate; rate.num = 1; rate.den = 25; c->time_base = rate;//(AVRational){1,25}; c->gop_size = 10; // emit one intra frame every ten frames c->max_b_frames = 1; c->thread_count = 1; c->pix_fmt = AV_PIX_FMT_YUV420P;//PIX_FMT_RGB24; if (avcodec_open2(c, pCodecH264, NULL)<0) //打开编码器 TRACE("不能打开编码库"); int size = c->width * c->height; yuv_buff = (uint8_t *)malloc((size * 3) / 2); // size for YUV 420 uint8_t * rgb_buff = new uint8_t[nDataLen]; //将rgb图像数据填充rgb帧 //图象编码 //int outbuf_size = 100000000; int outbuf_size = nWidth * nHeight * 3; uint8_t * outbuf = (uint8_t*)malloc(outbuf_size); int u_size = 0; FILE *f = NULL; char * filename = H264FilePath; f = fopen(filename, "wb"); if (!f) { TRACE("could not open %s\n", filename); exit(1); } //初始化SwsContext SwsContext * scxt = sws_getContext(c->width, c->height, AV_PIX_FMT_BGR24, c->width, c->height, AV_PIX_FMT_YUV420P, SWS_POINT, NULL, NULL, NULL); AVPacket avpkt; //AVFrame *pTFrame=new AVFrame int num = 0; long long int vpts = 0; for (int i = 0; i< image_number; ++i) { int index = i; memcpy(rgb_buff, szTxt[index], nDataLen); avpicture_fill((AVPicture*)m_pRGBFrame, (uint8_t*)rgb_buff, AV_PIX_FMT_RGB24, nWidth, nHeight); //将YUV buffer 填充YUV Frame avpicture_fill((AVPicture*)m_pYUVFrame, (uint8_t*)yuv_buff, AV_PIX_FMT_YUV420P, nWidth, nHeight); // 翻转RGB图像 m_pRGBFrame->data[0] += m_pRGBFrame->linesize[0] * (nHeight - 1); m_pRGBFrame->linesize[0] *= -1; m_pRGBFrame->data[1] += m_pRGBFrame->linesize[1] * (nHeight / 2 - 1); m_pRGBFrame->linesize[1] *= -1; m_pRGBFrame->data[2] += m_pRGBFrame->linesize[2] * (nHeight / 2 - 1); m_pRGBFrame->linesize[2] *= -1; //将RGB转化为YUV sws_scale(scxt, m_pRGBFrame->data, m_pRGBFrame->linesize, 0, c->height, m_pYUVFrame->data, m_pYUVFrame->linesize); int got_packet_ptr = 0; av_init_packet(&avpkt); avpkt.data = outbuf; avpkt.size = outbuf_size; //m_pYUVFrame->pts = vpts; /*u_size = avcodec_send_frame(c, m_pYUVFrame); if (u_size != 0) { char errorbuf[1024] = { 0 }; av_strerror(u_size, errorbuf, sizeof(errorbuf)); cout << "error number:" << u_size << "avcodec_send_frame error:" << errorbuf << endl; } u_size = avcodec_receive_packet(c, &avpkt); if (u_size != 0) { char errorbuf[1024] = { 0 }; av_strerror(u_size, errorbuf, sizeof(errorbuf)); cout << "error number:"<< u_size << " avcodec_receive_packet error:" << errorbuf << endl; }*/ u_size = avcodec_encode_video2(c, &avpkt, m_pYUVFrame, &got_packet_ptr); if (u_size != 0) { char errorbuf[1024] = { 0 }; av_strerror(u_size, errorbuf, sizeof(errorbuf)); cout << "error number:" << u_size << "avcodec_encode_video2 error:" << errorbuf << endl; } m_pYUVFrame->pts++; //cout << "encode frame" << index + 1 << " successfully!" << endl; cout << "u_size:" << u_size << endl; if (u_size == 0) { cout << "encode frame" << index + 1 << " successfully!" << endl; cout << "*************" << ++num << "************" << endl; fwrite(avpkt.data, 1, avpkt.size, f); } //vpts++; else { avcodec_send_packet(c, &avpkt); } } cout << "nWidth" << nWidth << endl; cout << "nHeight" << nHeight << endl; fclose(f); delete[]m_pRGBFrame; delete[]m_pYUVFrame; delete[]rgb_buff; free(outbuf); free(yuv_buff); avcodec_close(c); av_free(c); //avcodec_free_context(&c); system("pause"); return 0; } ``` 错误结果截图如下: ![图片说明](https://img-ask.csdn.net/upload/202004/19/1587275773_301317.png)

FFmpeg 编码 avcodec_open2 x264 memory leak

开发平台 : Mac OS X EI Capitan 10.11.4 Xcode Version 7.3 iOS 9.3 代码 : // x264 参数 double crf = 23; int qmin = 12;// 最小的量化因子。取值范围0-69。 int qmax = 18;// 最大的量化因子。取值范围13-69。 int keyint = 16; int scenecut = 0; // slow // ultrafast // superfast av_opt_set(codec_ctx->priv_data, "preset", "ultrafast", 0); // zerolatency // stillimage,fastdecode,zerolatency av_opt_set(codec_ctx->priv_data, "tune", "stillimage,fastdecode,zerolatency", 0); av_opt_set(codec_ctx->priv_data, "profile", "baseline", 0); char x264opts[512] = { 0 }; sprintf(x264opts, "crf=%f:scenecut=%d", crf, scenecut); av_opt_set(codec_ctx->priv_data, "x264opts", x264opts, 0); codec_ctx->codec_id = codec_id; codec_ctx->codec_type = AVMEDIA_TYPE_VIDEO; codec_ctx->pix_fmt = PIX_FMT_YUV420P; codec_ctx->width = in_width; codec_ctx->height = in_height; codec_ctx->bit_rate = bit_rate;// 比特率 codec_ctx->time_base = (AVRational){ 1, in_frames_per_secs }; codec_ctx->qcompress = 1;// x264 参数 qcomp codec_ctx->qblur = 1; codec_ctx->qmin = qmin;// 最小量化系数 codec_ctx->qmax = qmax;// 最大量化系数 codec_ctx->keyint_min = 2;// 关键帧的最小间隔帧数 codec_ctx->gop_size = keyint;// 关键帧的最大间隔帧数,x264 参数 keyint codec_ctx->scenechange_threshold = scenecut;// 场景变化检测阈值 codec_ctx->max_b_frames = 0;// optional param 可选参数,禁用B帧,,设置 x264 参数 profile 值为 baseline 时,此参数失效 codec_ctx->thread_count = 1; codec_ctx->ticks_per_frame = 2; /* codec_ctx->rc_max_rate = 700;// 最大码流,x264单位kbps,ffmpeg单位bps,x264 参数 vbv-maxrate codec_ctx->rc_min_rate = 300;// 最小码流 codec_ctx->rc_buffer_size = codec_ctx->rc_max_rate + codec_ctx->rc_min_rate;// x264 参数 vbv-bufsize */ codec_ctx->max_qdiff = 6;// 固定量化器因子允许的最大偏差,取值范围0-69,x264 参数 qpstep codec_ctx->me_range = 5; codec_ctx->refs = 3;// 运动补偿,x264 参数 ref codec_ctx->rc_strategy = FF_RC_STRATEGY_XVID;// 码率控制策略,宏定义,查API codec_ctx->dct_algo = FF_DCT_AUTO; codec_ctx->idct_algo = FF_IDCT_AUTO; codec_ctx->profile = FF_PROFILE_H264_BASELINE; codec_ctx->codec_tag = 0; } if(oformat->flags & AVFMT_GLOBALHEADER) { codec_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER; } av_error = avcodec_open2(codec_ctx, codec, NULL); if (0 != av_error) { goto fail_label; } g_out_fmt_ctx = fmt_ctx; g_video_codec_ctx = codec_ctx; video_stream_index = fmt_ctx->nb_streams - 1; ret = 0; fail_label: if (0 != ret) { printf("%s", "fail"); if (codec_ctx) { avcodec_close(codec_ctx); codec_ctx = NULL; } if (fmt_ctx) { avformat_free_context(fmt_ctx); fmt_ctx = NULL; } } else { printf("%s", "success"); } codec_ctx = NULL; stream = NULL; codec = NULL; } void test_release_mw_recorder_controller() { video_stream_index = -1; if (g_video_codec_ctx) { avcodec_close(g_video_codec_ctx); g_video_codec_ctx = NULL; } if (g_out_fmt_ctx) { avformat_free_context(g_out_fmt_ctx); g_out_fmt_ctx = NULL; } } - (void)click_init_h264:(id)sender { NSString *format_name = @"flv";// flv、aac NSArray *doc_paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *doc_path = [doc_paths objectAtIndex:0]; NSString *filename = [doc_path stringByAppendingPathComponent:[NSString stringWithFormat:@"test_ffmpeg_encoder.%@", format_name]]; const char *format_name_str = format_name.UTF8String; const char *filename_str = filename.UTF8String; test_init_mw_recorder_controller(format_name_str, filename_str); } - (void)click_release_h264:(id)sender { test_release_mw_recorder_controller(); } 使用 Instruments 进行内存 leak 检测时,在调用 click_init_h264 方法后,就会出现 7个x264_malloc方法调用的memory leak的情况。 Instruments截图--->>>![图片说明](https://img-ask.csdn.net/upload/201605/26/1464240798_520440.png) 所以想请求各位有使用FFmpeg进行视频编码的高手,这是什么问题。是我的设置参数有问题,还是步骤有问题。请指点一下小弟。(小弟刚学FFmpeg,想写个iOS录制视频的例子,使用x264库进行视频编码,aac进行音频编码。现在可以正常编码,录制的视频也可以播。现在就差这个memory leak一直找不到解决办法)。 FFmpeg打印x264配置信息 : [libx264 @ 0x110060800] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 AVX2 LZCNT BMI2 [libx264 @ 0x110060800] profile Constrained Baseline, level 2.2 [libx264 @ 0x110060800] 264 - core 148 - H.264/MPEG-4 AVC codec - Copyleft 2003-2016 - http://www.videolan.org/x264.html - options: cabac=0 ref=3 deblock=0:-3:-3 analyse=0:0 me=dia subme=0 psy=1 psy_rd=2.00:0.70 mixed_ref=0 me_range=5 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=5 lookahead_threads=5 sliced_threads=1 slices=5 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=6 keyint_min=2 scenecut=0 intra_refresh=0 rc=crf mbtree=0 crf=23.0 qcomp=1.00 qpmin=12 qpmax=18 qpstep=8 ip_ratio=1.40 aq=0 我自己找到了一些规律,不懂是否正确。 已找到泄露的调用 av_error = avcodec_open2(codec_ctx, codec, NULL); 这句一调用就有x264_malloc memory leak 出来了。 而且是泄露的个数是可以计算出来,是codec_ctx->qmax - codec_ctx->qmin + 1个泄露。所以在想是不是x264设置参数的问题导致。 求大神。

ffmpeg编解码异常,Resource temporarily unavailable

修改ffplay官方代码,使用ffmpeg实现从新编码保存mp4功能。调用avcodec_receive_packet返回-1,提示Resource temporarily unavailable,保存出来的文件没有I帧。 完整代码: https://github.com/hrdzkj/ffplay/tree/ffplayOpengl (注意是在ffplayOpengl分支) 关键代码: int ffp_start_record(FFPlayer *ffp, const char *file_name) { assert(ffp); VideoState *is = ffp->is; if (!file_name || !strlen(file_name)) { // 没有路径 av_log(ffp, AV_LOG_ERROR, "filename is invalid"); goto end; } if (!is || !is->ic || is->paused || is->abort_request) { // 没有上下文,或者上下文已经停止 av_log(ffp, AV_LOG_ERROR, "is,is->ic,is->paused is invalid"); goto end; } if (ffp->is_record) { // 已经在录制 av_log(ffp, AV_LOG_ERROR, "recording has started"); goto end; } ffp->m_ofmt_ctx = NULL; ffp->is_record = 0; ffp->record_error = 0; // todo avformat_new_stream,avcodec_copy_context/avcodec_parameters_from_context 等api函数的作用,初始化了什么东西 // 初始化一个用于输出的AVFormatContext结构体 avformat_alloc_output_context2(&ffp->m_ofmt_ctx, NULL, "mp4", file_name); if (!ffp->m_ofmt_ctx) { av_log(ffp, AV_LOG_ERROR, "Could not create output context filename is %s\n", file_name); goto end; } stream_ctx = av_mallocz_array(is->ic->nb_streams, sizeof(*stream_ctx)); if (!stream_ctx) { goto end; } for (int i = 0; i < is->ic->nb_streams; i++) { int ret; AVCodec *encoder; AVCodecContext *enc_ctx; AVCodecContext *dec_ctx = is->ic->streams[i]->codec; if (dec_ctx->codec_type != AVMEDIA_TYPE_VIDEO && dec_ctx->codec_type != AVMEDIA_TYPE_AUDIO) { continue; } //对照输入流创建输出流通道 AVStream *in_stream = is->ic->streams[i]; AVStream *out_stream = avformat_new_stream(ffp->m_ofmt_ctx, NULL); if (!out_stream) { av_log(ffp, AV_LOG_ERROR, "Failed allocating output stream\n"); goto end; } //查找编码器、创建编码器上下文、设置编码器参数,然后打开编码器 encoder = avcodec_find_encoder(dec_ctx->codec_id); if (!encoder) { av_log(NULL, AV_LOG_FATAL, "Necessary encoder not found\n"); goto end; } enc_ctx = avcodec_alloc_context3(encoder); if (!enc_ctx) { av_log(NULL, AV_LOG_FATAL, "Failed to allocate the encoder context\n"); goto end; } //不是帧率的问题,是I P B帧的区别导致的问题了 ret = avcodec_parameters_to_context(enc_ctx, in_stream->codecpar); if (ret < 0) { printf("Failed to copy context input to output stream codec context\n"); goto end; } if (enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO) { //enc_ctx->height = dec_ctx->height; //enc_ctx->width = dec_ctx->width; //enc_ctx->sample_aspect_ratio = dec_ctx->sample_aspect_ratio; //enc_ctx->gop_size = 10; //enc_ctx->max_b_frames = 0; //if (encoder->pix_fmts) //enc_ctx->pix_fmt = encoder->pix_fmts[0]; //else // enc_ctx->pix_fmt = dec_ctx->pix_fmt; enc_ctx->time_base = av_inv_q(dec_ctx->framerate); //enc_ctx->time_base = //(AVRational) { 1, 30 }; //enc_ctx->framerate = //(AVRational) { 30, 1 }; } else { //enc_ctx->sample_rate = dec_ctx->sample_rate; //enc_ctx->channel_layout = dec_ctx->channel_layout; //enc_ctx->channels = av_get_channel_layout_nb_channels(enc_ctx->channel_layout); //enc_ctx->sample_fmt = encoder->sample_fmts[0]; enc_ctx->time_base = (AVRational) { 1, dec_ctx->sample_rate }; } if (ffp->m_ofmt_ctx->flags & AVFMT_GLOBALHEADER) { enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; } ret = avcodec_open2(enc_ctx, encoder, NULL); if (ret < 0) { av_log(NULL, AV_LOG_ERROR, "Cannot open video encoder for stream #%u\n", i); goto end; } ret = avcodec_copy_context(out_stream->codec, in_stream->codec); //ret = avcodec_parameters_to_context(out_stream->codec, in_stream->codecpar); //ret = avcodec_parameters_from_context(out_stream->codecpar, enc_ctx); if (ret < 0) { av_log(NULL, AV_LOG_ERROR, "Failed to copy encoder parameters to output stream #%u\n", i); goto end; } out_stream->time_base = enc_ctx->time_base; stream_ctx[i].enc_ctx = enc_ctx; } av_dump_format(ffp->m_ofmt_ctx, 0, file_name, 1); // 打开输出文件 if (!(ffp->m_ofmt_ctx->oformat->flags & AVFMT_NOFILE)) { if (avio_open(&ffp->m_ofmt_ctx->pb, file_name, AVIO_FLAG_WRITE) < 0) { av_log(ffp, AV_LOG_ERROR, "Could not open output file '%s'", file_name); goto end; } } // 写视频文件头 if (avformat_write_header(ffp->m_ofmt_ctx, NULL) < 0) { av_log(ffp, AV_LOG_ERROR, "Error occurred when opening output file\n"); goto end; } ffp->is_first = 0; ffp->is_record = 1; ffp->record_error = 0; return 0; end: ffp->record_error = 1; return -1; } static void encode(FFPlayer *ffp,AVCodecContext *enc_ctx, AVFrame *frame) { int ret; int got_frame;// malloc(sizeof(int)); AVPacket pkt = { 0 }; av_init_packet(&pkt); pkt.data = NULL; pkt.size = 0; int stream_index=getMediaTypeStreamIndex(ffp,AVMEDIA_TYPE_VIDEO); /* send the frame to the encoder */ if (frame) printf("Send frame %3"PRId64"\n", frame->pts); /* //旧的api ret= avcodec_encode_video2(enc_ctx, &pkt,frame, &got_frame); if (ret < 0) return ret; if (!(got_frame)) { fprintf(stderr, "avcodec_encode_video2 fail \n"); return ; } ffp_record_file(ffp, &pkt); av_packet_unref(&pkt); */ //新的api ret = avcodec_send_frame(enc_ctx, frame); if (ret < 0) { fprintf(stderr, "Error sending a frame for encoding\n"); return -1; } while (1) { ret = avcodec_receive_packet(enc_ctx, &pkt); if (ret) { fprintf(stderr, "Error encoding ret= %d,%s \n", ret,av_err2str(ret)); break; } fprintf(stdout, " -----> encoding success!\n"); pkt.stream_index = stream_index; ffp_record_file(ffp,&pkt); av_packet_unref(&pkt); } } 提示Resource temporarily unavailable的截图 ![图片说明](https://img-ask.csdn.net/upload/201911/14/1573714996_774759.jpg) 生成的mp4文件无I帧截图 ![图片说明](https://img-ask.csdn.net/upload/201911/14/1573715130_904969.png)

FFmpeg中的avcodec_find_encoder_by_name("libx264")内幕是怎样的呢?

为什么我在win7、vs2015中可以得到一个AVCodec,而在win10、vs2017中却返回NULL呢? 新线索: 在win10、vs2017中,debug模式下此函数返回空,在release模式下不为空;

ffmpeg 无法定位程序输入点avcodec_alloc_context3

从zeranoe 下载的开发库 ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <libavcodec/avcodec.h> #include <libavutil/opt.h> #include <libavutil/imgutils.h> #pragma comment(lib, "avcodec.lib") #pragma comment(lib,"avutil.lib") int main(int argc, char **argv) { const char *filename, *codec_name; const AVCodec *codec; AVCodecContext *c = NULL; int i, ret, x, y; FILE *f; AVFrame *frame; AVPacket *pkt; uint8_t endcode[] = { 0, 0, 1, 0xb7 }; if (argc <= 2) { fprintf(stderr, "Usage: %s <output file> <codec name>\n", argv[0]); exit(0); } filename = argv[1]; codec_name = argv[2]; avcodec_register_all(); /* find the mpeg1video encoder */ codec = avcodec_find_encoder_by_name(codec_name); if (!codec) { fprintf(stderr, "Codec '%s' not found\n", codec_name); exit(1); } c = avcodec_alloc_context3(codec); if (!c) { fprintf(stderr, "Could not allocate video codec context\n"); exit(1); } av_opt_set(c->priv_data, "turn", "zerolatency", 0); return 0; } 只要加上av_opt_set(c->priv_data, "turn", "zerolatency", 0); 就会出现无法定位输入点 ```

使用ffmpeg方法avcodec_encode_video2 编码参数问题!

雷博的代码! 此处文件格式为YUV420P 使用ffmpeg编码h.264 ![图片说明](https://img-ask.csdn.net/upload/201801/11/1515659805_828534.png) 讲解一下这里的pFrame->data为什么要这样赋值? 代码链接:http://blog.csdn.net/leixiaohua1020/article/details/25430425 假如原始帧格式为YUYV422P的时候 data又该怎么赋值?

avcodec_decode_video2()解码不成功

调用ffmpeg的库从文件中读出视频流信息,利用av_read_frame提取帧,最后调用avcodec_decode_video2接口对帧进行解码,代码如下: AVFormatContext *pFormatCtx; AVCodecContext *pCodecCtx; AVCodec *pCodec; AVFrame *pFrame2; AVPacket packet2; int H264GetStream() { int i, videoindex; char filepath[]="sample.mp4"; av_register_all(); pFormatCtx = avformat_alloc_context(); if(avformat_open_input(&pFormatCtx,filepath,NULL,NULL)!=0){ printf("无法打开文件\n"); return -1; } if(avformat_find_stream_info(pFormatCtx,NULL)<0) { printf("Couldn't find stream information.\n"); return -1; } videoindex=-1; for(i=0; i<pFormatCtx->nb_streams; i++) if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO) { videoindex=i; break; } if(videoindex==-1) { printf("Didn't find a video stream.\n"); return -1; } pCodecCtx=pFormatCtx->streams[videoindex]->codec; pCodec=avcodec_find_decoder(pCodecCtx->codec_id); if(pCodec==NULL) { printf("Codec not found.\n"); return -1; } printf("pCodec=%d\n",pCodec->id); if(avcodec_open2(pCodecCtx, pCodec,NULL)<0) { printf("Could not open codec.\n"); return -1; } pFrame2=avcodec_alloc_frame(); int ret, got_picture; int y_size = pCodecCtx->width * pCodecCtx->height; //packet2=(AVPacket *)malloc(sizeof(AVPacket)); //av_new_packet(packet2, y_size); av_init_packet(&packet2); char filepath_out[]="bigbuckbunny_1920x1080.yuv"; fp_out = fopen(filepath_out, "wb"); if (!fp_out) { printf("Could not open output YUV file\n"); return -1; } //输出一下信息----------------------------- printf("文件信息-----------------------------------------\n"); av_dump_format(pFormatCtx,0,filepath,0); printf("-------------------------------------------------\n"); //------------------------------ while(av_read_frame(pFormatCtx, &packet2)>=0) { printf("packet2->stream_index=%d\n",packet2.stream_index); printf("videoindex=%d\n",videoindex); if(packet2.stream_index==videoindex) { printf("decode start!"); //packet->data[0]=0;packet->data[1]=0;packet->data[2]=0;packet->data[3]=1; // packet->size-=4; printf("packet2->data=%d %d %d %d\n",packet2.data[0],packet2.data[1],packet2.data[2],packet2.data[3]); printf("packet2->size=%d\n",packet2.size); ret = avcodec_decode_video2(pCodecCtx, pFrame2, &got_picture, &packet2); printf("got_picture=%x\n",got_picture); if(ret < 0) { printf("decode error!\n"); return -1; } if(got_picture) { printf("got_picture=%x\n",got_picture); //Y, U, V int i; for(i=0;i<pFrame->height;i++) { fwrite(pFrame->data[0]+pFrame->linesize[0]*i,1,pFrame->width,fp_out); } for(i=0;i<pFrame->height/2;i++) { fwrite(pFrame->data[1]+pFrame->linesize[1]*i,1,pFrame->width/2,fp_out); } for(i=0;i<pFrame->height/2;i++) { fwrite(pFrame->data[2]+pFrame->linesize[2]*i,1,pFrame->width/2,fp_out); } printf("Succeed to decode 1 frame!\n"); } } av_free_packet(&packet2); } //av_free(pFrameYUV); avcodec_close(pCodecCtx); avformat_close_input(&pFormatCtx); return 0; } 每次运行到ret = avcodec_decode_video2(pCodecCtx, pFrame2, &got_picture, &packet2)这一步程序就不再运行下去了,也没有任何返回值。 在这里打印信息检查了一下 while(av_read_frame(pFormatCtx, &packet2)>=0) { printf("packet2->stream_index=%d\n",packet2.stream_index); printf("videoindex=%d\n",videoindex); 发现packet2.stream_index的值一直不变,按道理应该还有一路音频流。 程序是在linux平台下运行的,求问哪里出错了!

FFmpeg:avcodec_find_encoder_by_name("libx264")返回空,是怎么回事呢?

FFmpeg编译时的参数:./configure --enable-shared --enable-static --enable-pic --enable-gpl --enable-avresample --enable-sdl --enable-libx264 cmd中使用ffmpeg -encoders ![图片说明](https://img-ask.csdn.net/upload/201912/15/1576374486_153947.jpg) 新线索: 在win7、vs2015中此函数不为空,在win10、vs2017中为空; 在win10、vs2017中的debug模式下,此函数返回空,release模式下不为空;

ffmpeg的avcodec_find_decoder(AV_CODEC_ID_BMP)返回空是怎么回事呢?

if (!avcodec_find_decoder(AV_CODEC_ID_BMP)) { exit(__LINE__); }

调用ffmpeg接口解码H264数据流,无法解码非关键帧

调用ffmpeg的avcodec_decode_video2接口解码H264数据帧,为什么只能解码关键帧,非关键帧都解码不到呢,代码如下: AVCodec *codec; AVPacket packet; AVFrame *pFrame; AVCodecContext *pcodec; av_init_packet(&packet); av_register_all(); codec = avcodec_find_decoder(AV_CODEC_ID_H264); if(!codec) { fprintf(stderr, "Codec not found\n"); return 0; } pcodec = avcodec_alloc_context3(codec); if (!pcodec) { fprintf(stderr, "Could not allocate audio codec context\n"); return 0; } pcodec->extradata =(uint8_t *)malloc(51); pcodec->extradata_size = 51; memcpy(pcodec->extradata, sps,43); memcpy(pcodec->extradata+43, pps,8); if(avcodec_open2(pcodec, codec,NULL) >= 0) pFrame = avcodec_alloc_frame();// Allocate video frame else return -1; int got_picture; packet.data = pBuffer;//这里填入一个指向完整H264数据帧的指针 packet.size = dwBufsize;//这个填入H264数据帧的大小 //printf("size of packet=%d\n",sizeof(packet)); printf("packet->size=%d\n",packet.size); int DecodeRet=avcodec_decode_video2(pcodec, pFrame, &got_picture, &packet); if (DecodeRet < 0) { printf("Decode Error.\n"); return DecodeRet; }

ffmpeg avcodec_open2问题

AVCodecContext *c; c->bit_rate = 400000; c->width = width; c->height = height; c->time_base = avRate; c->lmin = 1; c->lmax = 1000; c->me_method = 8; c->me_range = 16; c->me_subpel_quality = 7; c->qmin = 10; c->qmax = 51; c->gop_size = 12; /* emit one intra frame every twelve frames at most */ c->pix_fmt = PIX_FMT_YUV420P; if (c->codec_id == CODEC_ID_MPEG2VIDEO) { c->max_b_frames = 2; } if (c->codec_id == CODEC_ID_MPEG1VIDEO){ c->mb_decision=2; avcodec_open2宽度和高度不同时有时打开成功,有时失败,如1366*768打开成功,1365*767打开失败

FFmpeg C++ 的 avcodec_encode_video2 返回 -40

我想通過avcodec_encode_video2 覆蓋packet中的memory來達到刷新我做過特殊渲染的影像,但avcodec_encode_video2 的返回值是不成功-40問題: 我正常撥放輸出都沒問題 就是沒辦法蓋過圖層,是不是哪邊memory寫法不正確呢? 代碼如下: AVOutputFormat* ofmt = NULL; //Input AVFormatContext and Output AVFormatContext AVFormatContext* i_pFormatCtx = NULL, * out_pFormatCtx = NULL; AVCodecContext* pCodecCtx;//視頻解碼器 AVCodecContext* pCodecCtxAudio;//音頻解碼器 AVCodec* pCodec; AVCodec* pCodecAudio; AVPacket packet; string in_filename; string out_filename; int ret, i; int videoindex = -1; int audioindex = -1; int frame_index = 0; int64_t start_time = 0; uint8_t* buffer; AVFrame* pFrame; AVFrame* pFrameRGB; int frameFinished; int frameAudioFinished; int numBytes; AVStream* in_stream, * out_stream; vector<AVPacket> BIGpacket; in_filename = "D:/yolo/data_movie/f1.mp4"; out_filename = "rtmp://localhost:1935/live/home";//怀堤 URLㄗOutput URLㄘ[RTMP] //================ // 註冊: av_register_all(); //================ //Network avformat_network_init(); //======================= //Input if ((ret = avformat_open_input(&i_pFormatCtx, in_filename.c_str(), 0, 0)) < 0) { //printf("Could not open input file."); goto end; } if ((ret = avformat_find_stream_info(i_pFormatCtx, 0)) < 0) { //printf("Failed to retrieve input stream information"); goto end; } for (i = 0; i < i_pFormatCtx->nb_streams; i++) { if (i_pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) { videoindex = i; } if (i_pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) { audioindex = i; } } av_dump_format(i_pFormatCtx, 0, in_filename.c_str(), 0); //Output avformat_alloc_output_context2(&out_pFormatCtx, NULL, "flv", out_filename.c_str()); //RTMP if (!out_pFormatCtx) { //printf("Could not create output context\n"); ret = AVERROR_UNKNOWN; goto end; } ofmt = out_pFormatCtx->oformat; for (i = 0; i < i_pFormatCtx->nb_streams; i++) { //Create output AVStream according to input AVStream AVStream* in_stream = i_pFormatCtx->streams[i]; AVStream* out_stream = avformat_new_stream(out_pFormatCtx, in_stream->codec->codec); if (!out_stream) { AfxMessageBox(L"Failed allocating output stream"); //printf("Failed allocating output stream\n"); ret = AVERROR_UNKNOWN; goto end; } //Copy the settings of AVCodecContext ret = avcodec_copy_context(out_stream->codec, in_stream->codec); if (ret < 0) { //printf("Failed to copy context from input to output stream codec context\n"); goto end; } out_stream->codec->codec_tag = 0; if (out_pFormatCtx->oformat->flags & AVFMT_GLOBALHEADER) out_stream->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; } //====================================================================== // 打开視頻解码器 pCodecCtx = i_pFormatCtx->streams[videoindex]->codec; pCodec = avcodec_find_decoder(pCodecCtx->codec_id); if (avcodec_open2(pCodecCtx, pCodec, 0) < 0) { DbgPrint("Could not open codec"); return; } //====================================================================== // 打开音頻解码器 pCodecCtxAudio= i_pFormatCtx->streams[audioindex]->codec; pCodecAudio= avcodec_find_decoder(pCodecCtxAudio->codec_id); if (avcodec_open2(pCodecCtxAudio, pCodecAudio, 0) < 0) { DbgPrint("Could not open codec"); return; } #if OUTPUT_PCM pFile = fopen("output.pcm", "wb"); #endif** packet = *(AVPacket*)av_malloc(sizeof(AVPacket)); av_init_packet(&packet); //===================================================================== // 破解視頻某些编解码器可能生成的错误帧速率 if (pCodecCtx->time_base.num > 1000 && pCodecCtx->time_base.den == 1) { pCodecCtx->time_base.den = 1000; } // 分配视频帧 pFrame = av_frame_alloc(); // Allocate an AVFrame structure pFrameRGB = av_frame_alloc(); if (pFrameRGB == NULL) return; numBytes = avpicture_get_size(AV_PIX_FMT_RGB24, pCodecCtx->width,pCodecCtx->height);// Determine required buffer size and allocate buffer buffer = (uint8_t*)av_malloc(numBytes * sizeof(uint8_t)); avpicture_fill((AVPicture*)pFrameRGB, buffer, AV_PIX_FMT_RGB24,pCodecCtx->width, pCodecCtx->height);// Assign appropriate parts of buffer to image planes in pFrameRGB long prepts = 0; //Dump Format------------------ av_dump_format(out_pFormatCtx, 0, out_filename.c_str(), 1); //Open output URL if (!(ofmt->flags & AVFMT_NOFILE)) { ret = avio_open(&out_pFormatCtx->pb, out_filename.c_str(), AVIO_FLAG_WRITE); if (ret < 0) { AfxMessageBox(L"Could not open output URL"); //printf("Could not open output URL '%s'", out_filename); goto end; } } //Write file header ret = avformat_write_header(out_pFormatCtx, NULL); if (ret < 0) { //printf("Error occurred when opening output URL\n"); goto end; } start_time = av_gettime(); while (1) { //Get an AVPacket ret = av_read_frame(i_pFormatCtx, &packet); if (ret < 0) { break; } if (G_PAUSE) { break; } /* if (packet.stream_index == audioindex) { //聲音: ret = avcodec_decode_audio4(pCodecCtx, pFrame, &frameAudioFinished,&packet); } */ //Important:Delay if (packet.stream_index == videoindex) { //==================================================================================== //幀解碼器: int a=avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet);// Decode video frame //ret = avcodec_encode_video2(pCodecCtx, &packet, pFrameRGB, &frameFinished); if (frameFinished) { static struct SwsContext* img_convert_ctx; if (img_convert_ctx == NULL) { int w = pCodecCtx->width; int h = pCodecCtx->height; img_convert_ctx = sws_getContext(w, h, pCodecCtx->pix_fmt, w, h, AV_PIX_FMT_RGB24, 4, NULL, NULL, NULL); if (img_convert_ctx == NULL) { fprintf(stderr, "Cannot initialize the conversion context!\n"); exit(1); } } int ret = sws_scale(img_convert_ctx, pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize); if (ret == 0) { fprintf(stderr, "SWS_Scale failed [%d]!\n", ret); continue; } // Save the frame to disk if (i++ <= 5) { SaveFrame(pFrameRGB, pCodecCtx->width, pCodecCtx->height, i); } CopyDate(pFrameRGB, pCodecCtx->width, pCodecCtx->height, packet.pts - prepts); ret =avcodec_encode_video2(pCodecCtx, &packet, pFrameRGB, &frameFinished); if (ret < 0) { AfxMessageBox(L"Encoding失敗"); } prepts = packet.pts; } //============================================================================================== AVRational time_base = i_pFormatCtx->streams[videoindex]->time_base; AVRational time_base_q = { 1,AV_TIME_BASE }; int64_t pts_time = av_rescale_q(packet.dts, time_base, time_base_q); int64_t now_time = av_gettime() - start_time; if (pts_time > now_time) { av_usleep(pts_time - now_time); } } //Simple Write PTS if (packet.pts == AV_NOPTS_VALUE) { //Write PTS AVRational time_base1 = i_pFormatCtx->streams[videoindex]->time_base; //Duration between 2 frames (us) int64_t calc_duration = (double)AV_TIME_BASE / av_q2d(i_pFormatCtx->streams[videoindex]->r_frame_rate); //Parameters packet.pts = (double)(frame_index * calc_duration) / (double)(av_q2d(time_base1) * AV_TIME_BASE); packet.dts = packet.pts; packet.duration = (double)calc_duration / (double)(av_q2d(time_base1) * AV_TIME_BASE); } in_stream = i_pFormatCtx->streams[packet.stream_index]; out_stream = out_pFormatCtx->streams[packet.stream_index]; /* copy packet */ //Convert PTS/DTS packet.pts = av_rescale_q_rnd(packet.pts, in_stream->time_base, out_stream->time_base, (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)); packet.dts = av_rescale_q_rnd(packet.dts, in_stream->time_base, out_stream->time_base, (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)); packet.duration = av_rescale_q(packet.duration, in_stream->time_base, out_stream->time_base); packet.pos = -1; //Print to Screen if (packet.stream_index == videoindex) { //printf("Send %8d video frames to output URL\n", frame_index); frame_index++; //ret = av_interleaved_write_frame(out_pFormatCtx, &packet); } //ret = av_write_frame(ofmt_ctx, &pkt); ret = av_interleaved_write_frame(out_pFormatCtx, &packet); if (ret < 0) { //printf("Error muxing packet\n"); break; } av_free_packet(&packet); } //Write file trailer av_write_trailer(out_pFormatCtx); end: AfxMessageBox(L"Stream is closed"); avformat_close_input(&i_pFormatCtx); /* close output */ if (out_pFormatCtx && !(ofmt->flags & AVFMT_NOFILE)) avio_close(out_pFormatCtx->pb); avformat_free_context(out_pFormatCtx); if (ret < 0 && ret != AVERROR_EOF) { //printf("Error occurred.\n"); return ; } return;

ffmpeg解码MediaCodec的h264编码问题

安卓下用MediaCodec的h264编码: ``` boolean eof = false; MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); ByteBuffer[] outputBuffers = null; boolean sendKeyFrame = false; while (!eof) { int bufIndex = codec.dequeueOutputBuffer(bufferInfo, -1); eof = (bufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0; try { if (bufIndex >= 0) { if (outputBuffers == null) { outputBuffers = codec.getOutputBuffers(); } ByteBuffer codecBuffer = outputBuffers[bufIndex]; codecBuffer.position(bufferInfo.offset); codecBuffer.limit(bufferInfo.offset + bufferInfo.size); byte[] buf = new byte[bufferInfo.size]; codecBuffer.get(buf, 0, bufferInfo.size); Socket.sendVideo(buf); // 发送数据 } else if (bufIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) { outputBuffers = null; } else if (bufIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { MediaFormat outputFormat = codec.getOutputFormat(); } } finally { if (bufIndex >= 0) { codec.releaseOutputBuffer(bufIndex, false); } } } ``` PC下vc使用ffmpeg参考网上的解码h264流 https://blog.csdn.net/xushan239/article/details/79028111 https://www.cnblogs.com/lidabo/p/3326502.html 参考各种等等, 错误: avcodec_decode_video2或者avcodec_send_packet返回AVERROR_INVALIDD(-1094995529) 要不就是在avformat_open_input里无限循环read_packet 问: 哪里出问题? 本人对ffmpeg、MediaCodec都不熟悉,谁能帮忙解决一下?

ffmpeg解码h264视频流的问题

先上代码: int VideoDecoder_Decode(X264_H dwHandle, uint8_t *pDataIn, int nInSize, uint8_t *pDataOut, int nOutSize, int *nWidth, int *nHeight)//nOutSize { X264_Decoder_Handle *pHandle; //*i_frame_size = 0; if (dwHandle == 0) { return -1; } pHandle = (X264_Decoder_Handle *)dwHandle; //pHandle->inbuf_ptr = pDataIn; //pHandle->inSize = nInSize; pHandle->avpkt.size = nInSize; pHandle->avpkt.data = pDataIn; while (pHandle->avpkt.size > 0) { //LOGI("avcodec_decode_video2\n"); //pHandle->outSize = avcodec_decode_video2(pHandle->c, pHandle->picture, &pHandle->got_picture, // pHandle->inbuf_ptr, pHandle->inSize); pHandle->comsumedSize = avcodec_decode_video2(pHandle->c, pHandle->picture, &pHandle->got_picture, &(pHandle->avpkt)); if (pHandle->comsumedSize < 0) { //LOGE("Error while decoding frame InSize = %d comsumedSize = %d\n", pHandle->avpkt.size,pHandle->comsumedSize); //exit(1); printf("222222222222222222222222222222222222222222222222222222222222222"); return -1; } if (pHandle->got_picture) { //printf("saving frame %3d\n", pHandle->frame); fflush(stdout); /* the picture is allocated by the decoder. no need to free it */ *nWidth = pHandle->c->width; *nHeight = pHandle->c->height; if(nOutSize >= (pHandle->c->width)*(pHandle->c->height)*3/2) { pgm_save2(pHandle->picture->data[0], pHandle->picture->linesize[0],pHandle->c->width, pHandle->c->height,pDataOut); pgm_save2(pHandle->picture->data[1], pHandle->picture->linesize[1],pHandle->c->width/2, pHandle->c->height/2,pDataOut +pHandle->c->width * pHandle->c->height); pgm_save2(pHandle->picture->data[2], pHandle->picture->linesize[2],pHandle->c->width/2, pHandle->c->height/2,pDataOut +pHandle->c->width * pHandle->c->height*5/4); } pHandle->frame_count++; } if (pHandle->avpkt.data) { pHandle->avpkt.size -= pHandle->comsumedSize; pHandle->avpkt.data += pHandle->comsumedSize; } } printf("nOutSize: %d (pHandle->c->width)*(pHandle->c->height)*3/2: %d",nOutSize,(pHandle->c->width)*(pHandle->c->height)*3/2); if(nOutSize < (pHandle->c->width)*(pHandle->c->height)*3/2) { printf("33333333333333333333333333333333333333333333333333333333333333"); // printf("nOutSize: %d (pHandle->c->width)*(pHandle->c->height)*3/2: %d",nOutSize,(pHandle->c->width)*(pHandle->c->height)*3/2); return -1; } return 0; } 用ffmpeg支持64的解码库解码时,这段解码代码在iphone5及以下(32位设备)解码时没问题,但在iphone5以上设备(64位设备)上解码时在以下代码处崩溃了,有人说是地址不匹配: pHandle->avpkt.size = nInSize; pHandle->avpkt.data = pDataIn; 崩溃信息如下: ![图片说明](https://img-ask.csdn.net/upload/201508/05/1438745263_605799.png) 到底是什么原因呢,又该怎么解决,哪位大神能够帮忙解答一下,不胜感激....

FFMPEG实时解码RTP传输的H264流视频花屏

自己用QT写的程序,在PC上采集视频编码RTP打包发送。如果发送给自己,然后用VLC播放的话是可以正常显示的(尽管延迟会不断增大,这个问题再待解决),但是用自己编的软件确无法正常显示,能看到一瞬间有部分画面正常,然后一会画面就糊掉了。 同样的代码, 我在树莓派上,用OPENMAX硬件加速编码,然后同样的打包方式发送,发送给树莓派自己或者给PC,都能正常地显示。 不知道这个是哪部分出了原因?到底是FFMPEG编码部分出问题,还是接收的代码有问题?? 结果如图。。。![图片说明](https://img-ask.csdn.net/upload/201510/25/1445754428_146815.jpg) 然后程序会不断报类似如下错误 [h264 @ 17653080] Cannot use next picture in error concealment [h264 @ 17653080] concealing 1040 DC, 1040 AC, 1040 MV errors in P frame [h264 @ 17653080] Cannot use next picture in error concealment [h264 @ 17653080] concealing 1000 DC, 1000 AC, 1000 MV errors in P frame [h264 @ 17653080] Cannot use next picture in error concealment [h264 @ 17653080] concealing 1040 DC, 1040 AC, 1040 MV errors in P frame [h264 @ 17653080] Cannot use next picture in error concealment [h264 @ 17653080] concealing 1040 DC, 1040 AC, 1040 MV errors in P frame [h264 @ 17653080] Cannot use next picture in error concealment [h264 @ 17653080] concealing 1040 DC, 1040 AC, 1040 MV errors in P frame [h264 @ 17653080] Cannot use next picture in error concealment [h264 @ 17653080] concealing 1040 DC, 1040 AC, 1040 MV errors in P frame [h264 @ 17653080] Cannot use next picture in error concealment [h264 @ 17653080] concealing 1000 DC, 1000 AC, 1000 MV errors in P frame [h264 @ 17653080] Cannot use next picture in error concealment [h264 @ 17653080] concealing 1040 DC, 1040 AC, 1040 MV errors in P frame [h264 @ 17653080] Cannot use next picture in error concealment

ffmpeg解码播放H264解码播放的速度过快

在android平台上利用ffmpeg+anativewindow来播放h264的实时流发现播放的速度太快了。 听一些前辈说要增加延时。这块有点蒙蔽的。。求问一下该如何解决。

ffmpeg分离mp4文件中h265流

目前,在linux平台上使用ffmpeg完成mp4的demuxer功能,拿到原始ES流,送入硬件解码器解码. 针对h264,目前ffmpeg通过流过滤器av_bitstream_filter_init("h264_mp4toannexb");可以拿到NALU模块的PSP,PPS等数据。 但是目前针对h265编码格式的流,不知道如何处理,求高人指教? 目前,我想从GPAC源码中mp42ts模块中找解决办法,gpac从mp4中拿到es数据肯定会加NALU信息的,但是代码没怎么读懂!

使用ffmpeg保存H.264的RTSP流到AVI文件中程序执行没有报错,但是文件是空的。

使用ffmpeg保存H.264的RTSP流到AVI文件中程序执行没有报错,但是文件是空的,其中ffmpeg也根据文件名生成了相应的文件,,avformat_write_header ,av_interleaved_write_frame, av_interleaved_write_frame均返回0(0即正确返回)但是,为什么生成的AVI文件中是0个字节啊?

学Python后到底能干什么?网友:我太难了

感觉全世界营销文都在推Python,但是找不到工作的话,又有哪个机构会站出来给我推荐工作? 笔者冷静分析多方数据,想跟大家说:关于超越老牌霸主Java,过去几年间Python一直都被寄予厚望。但是事实是虽然上升趋势,但是国内环境下,一时间是无法马上就超越Java的,也可以换句话说:超越Java只是时间问题罢。 太嚣张了会Python的人!找工作拿高薪这么简单? https://edu....

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

为什么程序猿都不愿意去外包?

分享外包的组织架构,盈利模式,亲身经历,以及根据一些外包朋友的反馈,写了这篇文章 ,希望对正在找工作的老铁有所帮助

Java校招入职华为,半年后我跑路了

何来 我,一个双非本科弟弟,有幸在 19 届的秋招中得到前东家华为(以下简称 hw)的赏识,当时秋招签订就业协议,说是入了某 java bg,之后一系列组织架构调整原因等等让人无法理解的神操作,最终毕业前夕,被通知调往其他 bg 做嵌入式开发(纯 C 语言)。 由于已至于校招末尾,之前拿到的其他 offer 又无法再收回,一时感到无力回天,只得默默接受。 毕业后,直接入职开始了嵌入式苦旅,由于从未...

Java基础知识面试题(2020最新版)

文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类有何不同?Java应用程序与小程序之间有那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的对比基础语法数据类型Java有哪些数据类型switc...

@程序员:GitHub这个项目快薅羊毛

今天下午在朋友圈看到很多人都在发github的羊毛,一时没明白是怎么回事。 后来上百度搜索了一下,原来真有这回事,毕竟资源主义的羊毛不少啊,1000刀刷爆了朋友圈!不知道你们的朋友圈有没有看到类似的消息。 这到底是啥情况? 微软开发者平台GitHub 的一个区块链项目 Handshake ,搞了一个招募新会员的活动,面向GitHub 上前 25万名开发者派送 4,246.99 HNS币,大约价...

用python打开电脑摄像头,并把图像传回qq邮箱【Pyinstaller打包】

前言: 如何悄悄的打开朋友的摄像头,看看她最近过的怎么样,嘿嘿!这次让我带你们来实现这个功能。 注: 这个程序仅限在朋友之间开玩笑,别去搞什么违法的事情哦。 代码 发送邮件 使用python内置的email模块即可完成。导入相应的代码封装为一个send函数,顺便导入需要导入的包 注: 下面的代码有三处要修改的地方,两处写的qq邮箱地址,还有一处写的qq邮箱授权码,不知道qq邮箱授权码的可以去百度一...

做了5年运维,靠着这份监控知识体系,我从3K变成了40K

从来没讲过运维,因为我觉得运维这种东西不需要太多的知识面,然后我一个做了运维朋友告诉我大错特错,他就是从3K的运维一步步到40K的,甚至笑着说:我现在感觉自己什么都能做。 既然讲,就讲最重要的吧。 监控是整个运维乃至整个产品生命周期中最重要的一环,事前及时预警发现故障,事后提供详实的数据用于追查定位问题。目前业界有很多不错的开源产品可供选择。选择一款开源的监控系统,是一个省时省力、效率最高的方...

C++(继承):19---虚基类与虚继承(virtual)

一、菱形继承 在介绍虚继承之前介绍一下菱形继承 概念:A作为基类,B和C都继承与A。最后一个类D又继承于B和C,这样形式的继承称为菱形继承 菱形继承的缺点: 数据冗余:在D中会保存两份A的内容 访问不明确(二义性):因为D不知道是以B为中介去访问A还是以C为中介去访问A,因此在访问某些成员的时候会发生二义性 缺点的解决: 数据冗余:通过下面“虚继承”技术来解决(见下) 访问...

再不跳槽,应届毕业生拿的都比我多了!

跳槽几乎是每个人职业生涯的一部分,很多HR说“三年两跳”已经是一个跳槽频繁与否的阈值了,可为什么市面上有很多程序员不到一年就跳槽呢?他们不担心影响履历吗? PayScale之前发布的**《员工最短任期公司排行榜》中,两家码农大厂Amazon和Google**,以1年和1.1年的员工任期中位数分列第二、第四名。 PayScale:员工最短任期公司排行榜 意外的是,任期中位数极小的这两家公司,薪资...

我以为我学懂了数据结构,直到看了这个导图才发现,我错了

数据结构与算法思维导图

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

华为初面+综合面试(Java技术面)附上面试题

华为面试整体流程大致分为笔试,性格测试,面试,综合面试,回学校等结果。笔试来说,华为的难度较中等,选择题难度和网易腾讯差不多。最后的代码题,相比下来就简单很多,一共3道题目,前2题很容易就AC,题目已经记不太清楚,不过难度确实不大。最后一题最后提交的代码过了75%的样例,一直没有发现剩下的25%可能存在什么坑。 笔试部分太久远,我就不怎么回忆了。直接将面试。 面试 如果说腾讯的面试是挥金如土...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

win10暴力查看wifi密码

刚才邻居打了个电话说:喂小灰,你家wifi的密码是多少,我怎么连不上了。 我。。。 我也忘了哎,就找到了一个好办法,分享给大家: 第一种情况:已经连接上的wifi,怎么知道密码? 打开:控制面板\网络和 Internet\网络连接 然后右击wifi连接的无线网卡,选择状态 然后像下图一样: 第二种情况:前提是我不知道啊,但是我以前知道密码。 此时可以利用dos命令了 1、利用netsh wlan...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

总结了 150 余个神奇网站,你不来瞅瞅吗?

原博客再更新,可能就没了,之后将持续更新本篇博客。

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

女朋友过生日,我花了20分钟给她写了一个代理服务器

女朋友说:“看你最近挺辛苦的,我送你一个礼物吧。你看看想要什么,我来准备。” 我想了半天,从书到鞋子到电子产品最后到生活用品,感觉自己什么都不缺,然后和她说:“你省省钱吧,我什么都不需要。” 她坚持要送:“不行,你一定要说一个礼物,我想送你东西了。” 于是,我认真了起来,拿起手机,上淘宝逛了几分钟,但还是没能想出来缺点什么,最后实在没办法了:“这样吧,如果你实在想送东西,那你就写一个代理服务器吧”...

记一次腾讯面试,我挂在了最熟悉不过的队列上……

腾讯后台面试,面试官问:如何自己实现队列?

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

程序员写出这样的代码,能不挨骂吗?

当你换槽填坑时,面对一个新的环境。能够快速熟练,上手实现业务需求是关键。但是,哪些因素会影响你快速上手呢?是原有代码写的不够好?还是注释写的不够好?昨夜...

带了6个月的徒弟当了面试官,而身为高级工程师的我天天修Bug......

即将毕业的应届毕业生一枚,现在只拿到了两家offer,但最近听到一些消息,其中一个offer,我这个组据说客户很少,很有可能整组被裁掉。 想问大家: 如果我刚入职这个组就被裁了怎么办呢? 大家都是什么时候知道自己要被裁了的? 面试软技能指导: BQ/Project/Resume 试听内容: 除了刷题,还有哪些技能是拿到offer不可或缺的要素 如何提升面试软实力:简历, 行为面试,沟通能...

!大部分程序员只会写3年代码

如果世界上都是这种不思进取的软件公司,那别说大部分程序员只会写 3 年代码,恐怕就没有程序员这种职业。

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

立即提问
相关内容推荐