FFMPEG如何支持通过open_input的方式获取G711音频码流。 40C

需求:使用FFMPEG解码海康摄像头的H.264视频编码+G711音频编码的码流。
问题:在使用FFMPEG的open input 方法时可以获取视频stream但无法获取音频stream,
查得资料好像是FFMPEG的默认编译库支持H.264+AAC的封装而不支持H.264+G711,
是否有办法使FFMPEG可以通过open input和find stream的方式支持H.264+G711的码流呢?

1个回答

https://blog.csdn.net/g0415shenw/article/details/81432854
得到pcm之后再转换成你要的编码格式

qq_39426649
YQF, 回复try_learner: 我用的协议中可以区分视频流和音频流的,可以筛选出纯视频流的,
7 个月之前 回复
try_learner
try_learner 回复YQF,: 你好 你也是取的海康的摄像头的混合流吗?那怎么可以直接去掉音频只要视频呢?
9 个月之前 回复
qq_39426649
YQF, 难道FFMPEG在解码H.264+G711编码的码流时,只能手动将音频和视频数据分开解码再同步播放吗。。。。
10 个月之前 回复
qq_39426649
YQF, 您好,因为我项目中获取的码流是直接从摄像头获取的音频流和视频流的混杂流,我参照FFMPEG解码内存数据的方法将数据通过自定义AVIOContext的方式去解码,但是遇到的情况是使用avformat_find_stream_info时只能找到视频流无法找到音频流。
10 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
ffmpeg推流音频文件,ffplay拉流无法播放

1, 在做音频推流的时候,使用 ffmpeg -re -i waving_flag.mp3 -c copy -f mpegts udp://224.0.1.1:8090 推流. ffplay -f mpegts udp://224.0.1.1:8090 -fflags nobuffer 拉流播放没有问题. 2, 但是在使用 ffmpeg -re -i waving_flag.wav -c copy -f mpegts udp://224.0.1.1:8090 推流时 ffplay -f mpegts udp://224.0.1.1:8090 -fflags nobuffer 拉流就播放不了. 提示Failed to open file 'udp://224.0.1.1:8090' or configure filtergraph 把推流指令中的 -c copy 给去掉是可以正常拉流播放了. 3, 在使用我自己仿照雷博主使用ffmpeg SDK写的一个推流代码, 在输入为MP3格式文件时,能正常推出来, 使用 ffplay -f mpegts udp://224.0.1.1:8090 -fflags nobuffer 拉流是没有问题的 但是在选择输入音频格式的文件为aac时, 推流是正常的,可拉流这边就提示: Header missing Could not find codec parameters for stream 0 (Audio: mp3 ([3][0][0][0] / 0x0003), 0 channels, s16p): unspecified frame size Consider increasing the value for the 'analyzeduration' and 'probesize' options Input #0, mpegts, from 'udp://224.0.1.1:8090': Duration: N/A, start: 0.000000, bitrate: N/A Program 1 Metadata: service_name : Service01 service_provider: FFmpeg Stream #0:0[0x100]: Audio: mp3 ([3][0][0][0] / 0x0003), 0 channels, s16p Failed to open file 'udp://224.0.1.1:8090' or configure filtergraph 这里显示 Audio: mp3 可我明明输入的是aac 格式的文件. 为什么使用指令的时候,可以正常拉流播放, 在不加-c copy时, ffmpeg库内部做了哪些处理, 我仿照雷博主的这个推流代码应该怎么去改进,才能让他兼容更多的音频格式? 我想法就是: 是不是将输入的文件进行解码后重定向再统一编码为MP3格式推流出去吗?

FFmpeg - 为什么从pcm提取音频,编码为mp3以后,时长变多了,声音也颤抖

``` #include <memory> extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libavutil/imgutils.h" #include "libswresample/swresample.h" #include "libavutil/opt.h" #include "libavutil/avassert.h" #include "libavutil/audio_fifo.h" } // 函数退出后执行 #define DEFER(T, P, Fn) std::shared_ptr<T> P##deletor(P, [&](T *) {Fn;}) // 打印异常信息,并退出main函数 #define FATAL(M, ...) printf(M, ##__VA_ARGS__); return -1 // 自定义变量 const char *src_media = "E:/2.pcm"; const char *dst_media = "E:/3.mp3"; // PCM的原始参数 #define PCM_IN_FORMAT AV_SAMPLE_FMT_S16 #define PCM_IN_CHANNEL_LAYOUT AV_CH_LAYOUT_MONO #define PCM_IN_NB_SAMPLES 1024 #define PCM_IN_SAMPLE_RATE 44100 int main(int argc, char **argv) { // 申请一个输出的上下文 AVFormatContext *fmt_ctx = nullptr; avformat_alloc_output_context2(&fmt_ctx, nullptr, nullptr, dst_media); if (fmt_ctx == nullptr) { FATAL("alloc output format context failed."); } DEFER(AVFormatContext, fmt_ctx, avio_closep(&fmt_ctx->pb); avformat_close_input(&fmt_ctx)); // 查询编码器 AVCodec *audio_enc; if ((audio_enc = avcodec_find_encoder(fmt_ctx->oformat->audio_codec)) == nullptr) { FATAL("find audio encoder failed."); } AVStream *audio_stream = avformat_new_stream(fmt_ctx, audio_enc); audio_stream->id = fmt_ctx->nb_streams - 1; // 为编码器申请上下文 AVCodecContext *audio_enc_ctx = nullptr; if ((audio_enc_ctx = avcodec_alloc_context3(audio_enc)) == nullptr) { FATAL("allocate audio enc context failed."); } DEFER(AVCodecContext, audio_enc_ctx, avcodec_free_context(&audio_enc_ctx)); // 为编码器配置编码参数 audio_enc_ctx->sample_fmt = audio_enc->sample_fmts ? audio_enc->sample_fmts[0] : AV_SAMPLE_FMT_FLTP; audio_enc_ctx->bit_rate = 128000; audio_enc_ctx->sample_rate = 44100; audio_enc_ctx->channel_layout = AV_CH_LAYOUT_STEREO; audio_enc_ctx->channels = av_get_channel_layout_nb_channels(audio_enc_ctx->channel_layout); if (fmt_ctx->oformat->flags & AVFMT_GLOBALHEADER) { audio_enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; } audio_stream->time_base = AVRational{1, audio_enc_ctx->sample_rate}; // 打开编码器 if (avcodec_open2(audio_enc_ctx, audio_enc, nullptr) < 0) { FATAL("codec open failed."); } if (avcodec_parameters_from_context(audio_stream->codecpar, audio_enc_ctx) < 0) { FATAL("copy params failed."); } if (avio_open(&fmt_ctx->pb, dst_media, AVIO_FLAG_WRITE) < 0) { FATAL("open dst file failed."); } // 写入头信息 if (avformat_write_header(fmt_ctx, nullptr) < 0) { FATAL("write header failed."); } // 申请一个音频frame AVFrame *audio_frame = nullptr; if ((audio_frame = av_frame_alloc()) == nullptr) { FATAL("allocate frame failed."); } DEFER(AVFrame, audio_frame, av_frame_free(&audio_frame)); audio_frame->format = audio_enc_ctx->sample_fmt; audio_frame->channel_layout = audio_enc_ctx->channel_layout; audio_frame->nb_samples = audio_enc_ctx->frame_size; audio_frame->sample_rate = audio_enc_ctx->sample_rate; // 给frame的data和size分配空间 if (av_frame_get_buffer(audio_frame, 0) < 0) { FATAL("allocate frame data failed."); } // 创建swr的上下文 SwrContext *swr_cxt = swr_alloc(); DEFER(SwrContext, swr_cxt, swr_free(&swr_cxt)); // 获取输入与输出的采样格式 enum AVSampleFormat in_sample_fmt = PCM_IN_FORMAT; enum AVSampleFormat out_sample_fmt = audio_enc_ctx->sample_fmt; // 获取输入与输出的采样率 int in_sample_rate = PCM_IN_SAMPLE_RATE; int out_sample_rate = audio_enc_ctx->sample_rate; // 获取输入与输出的声道格式 uint64_t in_ch_layout = PCM_IN_CHANNEL_LAYOUT; uint64_t out_ch_layout = audio_enc_ctx->channel_layout; // 设置swr的配置项 swr_alloc_set_opts(swr_cxt, out_ch_layout, out_sample_fmt, out_sample_rate, in_ch_layout, in_sample_fmt, in_sample_rate, 0, nullptr); // 初始化swr swr_init(swr_cxt); // 申请一个packet,并初始化 AVPacket pkt; av_init_packet(&pkt); pkt.data = nullptr; pkt.size = 0; FILE *input = nullptr; if ((input = fopen(src_media, "rb")) == nullptr) { FATAL("no readable file."); } DEFER(FILE, input, fclose(input)); // 从文件中读取出来的数据,临时存储在该帧中 AVFrame *temp_frame = av_frame_alloc(); DEFER(AVFrame, temp_frame, av_frame_free(&temp_frame)); temp_frame->format = PCM_IN_FORMAT; temp_frame->nb_samples = PCM_IN_NB_SAMPLES; temp_frame->channel_layout = PCM_IN_CHANNEL_LAYOUT; temp_frame->channels = av_get_channel_layout_nb_channels(PCM_IN_CHANNEL_LAYOUT); // 给frame的data和size分配空间 if (av_frame_get_buffer(temp_frame, 0) < 0) { FATAL("allocate frame data failed."); } // 循环读取frame数据 int frame_count = 0; while (true) { if (av_frame_make_writable(audio_frame) < 0) { FATAL("frame is not writable"); } if (fread(temp_frame->data[0], 1, (size_t) temp_frame->linesize[0], input) < 0) { FATAL("read input file failed."); } else if (feof(input)) { break; } swr_convert(swr_cxt, audio_frame->data, audio_frame->nb_samples, (const uint8_t **) temp_frame->data, temp_frame->nb_samples); audio_frame->pts = av_rescale_q(frame_count, (AVRational){1, audio_enc_ctx->sample_rate}, audio_enc_ctx->time_base); frame_count += audio_frame->nb_samples; // 发送一个frame if (avcodec_send_frame(audio_enc_ctx, audio_frame) < 0) { FATAL("send frame exception."); } // 接受编码完的内容 while (true) { auto packet_ret = avcodec_receive_packet(audio_enc_ctx, &pkt); // 判断是否完全接受了packet if (packet_ret == AVERROR(EAGAIN) || packet_ret == AVERROR_EOF) { break; } // 检查是否接受异常 if (packet_ret < 0) { FATAL("receive packet exception."); } av_packet_rescale_ts(&pkt, audio_enc_ctx->time_base, audio_stream->time_base); pkt.stream_index = audio_stream->index; av_interleaved_write_frame(fmt_ctx, &pkt); av_packet_unref(&pkt); } } // 发送一个空的frame,告知编码器,已经编码完成,清空缓冲区 if (avcodec_send_frame(audio_enc_ctx, nullptr) < 0) { FATAL("send frame exception."); } // 接受编码完的内容 while (true) { auto packet_ret = avcodec_receive_packet(audio_enc_ctx, &pkt); // 判断是否完全接受了packet if (packet_ret == AVERROR(EAGAIN) || packet_ret == AVERROR_EOF) { break; } // 检查是否接受异常 if (packet_ret < 0) { FATAL("receive packet exception."); } av_packet_rescale_ts(&pkt, audio_enc_ctx->time_base, audio_stream->time_base); pkt.stream_index = audio_stream->index; av_interleaved_write_frame(fmt_ctx, &pkt); av_packet_unref(&pkt); } av_write_trailer(fmt_ctx); return 0; } ``` ### 问题已经解决,请看下面的代码 ```cpp #include <memory> extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libswresample/swresample.h" } // 申请智能指针变量 #define NEW_PTR(T, P, V, Fn) T *P = V; std::shared_ptr<T> P##P(P, [&P](T *){if(P != nullptr){Fn;}}) // 打印异常信息,并退出main函数 #define FATAL(M, ...) printf(M, ##__VA_ARGS__); return -1 // 自定义变量 const char *src_media = "D:/2.pcm"; const char *dst_media = "D:/2.mp3"; // PCM的原始参数 #define PCM_IN_FORMAT AV_SAMPLE_FMT_S16 #define PCM_IN_CHANNELS 1 #define PCM_IN_SAMPLE_RATE 44100 int main(int argc, char **argv) { // 申请一个输出的上下文 NEW_PTR(AVFormatContext, fmt_ctx, nullptr, avio_closep(&fmt_ctx->pb); avformat_close_input(&fmt_ctx)); avformat_alloc_output_context2(&fmt_ctx, nullptr, nullptr, dst_media); if (fmt_ctx == nullptr) { FATAL("alloc output format context failed."); } // 查询编码器 AVCodec *audio_enc; if ((audio_enc = avcodec_find_encoder(fmt_ctx->oformat->audio_codec)) == nullptr) { FATAL("find audio encoder failed."); } // 为编码器申请上下文 NEW_PTR(AVCodecContext, audio_enc_ctx, nullptr, avcodec_free_context(&audio_enc_ctx)); if ((audio_enc_ctx = avcodec_alloc_context3(audio_enc)) == nullptr) { FATAL("allocate audio enc context failed."); } // 为编码器配置编码参数 audio_enc_ctx->sample_fmt = audio_enc->sample_fmts ? audio_enc->sample_fmts[0] : AV_SAMPLE_FMT_FLTP; audio_enc_ctx->bit_rate = 64000; audio_enc_ctx->sample_rate = 44100; audio_enc_ctx->channel_layout = AV_CH_LAYOUT_STEREO; audio_enc_ctx->channels = av_get_channel_layout_nb_channels(audio_enc_ctx->channel_layout); if (fmt_ctx->oformat->flags & AVFMT_GLOBALHEADER) { audio_enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; } // 打开编码器 if (avcodec_open2(audio_enc_ctx, audio_enc, nullptr) < 0) { FATAL("codec open failed."); } AVStream *audio_stream = avformat_new_stream(fmt_ctx, audio_enc); audio_stream->id = fmt_ctx->nb_streams - 1; audio_stream->time_base = AVRational{1, audio_enc_ctx->sample_rate}; if (avcodec_parameters_from_context(audio_stream->codecpar, audio_enc_ctx) < 0) { FATAL("copy params failed."); } if (avio_open(&fmt_ctx->pb, dst_media, AVIO_FLAG_WRITE) < 0) { FATAL("open dst file failed."); } // 写入头信息 if (avformat_write_header(fmt_ctx, nullptr) < 0) { FATAL("write header failed."); } // 申请一个音频frame NEW_PTR(AVFrame, audio_frame, nullptr, av_frame_free(&audio_frame)); if ((audio_frame = av_frame_alloc()) == nullptr) { FATAL("allocate frame failed."); } audio_frame->format = audio_enc_ctx->sample_fmt; audio_frame->channel_layout = audio_enc_ctx->channel_layout; audio_frame->nb_samples = audio_enc_ctx->frame_size; audio_frame->sample_rate = audio_enc_ctx->sample_rate; if (av_frame_get_buffer(audio_frame, 0) < 0) { FATAL("audio frame get buffer failed."); } // 创建一个frame,用来存储从pcm读取的数据 NEW_PTR(AVFrame, buf_frame, nullptr, av_frame_free(&buf_frame)); if ((buf_frame = av_frame_alloc()) == nullptr) { FATAL("allocate buf frame failed."); } buf_frame->format = PCM_IN_FORMAT; buf_frame->nb_samples = audio_frame->nb_samples; buf_frame->channel_layout = (uint64_t) av_get_default_channel_layout(PCM_IN_CHANNELS); buf_frame->sample_rate = PCM_IN_SAMPLE_RATE; if (av_frame_get_buffer(buf_frame, 0) < 0) { FATAL("create buf frame buffer failed."); } // 从pcm文件中读取适应音频帧的尺寸数据 auto readSize = av_samples_get_buffer_size(nullptr, buf_frame->channels, buf_frame->nb_samples, (AVSampleFormat) buf_frame->format, 1); NEW_PTR(uint8_t , buf, (uint8_t*)av_malloc((size_t)readSize), av_freep(&buf)); // 创建swr的上下文 NEW_PTR(SwrContext, swr_ctx, swr_alloc(), swr_free(&swr_ctx)); swr_alloc_set_opts(swr_ctx, audio_frame->channel_layout, (AVSampleFormat)audio_frame->format, audio_frame->sample_rate, av_get_default_channel_layout(PCM_IN_CHANNELS), PCM_IN_FORMAT, PCM_IN_SAMPLE_RATE, 0, nullptr); swr_init(swr_ctx); // 申请一个packet,并初始化 AVPacket pkt; av_init_packet(&pkt); pkt.data = nullptr; pkt.size = 0; NEW_PTR(FILE, input, nullptr, fclose(input)); if ((input = fopen(src_media, "rb")) == nullptr) { FATAL("no readable file."); } // 循环读取frame数据 int audio_pts = 0; while (true) { // 用来编码的帧 AVFrame * encode_frame = nullptr; if (fread(buf, 1, (size_t) readSize, input) < 0) { FATAL("read input file failed."); } else if (!feof(input)) { // 文件没有到结尾,则获取编码帧 av_samples_fill_arrays(buf_frame->data, buf_frame->linesize, (const uint8_t*)buf, buf_frame->channels, buf_frame->nb_samples, (AVSampleFormat)buf_frame->format, 1); swr_convert(swr_ctx, audio_frame->data, audio_frame->nb_samples, (const uint8_t**)buf_frame->data, buf_frame->nb_samples); audio_frame->pts = audio_pts; audio_pts += av_rescale_q(audio_frame->nb_samples, AVRational{1, audio_enc_ctx->frame_size}, audio_enc_ctx->time_base); encode_frame = audio_frame; } else { // 文件结束了,则发送一个空指针的frame,用来清空缓冲区 encode_frame = nullptr; } // 发送一个frame if (avcodec_send_frame(audio_enc_ctx, encode_frame) < 0) { FATAL("send frame exception."); } // 接受编码完的内容 while (true) { auto packet_ret = avcodec_receive_packet(audio_enc_ctx, &pkt); // 判断是否完全接受了packet if (packet_ret == AVERROR(EAGAIN) || packet_ret == AVERROR_EOF) { break; } // 检查是否接受异常 if (packet_ret < 0) { FATAL("receive packet exception."); } av_packet_rescale_ts(&pkt, audio_enc_ctx->time_base, audio_stream->time_base); pkt.stream_index = audio_stream->index; av_interleaved_write_frame(fmt_ctx, &pkt); av_packet_unref(&pkt); } // 编码帧为空,则表示已经处理完所有的编码,退出该循环 if (encode_frame == nullptr) break; } av_write_trailer(fmt_ctx); return 0; } ```

ffmpeg4通过调用SDK,给视频添加水印封装出来的视频只有声音,图像为黑屏。求各位大神给分析分析。

希望实现的是对任意的视频文件添加水印,等同于命令行 >> ffmpeg -i D:\mmRun.mp4 -vf drawtext=fontfile=text=welcome D:\mmRun_Water.mp4 然而由于本人对ffmpeg了解不深,始终无法达到想要的效果,请各位大侠帮忙看看究竟是哪里出了问题。 当前共有两个问题 1. 视频保存出来有声音,但是画面为黑屏? 2. 输入进入的原视频问题为24M,为何保存出来的目标视频文件足足有330M? ```cpp #include <windows.h> #include <tchar.h> extern "C" { #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libavfilter/avfilter.h> #include <libavfilter/buffersrc.h> #include <libavfilter/buffersink.h> #include <libavutil/opt.h> } #pragma comment(lib, "avcodec.lib") #pragma comment(lib, "avformat.lib") #pragma comment(lib, "avfilter.lib") #pragma comment(lib, "avutil.lib") AVFormatContext* pInputFormatCtx = NULL; AVCodecContext* pInputEncContext = NULL; AVCodec* pInputCodec = NULL; int iVideoStream = 0; AVPacket packetinput = { 0 }; AVPacket packetoutput = { 0 }; AVFrame* frameinput = NULL; AVFrame* framefilt = NULL; AVFilterGraph* filtGraph = NULL; AVFilterContext* filtBufferSrcCtx = NULL; AVFilterContext* filtBufferSinkCtx = NULL; AVFormatContext* pOutputFormatCtx = NULL; AVCodec* pOutCodec = NULL; AVCodecContext* pOutputEncContext = NULL; AVStream** out_streams = NULL; const char* szInputFileName = "D:\\mmRun.mp4"; const char* szOutputFileName = "D:\\mmRun_water.mp4"; int InitFilter() { int iError = 0; char argsfilter[512] = { 0 }; snprintf(argsfilter, _countof(argsfilter), "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d", pInputEncContext->width, pInputEncContext->height, pInputEncContext->pix_fmt, pInputFormatCtx->streams[iVideoStream]->time_base.num, pInputFormatCtx->streams[iVideoStream]->time_base.den, pInputEncContext->sample_aspect_ratio.num, pInputEncContext->sample_aspect_ratio.den); const AVFilter* filtbuffer = avfilter_get_by_name("buffer"); const AVFilter* filtbuffersink = avfilter_get_by_name("buffersink"); AVFilterInOut* filtoutputs = avfilter_inout_alloc(); AVFilterInOut* filtinputs = avfilter_inout_alloc(); filtGraph = avfilter_graph_alloc(); if (NULL == filtGraph) { goto FUN_CLEAN; } iError = avfilter_graph_create_filter(&filtBufferSrcCtx, filtbuffer, "in", argsfilter, NULL, filtGraph); if (0 > iError) { goto FUN_CLEAN; } iError = avfilter_graph_create_filter(&filtBufferSinkCtx, filtbuffersink, "out", NULL, NULL, filtGraph); if (0 > iError) { goto FUN_CLEAN; } filtoutputs->name = av_strdup("in"); filtoutputs->filter_ctx = filtBufferSrcCtx; filtoutputs->pad_idx = 0; filtoutputs->next = NULL; filtinputs->name = av_strdup("out"); filtinputs->filter_ctx = filtBufferSinkCtx; filtinputs->pad_idx = 0; filtinputs->next = NULL; iError = avfilter_graph_parse_ptr(filtGraph, "drawtext=text=welcome output", &filtinputs, &filtoutputs, NULL); if (0 > iError) { goto FUN_CLEAN; } iError = avfilter_graph_config(filtGraph, NULL); if (0 > iError) { goto FUN_CLEAN; } avfilter_inout_free(&filtoutputs); avfilter_inout_free(&filtinputs); return iError; FUN_CLEAN: if (NULL != filtGraph) { avfilter_graph_free(&filtGraph); filtGraph = NULL; } if (NULL != filtoutputs) { avfilter_inout_free(&filtoutputs); filtoutputs = NULL; } if (NULL != filtinputs) { avfilter_inout_free(&filtinputs); filtinputs = NULL; } filtBufferSrcCtx = NULL; filtBufferSinkCtx = NULL; return -1; } int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int iError = 0; //打开输入文件开始 iError = avformat_open_input(&pInputFormatCtx, szInputFileName, NULL, NULL); if (0 != iError) { goto FUN_CLEANUP_INPUT; } iError = avformat_find_stream_info(pInputFormatCtx, NULL); if (0 > iError) { goto FUN_CLEANUP_INPUT; } iVideoStream = av_find_best_stream(pInputFormatCtx, AVMEDIA_TYPE_VIDEO, -1, -1, &pInputCodec, 0); if (0 > iVideoStream) { goto FUN_CLEANUP_INPUT; } pInputEncContext = avcodec_alloc_context3(pInputCodec); iError = avcodec_parameters_to_context(pInputEncContext, pInputFormatCtx->streams[iVideoStream]->codecpar); if (0 > iError) { goto FUN_CLEANUP_INPUT; } iError = avcodec_open2(pInputEncContext, pInputCodec, NULL); if (0 != iError) { goto FUN_CLEANUP_INPUT; } //打开输入文件结束 for (UINT index = 0; index < pInputFormatCtx->nb_streams; ++index) { printf("===============================\n"); printf("info Streams[%d]: %d\n", index, pInputFormatCtx->streams[index]->codecpar->codec_type); av_dump_format(pInputFormatCtx, index, szInputFileName, 0); } /********打开输出文件初始化 begin********/ iError = avformat_alloc_output_context2(&pOutputFormatCtx, NULL, NULL, szOutputFileName); if (0 > iError) { goto FUN_CLEANUP_INPUT; } out_streams = new AVStream * [pInputFormatCtx->nb_streams]; memset(out_streams, 0, pInputFormatCtx->nb_streams * sizeof(AVStream*)); for (UINT uStreamIndex = 0; uStreamIndex < pInputFormatCtx->nb_streams; ++uStreamIndex) { out_streams[uStreamIndex] = avformat_new_stream(pOutputFormatCtx, NULL); avcodec_parameters_copy(out_streams[uStreamIndex]->codecpar, pInputFormatCtx->streams[uStreamIndex]->codecpar); out_streams[uStreamIndex]->codecpar->codec_tag = 0; } pOutCodec = avcodec_find_encoder(pOutputFormatCtx->streams[iVideoStream]->codecpar->codec_id); if (NULL == pOutCodec) { goto FUN_CLEANUP_INPUT; } pOutputEncContext = avcodec_alloc_context3(pOutCodec); iError = avcodec_parameters_to_context(pOutputEncContext, pOutputFormatCtx->streams[iVideoStream]->codecpar); if (0 > iError) { goto FUN_CLEANUP_INPUT; } pOutputEncContext->time_base.den = pInputFormatCtx->streams[iVideoStream]->avg_frame_rate.den; pOutputEncContext->time_base.num = pInputFormatCtx->streams[iVideoStream]->avg_frame_rate.num; pOutputEncContext->sample_aspect_ratio = pInputEncContext->sample_aspect_ratio; pOutputEncContext->width = pInputEncContext->width; pOutputEncContext->height = pInputEncContext->height; /*pOutputEncContext->gop_size = 10; pOutputEncContext->max_b_frames = 1;*/ iError = avcodec_open2(pOutputEncContext, pOutCodec, NULL); if (0 != iError) { goto FUN_CLEANUP_INPUT; } if (!(pOutputFormatCtx->oformat->flags & AVFMT_NOFILE)) { iError = avio_open(&pOutputFormatCtx->pb, szOutputFileName, AVIO_FLAG_WRITE); } printf("Output=======================================================\n"); for (UINT index = 0; index < pOutputFormatCtx->nb_streams; ++index) { printf("===============================\n"); printf("info Streams[%d]: %d\n", index, pOutputFormatCtx->streams[index]->codecpar->codec_type); av_dump_format(pOutputFormatCtx, index, szOutputFileName, 1); } avformat_write_header(pOutputFormatCtx, NULL); /********打开输出文件初始化 end********/ //初始化滤镜开始 iError = InitFilter(); if (0 != iError) { goto FUN_CLEANUP_INPUT; } //初始化滤镜结束 frameinput = av_frame_alloc(); if (NULL == frameinput) { goto FUN_CLEANUP_INPUT; } framefilt = av_frame_alloc(); if (NULL == framefilt) { goto FUN_CLEANUP_INPUT; } while (true) { iError = av_read_frame(pInputFormatCtx, &packetinput); if (0 > iError) { break; } av_packet_rescale_ts(&packetinput, pInputFormatCtx->streams[packetinput.stream_index]->time_base, out_streams[packetinput.stream_index]->time_base); if (packetinput.stream_index == iVideoStream) { iError = avcodec_send_packet(pInputEncContext, &packetinput); if (0 != iError) { break; } while (iError >= 0) { iError = avcodec_receive_frame(pInputEncContext, frameinput); if (iError == AVERROR(EAGAIN) || iError == AVERROR_EOF) { break; } else if (iError < 0) { goto FUN_CLEANUP_INPUT; } frameinput->pts = frameinput->best_effort_timestamp; iError = av_buffersrc_add_frame_flags(filtBufferSrcCtx, frameinput, AV_BUFFERSRC_FLAG_KEEP_REF); if (0 > iError) { break; } while (true) { iError = av_buffersink_get_frame(filtBufferSinkCtx, framefilt); if (iError == AVERROR(EAGAIN) || iError == AVERROR_EOF) { break; } if (0 > iError) { goto FUN_CLEANUP_INPUT; } iError = avcodec_send_frame(pOutputEncContext, framefilt); if (0 > iError) { goto FUN_CLEANUP_INPUT; } while (iError >= 0) { iError = avcodec_receive_packet(pOutputEncContext, &packetoutput); if (iError == AVERROR(EAGAIN) || iError == AVERROR_EOF) { break; } else if (iError < 0) { goto FUN_CLEANUP_INPUT; } av_write_frame(pOutputFormatCtx, &packetoutput); av_packet_unref(&packetoutput); } av_frame_unref(framefilt); } } } else { //其他流 av_write_frame(pOutputFormatCtx, &packetinput); } } av_write_trailer(pOutputFormatCtx); FUN_CLEANUP_INPUT: if (NULL != pInputFormatCtx) { avformat_close_input(&pInputFormatCtx); pInputFormatCtx = NULL; } if (NULL != pInputEncContext) { avcodec_free_context(&pInputEncContext); pInputEncContext = NULL; } if (NULL != frameinput) { av_frame_free(&frameinput); frameinput = NULL; } if (NULL != framefilt) { av_frame_free(&framefilt); framefilt = NULL; } if (NULL != pOutputFormatCtx) { avformat_free_context(pOutputFormatCtx); pOutputFormatCtx = NULL; } if (NULL != out_streams) { delete[] out_streams; out_streams = NULL; } if (NULL != pOutputFormatCtx) { avformat_free_context(pOutputFormatCtx); pOutputFormatCtx = NULL; } if (NULL != pOutputEncContext) { avcodec_free_context(&pOutputEncContext); pOutputEncContext = NULL; } /*avcodec_close(); avformat_free_context();*/ system("pause"); return 0; } ```

在用ffmpeg 2.0做一个转码工具的时候,转出的视频 视频播放速度变快

在用最新版 ffmpeg 2.0 转换视频的时候 首先遇到的一个问题是 在 avformat_write_header(pFormatCtxOut, NULL); 处报错:[mp4 @ 0x8183600] track 1: codec frame size is not set 虽然报了这个错误 但是还是能够转码,只是转出来的视频本来30秒 但是15秒左右就没有了,应该没有丢帧,只不过画面播放得特别快,就像快进一样。下面是源码,求大神 出场--- // Created by showself on 13-8-19. // Copyright (c) 2013年 showself. All rights reserved. // #include <stdio.h> #include "test2.h" #include <stdlib.h> #include <stdio.h> #include <string.h> #include <math.h> #include <libavutil/opt.h> #include <libavutil/mathematics.h> #include <libavformat/avformat.h> #include <libswscale/swscale.h> #include <libswresample/swresample.h> static AVStream *add_stream(AVFormatContext *oc, AVCodec **codec, enum AVCodecID codec_id); void transTest2(const char *src, const char *dst) { const char *filename; const char *outfilename; AVFormatContext *pFormatCtxIn,*pFormatCtxOut; AVInputFormat *inFmt; AVOutputFormat *outFmt; AVStream *audio_st,*video_st; AVFrame *pFrameIn; AVCodecContext *pVideoCodecCtxIn,*pAudioCodecCtxIn,*pVideoCodecCtxOut,*pAudioCodecCtxOut; AVCodec *pVideoCodecIn,*pAudioCodecIn,*pVideoCodecOut,*pAudioCodecOut; int i ,videoStream,audioStream;; int ret = 0; AVPacket packet; // int frame_count; /* Initialize libavcodec, and register all codecs and formats. */ av_register_all(); if (src == NULL) { printf("no input file"); return; } filename = src; outfilename = dst; /*get inout format*/ inFmt = av_find_input_format("MOV"); /*allocate the input media context*/ pFormatCtxIn = avformat_alloc_context(); if (pFormatCtxIn == NULL) { printf("allocate the input media context error"); return; } // open a video if (avformat_open_input(&pFormatCtxIn, filename, inFmt, NULL)) { return; } // get stream info if (avformat_find_stream_info(pFormatCtxIn, NULL)<0) { return; } // get streams index from a video videoStream = -1; audioStream = -1; for (i=0; i<pFormatCtxIn->nb_streams; i++) { if(pFormatCtxIn->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO) { printf("%d stream 为视频\n",i); videoStream=i; } if (pFormatCtxIn->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) { audioStream = i;// 音轨位置 printf("%d stream 为音轨\n",i); } } if(videoStream==-1) return ; // Didn't find a video stream or Did not find a audio stream if (audioStream == -1) { return; } // get decode codec contex pointer pVideoCodecCtxIn = pFormatCtxIn->streams[videoStream]->codec; pAudioCodecCtxIn = pFormatCtxIn->streams[audioStream]->codec; // get decode codec pointer pVideoCodecIn = avcodec_find_decoder(pVideoCodecCtxIn->codec_id); if (pVideoCodecIn == NULL) { return; } pAudioCodecIn = avcodec_find_decoder(pAudioCodecCtxIn->codec_id); if (pAudioCodecIn == NULL) { return; } // open codec if (avcodec_open2(pVideoCodecCtxIn, pVideoCodecIn, NULL)<0) { return; } if (avcodec_open2(pAudioCodecCtxIn, pAudioCodecIn, NULL)<0) { return; } // allocate input frame pFrameIn = av_frame_alloc(); if (pFrameIn == NULL) { return; } /* allocate the output media context */ // // method 1 // avformat_alloc_output_context2(&pFormatCtxOut, NULL, NULL, outfilename); // if (!pFormatCtxOut) { // printf("Could not deduce output format from file extension: using MPEG.\n"); // avformat_alloc_output_context2(&pFormatCtxOut, NULL, "mpeg", outfilename); // } // if (!pFormatCtxOut) { // return ; // } // method 2 outFmt = av_guess_format(NULL, outfilename, NULL); if (outFmt == NULL) { return; } pFormatCtxOut = avformat_alloc_context(); if (pFormatCtxOut == NULL) { return; } pFormatCtxOut->oformat = outFmt; sprintf(pFormatCtxOut->filename, "%s",outfilename); // get output codec from AVOutputContext pVideoCodecOut = avcodec_find_encoder(outFmt->video_codec); if (pVideoCodecOut == NULL) { return; } pAudioCodecOut = avcodec_find_encoder(outFmt->audio_codec); if (pAudioCodecOut == NULL) { return; } /* Add the audio and video streams using the default format codecs * and initialize the codecs. */ video_st = NULL; audio_st = NULL; // 添加一条视频流 if (outFmt->video_codec != AV_CODEC_ID_NONE) { // 解码 源视频流 video_st = avformat_new_stream(pFormatCtxOut, pVideoCodecOut); if (video_st == NULL) { return; } pVideoCodecCtxOut = video_st->codec; pVideoCodecCtxOut->codec_type = AVMEDIA_TYPE_VIDEO; pVideoCodecCtxOut->codec_id = outFmt->video_codec; pVideoCodecCtxOut->bit_rate = pVideoCodecCtxIn->bit_rate/2; pVideoCodecCtxOut->width = pVideoCodecCtxIn->width; pVideoCodecCtxOut->height = pVideoCodecCtxIn->height; pVideoCodecCtxOut->time_base.den = 25; pVideoCodecCtxOut->time_base.num = 1; pVideoCodecCtxOut->gop_size = 12; pVideoCodecCtxOut->pix_fmt = PIX_FMT_YUV420P; if (pVideoCodecCtxOut->codec_id == AV_CODEC_ID_MPEG2VIDEO) { /* just for testing, we also add B frames */ pVideoCodecCtxOut->max_b_frames =2; } if (pVideoCodecCtxOut->codec_id == AV_CODEC_ID_MPEG1VIDEO) { /* Needed to avoid using macroblocks in which some coeffs overflow. * This does not happen with normal video, it just happens here as * the motion of the chroma plane does not match the luma plane. */ pVideoCodecCtxOut->mb_decision = 2; } } if (pFormatCtxOut->oformat->flags & AVFMT_GLOBALHEADER) { pVideoCodecCtxOut->flags |= CODEC_FLAG_GLOBAL_HEADER; } // 添加一条音频流 if (outFmt->audio_codec != AV_CODEC_ID_NONE) { audio_st = avformat_new_stream(pFormatCtxOut, pAudioCodecOut); if (audio_st == NULL) { return; } pAudioCodecCtxOut = audio_st->codec; pAudioCodecCtxOut->codec_id = outFmt->audio_codec; pAudioCodecCtxOut->coder_type = AVMEDIA_TYPE_AUDIO; pAudioCodecCtxOut->sample_fmt = pAudioCodecCtxIn->sample_fmt; pAudioCodecCtxOut->bit_rate = pAudioCodecCtxIn->bit_rate; pAudioCodecCtxOut->sample_rate = pAudioCodecCtxIn->sample_rate; pAudioCodecCtxOut->channels = pAudioCodecCtxIn->channels; pAudioCodecCtxOut->channel_layout = pAudioCodecCtxIn->channel_layout; } if (pFormatCtxOut->oformat->flags & AVFMT_GLOBALHEADER) { pAudioCodecCtxOut->flags |= CODEC_FLAG_GLOBAL_HEADER; } // open encode codec if (avcodec_open2(pVideoCodecCtxOut, pVideoCodecOut, NULL)<0) { return; } // if(avcodec_open2(pAudioCodecCtxOut, pAudioCodecOut, NULL)<0) // { // printf("audio encode codec not found\n"); // return; // } av_dump_format(pFormatCtxOut, 0, outfilename, 1); // open the output file, if needed if (!(pFormatCtxOut->flags & AVFMT_NOFILE)) { // if (avio_open(&pFormatCtxOut->pb, outfilename, AVIO_FLAG_WRITE) < 0) { fprintf(stderr, "Could not open '%s'\n", outfilename); return; } } printf("1\n"); // write the stream header, if any // [mp4 @ 0x99a8a00] track 1: codec frame size is not set? avformat_write_header(pFormatCtxOut, NULL); printf("2\n"); av_init_packet(&packet); int frameFinished; int videoFrameCount=0,audioFrameCount=0; int got_packet,frames=0; while (av_read_frame(pFormatCtxIn, &packet)>=0) {// 只要有帧 就读到packet中 printf("video frame %d audio frame %d dts-%lld pts-%lld \n",videoFrameCount,audioFrameCount,packet.dts,packet.pts); frames ++; /*decodec and codec*/ if (packet.stream_index == videoStream) { ret = avcodec_decode_video2(pVideoCodecCtxIn, pFrameIn, &frameFinished, &packet); videoFrameCount++; if (frameFinished) { // pFrameOut->data[0] = pFrameIn->data[0]; // pFrameOut->data[1] = pFrameIn->data[1]; // pFrameOut->data[2] = pFrameIn->data[2]; // pFrameOut->linesize[0] = pFrameIn->linesize[0]; // pFrameOut->linesize[1] = pFrameIn->linesize[1]; // pFrameOut->linesize[2] = pFrameIn->linesize[2]; if (outFmt->flags & AVFMT_RAWPICTURE) { // 不改变图片尺寸 AVPacket pkt; av_init_packet(&pkt); pkt.flags |= AV_PKT_FLAG_KEY; pkt.stream_index = video_st->index; pkt.data = (uint8_t *)pFormatCtxIn; pkt.size = sizeof(AVPicture); av_write_frame(pFormatCtxOut, &pkt); } else // 需要改变尺寸 { AVPacket pkt = {0}; av_init_packet(&pkt); ret = avcodec_encode_video2(pVideoCodecCtxOut, &pkt, pFrameIn, &got_packet); if (ret<0) { return; } /* If size is zero, it means the image was buffered. */ if (!ret && got_packet && pkt.size) { printf("frame dts-%lld pts-%lld \n",packet.dts,packet.pts); pkt.stream_index = video_st->index; pkt.pts = pVideoCodecCtxOut->coded_frame->pts; if(pVideoCodecCtxOut->coded_frame->key_frame) // 如果是关键帧 pkt.flags |= AV_PKT_FLAG_KEY; /* Write the compressed frame to the media file. */ // ret = av_interleaved_write_frame(pFormatCtxOut, &pkt); av_write_frame(pFormatCtxOut, &pkt); } else { ret = 0; } } } } else if(packet.stream_index == audioStream) { audioFrameCount ++; printf("frame dts-%lld pts-%lld \n",packet.dts,packet.pts); av_write_frame(pFormatCtxOut, &packet); } // /* get the delayed frames */ // for (got_packet = 1; got_packet; i++) { // got_output ’Ê // fflush(stdout); // ret = avcodec_encode_video2(pVideoCodecCtxOut, &packet, NULL, &got_packet); // if (ret < 0) { // fprintf(stderr, "Error encoding frame\n"); // exit(1); // } // if (got_packet) { // printf("Write frame %3d (size=%5d)\n", i, packet.size); // av_write_frame(pFormatCtxOut, &packet); // } // } } av_write_trailer(pFormatCtxOut); avcodec_close(pVideoCodecCtxIn); avcodec_close(pVideoCodecCtxOut); avcodec_close(pAudioCodecCtxIn); avcodec_close(pAudioCodecCtxOut); }

关于h264+aac合成MP4问题

bool Mp4Mutex::init(int& nTrackId, int nSampleRate, int nChannal, int bitsPerSample,char* pMp4File ) { //m_Mp4File = pMp4File; m_nSampleRate = nSampleRate; m_nAudioChannal = nChannal; m_nBitsPerSample = bitsPerSample; // init faac m_hEncoder = faacEncOpen( nSampleRate, nChannal, &m_nInputSamples, &m_nMaxOutputBytes); m_nMaxInputBytes=m_nInputSamples*bitsPerSample/8; m_pbPCMBuffer = new BYTE [m_nMaxInputBytes]; m_pOutAACBuffer = new BYTE [m_nMaxOutputBytes]; m_pTempBuffer = new BYTE [TEMP_BUFFER_SIZE]; memset(m_pTempBuffer, 0 , TEMP_BUFFER_SIZE); // Get current encoding configuration faacEncConfigurationPtr pConfiguration = faacEncGetCurrentConfiguration(m_hEncoder); if( !pConfiguration ) { printf("GetCurrentConfiguration error!\n"); return false; } //设置版本,录制MP4文件时要用MPEG4 pConfiguration->version = MPEG4 ; pConfiguration->aacObjectType = LOW; //LC编码 //输入数据类型 pConfiguration->inputFormat = FAAC_INPUT_16BIT; // outputFormat (0 = Raw; 1 = ADTS) // 录制MP4文件时,要用raw流。检验编码是否正确时可设置为 adts传输流, pConfiguration->outputFormat= 0; //瞬时噪声定形(temporal noise shaping,TNS)滤波器 pConfiguration->shortctl = SHORTCTL_NORMAL; pConfiguration->useTns=true; //pConfiguration->useLfe=false; pConfiguration->quantqual=100; pConfiguration->bandWidth=0; pConfiguration->bitRate=0; // Set encoding configuration faacEncSetConfiguration( m_hEncoder, pConfiguration); // 2.1 create mp4 file //char tmp[255] = "E:\\test1.mp4"; m_Mp4File = MP4Create(pMp4File , 0); if ( m_Mp4File == MP4_INVALID_FILE_HANDLE) { printf("open file fialed.\n"); return false; } // 2.2 add audio track m_AudioTrackId = MP4AddAudioTrack( m_Mp4File, nSampleRate, m_nInputSamples , MP4_MPEG4_AUDIO_TYPE ); if (m_AudioTrackId == MP4_INVALID_TRACK_ID) { //MP4Close(m_Mp4File); ///free(faacDecoderInfo); return false; } nTrackId = m_AudioTrackId; // 2.3 set audio level LC MP4SetAudioProfileLevel(m_Mp4File, 0x2 ); // // 2.4 get decoder info unsigned char* faacDecoderInfo = NULL; unsigned long faacDecoderInfoSize = 0; if( faacEncGetDecoderSpecificInfo( m_hEncoder, &faacDecoderInfo, &faacDecoderInfoSize )) { //MP4Close(m_Mp4File); free(faacDecoderInfo); return false ; } // 2.5 set encoder info [16bit-8000hz-1channal->{ 0x15, 0x88 } ] bool bOk = MP4SetTrackESConfiguration(m_Mp4File, m_AudioTrackId, faacDecoderInfo, faacDecoderInfoSize ); if( !bOk ) { free(faacDecoderInfo); //MP4Close(m_Mp4File); return false; } free( faacDecoderInfo ); return true; } void Mp4Mutex::StartWriteMp4(const unsigned char *const pBufferG711,int nG711Len) { static FILE* fp = fopen("E:\\3.g711a","wb"); fwrite(pBufferG711,nG711Len,1,fp); fflush(fp); if ( G711_BUFFER_SIZE < nG711Len ) { } BYTE szPcmBuff[PCM_BUFFER_SIZE] = {0};//1024 int nPcmLen = g711a_decode( (short*)szPcmBuff, pBufferG711, nG711Len ); memcpy(m_pTempBuffer+m_nTempPos, szPcmBuff ,nPcmLen ) ; m_nTempPos += nPcmLen; if ( m_nTempPos < m_nMaxInputBytes ) { return ; } memcpy(m_pbPCMBuffer, m_pTempBuffer ,m_nMaxInputBytes ) ; char szTemp[2048]={0}; int nLeft = m_nTempPos-m_nMaxInputBytes; memcpy( szTemp, (m_pTempBuffer+m_nMaxInputBytes), nLeft ); memset(m_pTempBuffer, 0, TEMP_BUFFER_SIZE ); memcpy( m_pTempBuffer, szTemp, nLeft ); m_nTempPos -= m_nMaxInputBytes ; int nRet = faacEncEncode(m_hEncoder, (int*)m_pbPCMBuffer, m_nInputSamples, m_pOutAACBuffer, m_nMaxOutputBytes ); if ( nRet <= 0 ) { return ; } MP4WriteSample( m_Mp4File, m_AudioTrackId, (BYTE*)&m_pOutAACBuffer[0], nRet-0 , 1024, 0, true); } 代码如上,直接从摄像机组播取H264+G711a的标准流,合成完MP4后没有音频,从收流处直接将g711a保存成文件单独使用如上代码dome转化为MP4后播放正常,求原因啊!!!!!!

ffmpeg实现web上视频转码为mp4格式用video标签却无法播放

1.问题描述:调用ffmpeg将avi格式视频转码->mp4格式,使用最简单的<video>标签进行播放只能播放声音,没有画面(黑屏)。而暴风影音等本地视频播放软件却能够正常播放转码后的视频。 2.环境:SSH框架准备实现视频上传后的自动转码并且能够网页内播放,火狐浏览器。 3.已知mp4格式分为两种,其中H264类型才能进行html播放,但按照转码命令说已经转码成:视频H264、音频aac格式了,但是仍然是黑屏(有声音)。 4.未知:(1)转码时显示的相关命令行具体意义。(2)网上所说用格式工厂进行转码即可,有没有能够通过代码调用的视频转码方法予以解决呢? 5.以下为问题截图: (1)视频转码Java代码: ``` List<String> convert = new ArrayList<String>(); convert.add(ffmpegPath); // 添加转换工具路径 convert.add("-i"); // 添加参数"-i",该参数指定要转换的文件 convert.add(sourceVideoPath); // 添加要转换格式的视频文件的路径 convert.add("-acodec"); convert.add("aac"); convert.add("-vcodec"); convert.add("libx264"); convert.add("-y"); convert.add(targetFolder+fileRealNameNoExtension+targetExtension); ``` (2)转码时的输出: ``` ffmpeg version N-93678-g4b7166c9d5 Copyright (c) 2000-2019 the FFmpeg developers built with gcc 8.3.1 (GCC) 20190414 configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt libavutil 56. 26.100 / 56. 26.100 libavcodec 58. 52.100 / 58. 52.100 libavformat 58. 27.103 / 58. 27.103 libavdevice 58. 7.100 / 58. 7.100 libavfilter 7. 50.100 / 7. 50.100 libswscale 5. 4.100 / 5. 4.100 libswresample 3. 4.100 / 3. 4.100 libpostproc 55. 4.100 / 55. 4.100 Input #0, avi, from 'E:\Test\projectVideos\temp\1557994804863.avi': Metadata: genre : Other track : 1 encoder : Lavf54.63.104 Duration: 00:00:16.80, start: 0.000000, bitrate: 2286 kb/s Stream #0:0: Video: h264 (Main) (H264 / 0x34363248), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2151 kb/s, 25 fps, 25 tbr, 25 tbn, 50 tbc Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 44100 Hz, mono, fltp, 128 kb/s Stream mapping: Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264)) Stream #0:1 -> #0:1 (mp3 (mp3float) -> aac (native)) Press [q] to stop, [?] for help [libx264 @ 0000000002ebf4c0] using SAR=1/1 [libx264 @ 0000000002ebf4c0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX [libx264 @ 0000000002ebf4c0] profile Progressive High, level 4.0, 4:2:0, 8-bit [libx264 @ 0000000002ebf4c0] 264 - core 157 r2970 5493be8 - H.264/MPEG-4 AVC codec - Copyleft 2003-2019 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00 Output #0, mp4, to 'E:\Test\projectVideos\encvideos\1557994804863.mp4': Metadata: genre : Other track : 1 encoder : Lavf58.27.103 Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=-1--1, 25 fps, 12800 tbn, 25 tbc Metadata: encoder : Lavc58.52.100 libx264 Side data: cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1 Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 69 kb/s Metadata: encoder : Lavc58.52.100 aac frame= 1 fps=0.0 q=0.0 size= 0kB time=00:00:00.06 bitrate= 5.5kbits/s speed=0.138x frame= 46 fps= 23 q=0.0 size= 0kB time=00:00:01.88 bitrate= 0.2kbits/s speed=0.936x frame= 64 fps= 25 q=28.0 size= 0kB time=00:00:02.57 bitrate= 0.1kbits/s speed=1.02x frame= 88 fps= 29 q=28.0 size= 0kB time=00:00:03.55 bitrate= 0.1kbits/s speed=1.17x frame= 108 fps= 31 q=28.0 size= 0kB time=00:00:04.34 bitrate= 0.1kbits/s speed=1.23x frame= 133 fps= 33 q=28.0 size= 0kB time=00:00:05.34 bitrate= 0.1kbits/s speed=1.32x frame= 155 fps= 34 q=28.0 size= 0kB time=00:00:06.22 bitrate= 0.1kbits/s speed=1.35x frame= 171 fps= 33 q=28.0 size= 0kB time=00:00:06.87 bitrate= 0.1kbits/s speed=1.33x frame= 186 fps= 33 q=28.0 size= 0kB time=00:00:07.47 bitrate= 0.1kbits/s speed=1.32x frame= 195 fps= 31 q=28.0 size= 0kB time=00:00:07.82 bitrate= 0.0kbits/s speed=1.25x frame= 206 fps= 30 q=28.0 size= 0kB time=00:00:08.26 bitrate= 0.0kbits/s speed=1.22x frame= 214 fps= 29 q=28.0 size= 0kB time=00:00:08.59 bitrate= 0.0kbits/s speed=1.17x frame= 223 fps= 28 q=28.0 size= 0kB time=00:00:08.96 bitrate= 0.0kbits/s speed=1.14x frame= 229 fps= 27 q=28.0 size= 0kB time=00:00:09.19 bitrate= 0.0kbits/s speed=1.09x frame= 232 fps= 25 q=28.0 size= 0kB time=00:00:09.28 bitrate= 0.0kbits/s speed=1.01x frame= 235 fps= 24 q=28.0 size= 256kB time=00:00:09.42 bitrate= 222.5kbits/s speed=0.965x frame= 240 fps= 23 q=28.0 size= 256kB time=00:00:09.63 bitrate= 217.7kbits/s speed=0.928x frame= 243 fps= 22 q=28.0 size= 256kB time=00:00:09.72 bitrate= 215.6kbits/s speed=0.894x frame= 247 fps= 21 q=28.0 size= 256kB time=00:00:09.89 bitrate= 212.1kbits/s speed=0.856x frame= 253 fps= 21 q=28.0 size= 512kB time=00:00:10.12 bitrate= 414.3kbits/s speed=0.832x frame= 258 fps= 20 q=28.0 size= 512kB time=00:00:10.33 bitrate= 406.0kbits/s speed=0.812x frame= 264 fps= 20 q=28.0 size= 512kB time=00:00:10.56 bitrate= 397.0kbits/s speed=0.791x frame= 268 fps= 19 q=28.0 size= 768kB time=00:00:10.72 bitrate= 586.5kbits/s speed=0.773x frame= 272 fps= 19 q=28.0 size= 768kB time=00:00:10.91 bitrate= 576.5kbits/s speed=0.753x frame= 278 fps= 19 q=28.0 size= 768kB time=00:00:11.14 bitrate= 564.5kbits/s speed=0.743x frame= 281 fps= 18 q=28.0 size= 768kB time=00:00:11.26 bitrate= 558.7kbits/s speed=0.725x frame= 286 fps= 18 q=28.0 size= 1024kB time=00:00:11.47 bitrate= 731.3kbits/s speed=0.715x frame= 291 fps= 17 q=28.0 size= 1024kB time=00:00:11.67 bitrate= 718.3kbits/s speed=0.701x frame= 296 fps= 17 q=25.0 size= 1024kB time=00:00:11.86 bitrate= 707.0kbits/s speed=0.687x frame= 303 fps= 17 q=28.0 size= 1280kB time=00:00:12.14 bitrate= 863.5kbits/s speed=0.681x frame= 308 fps= 17 q=28.0 size= 1280kB time=00:00:12.35 bitrate= 848.9kbits/s speed=0.67x frame= 312 fps= 16 q=28.0 size= 1280kB time=00:00:12.51 bitrate= 837.8kbits/s speed=0.661x frame= 319 fps= 16 q=28.0 size= 1280kB time=00:00:12.79 bitrate= 819.6kbits/s speed=0.658x frame= 341 fps= 17 q=28.0 size= 1280kB time=00:00:13.65 bitrate= 768.0kbits/s speed=0.684x frame= 362 fps= 18 q=28.0 size= 1280kB time=00:00:14.48 bitrate= 723.7kbits/s speed=0.708x frame= 391 fps= 19 q=28.0 size= 1280kB time=00:00:15.67 bitrate= 669.0kbits/s speed=0.746x frame= 419 fps= 19 q=28.0 size= 1280kB time=00:00:16.67 bitrate= 629.0kbits/s speed=0.774x frame= 419 fps= 19 q=-1.0 Lsize= 1538kB time=00:00:16.71 bitrate= 753.7kbits/s speed=0.753x video:1480kB audio:43kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.976535% [libx264 @ 0000000002ebf4c0] frame I:2 Avg QP:13.37 size: 32816 [libx264 @ 0000000002ebf4c0] frame P:143 Avg QP:14.70 size: 6977 [libx264 @ 0000000002ebf4c0] frame B:274 Avg QP:13.65 size: 1647 [libx264 @ 0000000002ebf4c0] consecutive B-frames: 9.8% 7.6% 4.3% 78.3% [libx264 @ 0000000002ebf4c0] mb I I16..4: 38.7% 53.1% 8.1% [libx264 @ 0000000002ebf4c0] mb P I16..4: 17.5% 18.5% 0.2% P16..4: 5.5% 0.4% 0.2% 0.0% 0.0% skip:57.7% [libx264 @ 0000000002ebf4c0] mb B I16..4: 2.0% 0.7% 0.0% B16..8: 3.7% 0.2% 0.0% direct: 2.9% skip:90.5% L0:49.2% L1:48.4% BI: 2.4% [libx264 @ 0000000002ebf4c0] 8x8 transform intra:48.1% inter:84.8% [libx264 @ 0000000002ebf4c0] coded y,uvDC,uvAC intra: 3.9% 31.3% 4.5% inter: 0.7% 5.4% 0.2% [libx264 @ 0000000002ebf4c0] i16 v,h,dc,p: 22% 68% 4% 6% [libx264 @ 0000000002ebf4c0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 29% 27% 42% 0% 0% 0% 0% 0% 0% [libx264 @ 0000000002ebf4c0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 31% 28% 24% 2% 4% 3% 4% 2% 3% [libx264 @ 0000000002ebf4c0] i8c dc,h,v,p: 48% 39% 11% 2% [libx264 @ 0000000002ebf4c0] Weighted P-Frames: Y:23.1% UV:22.4% [libx264 @ 0000000002ebf4c0] ref P L0: 65.5% 9.2% 23.1% 1.9% 0.3% [libx264 @ 0000000002ebf4c0] ref B L0: 71.1% 28.4% 0.5% [libx264 @ 0000000002ebf4c0] ref B L1: 98.8% 1.2% [libx264 @ 0000000002ebf4c0] kb/s:723.03 [aac @ 0000000002dc0980] Qavg: 47784.133 生成mp4视频为:E:\Test\projectVideos\temp\1557994804863.mp4 ``` (3)播放时的截图 ![图片说明](https://img-ask.csdn.net/upload/201905/16/1557997780_707491.png) (4) 播放视频jsp代码(使用的是video-js,但测试时也试了一下不加视频插件直接<video>标签播放,结果一样) ``` <video id="playVideo" class="video-js vjs-default-skin" controls ="true" preload="auto" width="960" height="480" poster="/images/${VIDEO.vpicture}" data-setup='{}'> <source src="/videos/${VIDEO.vpath}" type='video/mp4' /> </video> ``` ("/videos"为虚拟路径 实为本地存储地址) 希望好心人能够予以慷慨解答!~ 补充:在转wmv格式到MP4格式时出现了 ``` ConverVideoTest说:传入工具类的源视频为:E:\Test\projectVideos\temp\1558578421815.wmv ----接收到文件(E:\Test\projectVideos\temp\1558578421815.wmv)需要转换------- ----开始转文件(E:\Test\projectVideos\temp\1558578421815.wmv)-------------------------- 源视频类型为:wmv 可以转换,统一转为mp4文件 调用了ffmpeg.exe工具 该文件夹存在。 ffmpeg输入的命令:E:\ffmpeg\bin\ffmpeg.exe-iE:\Test\projectVideos\temp\1558578421815.wmv-acodecaac-vcodeclibx264-yE:\Test\projectVideos\encvideos\1558578421815.mp4 ffmpeg version N-93678-g4b7166c9d5 Copyright (c) 2000-2019 the FFmpeg developers built with gcc 8.3.1 (GCC) 20190414 configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt libavutil 56. 26.100 / 56. 26.100 libavcodec 58. 52.100 / 58. 52.100 libavformat 58. 27.103 / 58. 27.103 libavdevice 58. 7.100 / 58. 7.100 libavfilter 7. 50.100 / 7. 50.100 libswscale 5. 4.100 / 5. 4.100 libswresample 3. 4.100 / 3. 4.100 libpostproc 55. 4.100 / 55. 4.100 Input #0, asf, from 'E:\Test\projectVideos\temp\1558578421815.wmv': Metadata: DeviceConformanceTemplate: M1 WMFSDKNeeded : 0.0.0.0000 WM/WMADRCPeakReference: 7851 WM/WMADRCPeakTarget: 7851 WM/WMADRCAverageReference: 1027 WM/WMADRCAverageTarget: 1027 WMFSDKVersion : 12.0.7601.17514 IsVBR : 0 Duration: 00:00:16.58, bitrate: 1969 kb/s Stream #0:0(chi): Audio: wmapro (b[1][0][0] / 0x0162), 48000 Hz, stereo, fltp, 256 kb/s Stream #0:1(chi): Video: vc1 (Advanced) (WVC1 / 0x31435657), yuv420p, 1352x696 [SAR 1:1 DAR 169:87], 3400 kb/s, 30 tbr, 1k tbn, 60 tbc Stream mapping: Stream #0:1 -> #0:0 (vc1 (native) -> h264 (libx264)) Stream #0:0 -> #0:1 (wmapro (native) -> aac (native)) Press [q] to stop, [?] for help [libx264 @ 0000000000531c80] using SAR=1/1 [libx264 @ 0000000000531c80] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX [libx264 @ 0000000000531c80] profile Progressive High, level 3.2, 4:2:0, 8-bit [libx264 @ 0000000000531c80] 264 - core 157 r2970 5493be8 - H.264/MPEG-4 AVC codec - Copyleft 2003-2019 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00 frame= 11 fps=0.0 q=0.0 size= 0kB time=-577014:32:22.77 bitrate= -0.0kbits/s dup=1 drop=0 speed=N/A frame= 52 fps= 48 q=0.0 size= 0kB time=-577014:32:22.77 bitrate= -0.0kbits/s dup=1 drop=0 speed=N/A frame= 85 fps= 54 q=0.0 size= 0kB time=-577014:32:22.77 bitrate= -0.0kbits/s dup=1 drop=0 speed=N/A frame= 145 fps= 64 q=0.0 size= 0kB time=-577014:32:22.77 bitrate= -0.0kbits/s dup=47 drop=0 speed=N/A frame= 171 fps= 61 q=0.0 size= 0kB time=-577014:32:22.77 bitrate= -0.0kbits/s dup=55 drop=0 speed=N/A Too many packets buffered for output stream 0:0. [libx264 @ 0000000000531c80] frame I:2 Avg QP:15.28 size: 56950 [libx264 @ 0000000000531c80] frame P:34 Avg QP:14.18 size: 1252 [libx264 @ 0000000000531c80] frame B:93 Avg QP:15.53 size: 140 [libx264 @ 0000000000531c80] consecutive B-frames: 3.1% 1.6% 2.3% 93.0% [libx264 @ 0000000000531c80] mb I I16..4: 14.9% 79.5% 5.6% [libx264 @ 0000000000531c80] mb P I16..4: 0.7% 1.1% 0.0% P16..4: 4.1% 1.4% 1.3% 0.0% 0.0% skip:91.4% [libx264 @ 0000000000531c80] mb B I16..4: 0.0% 0.0% 0.0% B16..8: 3.6% 0.0% 0.0% direct: 0.0% skip:96.4% L0:36.8% L1:63.2% BI: 0.0% [libx264 @ 0000000000531c80] 8x8 transform intra:74.4% inter:80.1% [libx264 @ 0000000000531c80] coded y,uvDC,uvAC intra: 38.4% 33.4% 20.3% inter: 0.5% 0.2% 0.0% [libx264 @ 0000000000531c80] i16 v,h,dc,p: 61% 25% 9% 6% [libx264 @ 0000000000531c80] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 32% 31% 21% 2% 3% 3% 3% 3% 3% [libx264 @ 0000000000531c80] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 27% 32% 14% 4% 5% 5% 5% 4% 6% [libx264 @ 0000000000531c80] i8c dc,h,v,p: 76% 13% 8% 4% [libx264 @ 0000000000531c80] Weighted P-Frames: Y:0.0% UV:0.0% [libx264 @ 0000000000531c80] ref P L0: 85.1% 6.8% 6.5% 1.6% [libx264 @ 0000000000531c80] ref B L0: 48.1% 47.5% 4.4% [libx264 @ 0000000000531c80] ref B L1: 93.2% 6.8% [libx264 @ 0000000000531c80] kb/s:315.41 **Conversion failed!** 生成mp4视频为:E:\Test\projectVideos\temp1558578421815.mp4 ===========视频转码结束,开始截图================= 该文件夹存在。 截图命令:E:\ffmpeg\bin\ffmpeg.exe-ss00:00:01-iE:\Test\projectVideos\temp\1558578421815.wmv-y-fimage2-s154x90E:\Test\projectVideos\images\1558578421815.jpg ffmpeg version N-93678-g4b7166c9d5 Copyright (c) 2000-2019 the FFmpeg developers built with gcc 8.3.1 (GCC) 20190414 configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt libavutil 56. 26.100 / 56. 26.100 libavcodec 58. 52.100 / 58. 52.100 libavformat 58. 27.103 / 58. 27.103 libavdevice 58. 7.100 / 58. 7.100 libavfilter 7. 50.100 / 7. 50.100 libswscale 5. 4.100 / 5. 4.100 libswresample 3. 4.100 / 3. 4.100 libpostproc 55. 4.100 / 55. 4.100 Input #0, asf, from 'E:\Test\projectVideos\temp\1558578421815.wmv': Metadata: DeviceConformanceTemplate: M1 WMFSDKNeeded : 0.0.0.0000 WM/WMADRCPeakReference: 7851 WM/WMADRCPeakTarget: 7851 WM/WMADRCAverageReference: 1027 WM/WMADRCAverageTarget: 1027 WMFSDKVersion : 12.0.7601.17514 IsVBR : 0 Duration: 00:00:16.58, bitrate: 1969 kb/s Stream #0:0(chi): Audio: wmapro (b[1][0][0] / 0x0162), 48000 Hz, stereo, fltp, 256 kb/s Stream #0:1(chi): Video: vc1 (Advanced) (WVC1 / 0x31435657), yuv420p, 1352x696 [SAR 1:1 DAR 169:87], 3400 kb/s, 30 tbr, 1k tbn, 60 tbc Stream mapping: Stream #0:1 -> #0:0 (vc1 (native) -> mjpeg (native)) Press [q] to stop, [?] for help [swscaler @ 0000000002ecd4c0] deprecated pixel format used, make sure you did set range correctly Output #0, image2, to 'E:\Test\projectVideos\images\1558578421815.jpg': Metadata: DeviceConformanceTemplate: M1 WMFSDKNeeded : 0.0.0.0000 WM/WMADRCPeakReference: 7851 WM/WMADRCPeakTarget: 7851 WM/WMADRCAverageReference: 1027 WM/WMADRCAverageTarget: 1027 WMFSDKVersion : 12.0.7601.17514 IsVBR : 0 encoder : Lavf58.27.103 Stream #0:0(chi): Video: mjpeg, yuvj420p(pc), 154x90 [SAR 2535:2233 DAR 169:87], q=2-31, 200 kb/s, 30 fps, 30 tbn, 30 tbc Metadata: encoder : Lavc58.52.100 mjpeg Side data: cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1 [image2 @ 0000000000628e00] Could not get frame filename number 2 from pattern 'E:\Test\projectVideos\images\1558578421815.jpg'. Use '-frames:v 1' for a single image, or '-update' option, or use a pattern such as %03d within the filename. av_interleaved_write_frame(): Invalid argument frame= 2 fps=0.0 q=1.6 size=N/A time=00:00:00.06 bitrate=N/A speed=0.102x frame= 2 fps=0.0 q=1.6 Lsize=N/A time=00:00:00.06 bitrate=N/A speed=0.097x video:3kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown Conversion failed! 截图进程结束 截图成功! ``` 即出现了Conversion failed!!!

ffmpeg将m4a转换为wav,字节不起作用

<div class="post-text" itemprop="text"> <p>some reason I need convert audio data with bytes ,for example data from http or grpc client</p> <p>so I want to use ffmpeg to convert audio by os/exec.Command</p> <p>the strange thing is when I convert audio bytes directly will failure, but convet with save file ,it work well</p> <p>two test below</p> <pre><code>// ffmpeg work well with file's io.Reader func TestMp4ToWav(t *testing.T) { var f io.Reader var err error f, err = os.Open("test.m4a") require.NoError(t, err) cmdStr := strings.Split("-f mp4 -i /dev/stdin -ar 16000 -ac 1 -f wav -", " ") cmd := exec.Command("ffmpeg", cmdStr...) cmd.Stdin = f var errBuff bytes.Buffer cmd.Stderr = &amp;errBuff d, err := cmd.Output() t.Log(errBuff.String()) if err != nil { t.Error(err) } err = ioutil.WriteFile("output.wav", d, 0644) assert.NoError(t, err) } // but not work with bytes.Buffer func TestMp4ToWavWithBuff(t *testing.T) { var data []byte var err error data, err = ioutil.ReadFile("test.m4a") require.NoError(t, err) cmdStr := strings.Split("-f mp4 -i /dev/stdin -ar 16000 -ac 1 -f wav -", " ") cmd := exec.Command("ffmpeg", cmdStr...) cmd.Stdin = bytes.NewBuffer(data) var errBuff bytes.Buffer cmd.Stderr = &amp;errBuff d, err := cmd.Output() t.Log(errBuff.String()) require.NoError(t, err) err = ioutil.WriteFile("output.wav", d, 0644) assert.NoError(t, err) } </code></pre> <p>first test output</p> <pre><code>ffmpeg_test.go:54: ffmpeg version 2.8.15-0ubuntu0.16.04.1 Copyright (c) 2000-2018 the FFmpeg developers built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.10) 20160609 configuration: --prefix=/usr --extra-version=0ubuntu0.16.04.1 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv libavutil 54. 31.100 / 54. 31.100 libavcodec 56. 60.100 / 56. 60.100 libavformat 56. 40.101 / 56. 40.101 libavdevice 56. 4.100 / 56. 4.100 libavfilter 5. 40.101 / 5. 40.101 libavresample 2. 1. 0 / 2. 1. 0 libswscale 3. 1.101 / 3. 1.101 libswresample 1. 2.101 / 1. 2.101 libpostproc 53. 3.100 / 53. 3.100 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/dev/stdin': Metadata: major_brand : M4A minor_version : 512 compatible_brands: isomiso2 encoder : Lavf56.40.101 Duration: 00:00:05.02, start: 0.023220, bitrate: 136 kb/s Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 134 kb/s (default) Metadata: handler_name : SoundHandler Output #0, wav, to 'pipe:': Metadata: major_brand : M4A minor_version : 512 compatible_brands: isomiso2 ISFT : Lavf56.40.101 Stream #0:0(und): Audio: pcm_s16le ([1][0][0][0] / 0x0001), 16000 Hz, mono, s16, 256 kb/s (default) Metadata: handler_name : SoundHandler encoder : Lavc56.60.100 pcm_s16le Stream mapping: Stream #0:0 -&gt; #0:0 (aac (native) -&gt; pcm_s16le (native)) size= 158kB time=00:00:05.03 bitrate= 256.1kbits/s video:0kB audio:157kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.048375% </code></pre> <p>second test output</p> <pre><code>ffmpeg_test.go:77: ffmpeg version 2.8.15-0ubuntu0.16.04.1 Copyright (c) 2000-2018 the FFmpeg developers built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.10) 20160609 configuration: --prefix=/usr --extra-version=0ubuntu0.16.04.1 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv libavutil 54. 31.100 / 54. 31.100 libavcodec 56. 60.100 / 56. 60.100 libavformat 56. 40.101 / 56. 40.101 libavdevice 56. 4.100 / 56. 4.100 libavfilter 5. 40.101 / 5. 40.101 libavresample 2. 1. 0 / 2. 1. 0 libswscale 3. 1.101 / 3. 1.101 libswresample 1. 2.101 / 1. 2.101 libpostproc 53. 3.100 / 53. 3.100 [mov,mp4,m4a,3gp,3g2,mj2 @ 0x17454c0] stream 0, offset 0x28: partial file Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/dev/stdin': Metadata: major_brand : M4A minor_version : 512 compatible_brands: isomiso2 encoder : Lavf56.40.101 Duration: 00:00:05.02, bitrate: N/A Stream #0:0(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 134 kb/s (default) Metadata: handler_name : SoundHandler Output #0, wav, to 'pipe:': Metadata: major_brand : M4A minor_version : 512 compatible_brands: isomiso2 ISFT : Lavf56.40.101 Stream #0:0(und): Audio: pcm_s16le ([1][0][0][0] / 0x0001), 16000 Hz, mono, s16, 256 kb/s (default) Metadata: handler_name : SoundHandler encoder : Lavc56.60.100 pcm_s16le Stream mapping: Stream #0:0 -&gt; #0:0 (aac (native) -&gt; pcm_s16le (native)) [mov,mp4,m4a,3gp,3g2,mj2 @ 0x17454c0] stream 0, offset 0x28: partial file /dev/stdin: Invalid data found when processing input size= 0kB time=00:00:00.00 bitrate=N/A video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used) </code></pre> <p><a href="https://github.com/bigpigeon/Test/blob/master/go/ffmpeg/test.m4a?raw=true" rel="nofollow noreferrer">test.m4a audio download address</a></p> <p>PS I also try to fake os.File object still not work</p> </div>

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平台下运行的,求问哪里出错了!

pydub无法打开wav文件

打算使用pydub批量处理录音文件格式,但是光是执行到打开录音文件就会报错。 代码: from pydub import AudioSegment sound = AudioSegment.from_file('D:\\wavdownload\\1b449bd73b866e73c997401c19462353.wav', format='wav') 报错: Traceback (most recent call last): File "D:/PycharmProjects/chaxunyemian/wavtomp.py", line 5, in <module> sound = AudioSegment.from_file('D:\\wavdownload\\1b449bd73b866e73c997401c19462353.wav', format='wav') File "D:\Anaconda3\envs\baidujiami\lib\site-packages\pydub\audio_segment.py", line 704, in from_file p.returncode, p_err)) **pydub.exceptions.CouldntDecodeError: Decoding failed. ffmpeg returned error code: 1** Output from ffmpeg/avlib: ffmpeg version 4.2.1 Copyright (c) 2000-2019 the FFmpeg developers built with gcc 9.1.1 (GCC) 20190807 configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt libavutil 56. 31.100 / 56. 31.100 libavcodec 58. 54.100 / 58. 54.100 libavformat 58. 29.100 / 58. 29.100 libavdevice 58. 8.100 / 58. 8.100 libavfilter 7. 57.100 / 7. 57.100 libswscale 5. 5.100 / 5. 5.100 libswresample 3. 5.100 / 3. 5.100 libpostproc 55. 5.100 / 55. 5.100 Guessed Channel Layout for Input Stream #0.0 : mono Input #0, wav, from 'D:\wavdownload\1b449bd73b866e73c997401c19462353.wav': Duration: 00:01:17.70, bitrate: 64 kb/s Stream #0:0: Audio: pcm_alaw ([6][0][0][0] / 0x0006), 8000 Hz, mono, s16, 64 kb/s Stream mapping: Stream #0:0 -> #0:0 (pcm_alaw (native) -> pcm_s8 (native)) Press [q] to stop, [?] for help [wav @ 000000000042b9c0] **pcm_s8 codec not supported in WAVE format Could not write header for output file #0 (incorrect codec parameters ?): Function not implemented Error initializing output stream 0:0 -- Conversion failed!** 是不是wav文件的编码有问题?我该如何解决 在cmd尝试用命令来转换格式是可以的: ffmpeg -i 1b449bd73b866e73c997401c19462353.wav d:\wavdownload\1b449bd73b866e73c997401c19462353.mp3 执行这条语句拿到了MP3文件。

将视频中的帧转换成矩阵

<div class="post-text" itemprop="text"> <p>I'm currently trying to implement a compression algorithm(frame prediction) for an assignment. <strong>I am not looking for thumbnail files</strong>, or even just a shell command to generate something for me. My problem is specifically integrating it with a golang program. </p> <p>I just started and I'm already stuck. I'm supposed to get each frame out of a video,divide it into I P and B frames and perform inter-coding(compress the frame itself), then perform intra-coding(between the frames).</p> <p>Right now I cannot even get started on the above problems, because I have no idea how to read the video as something I could use in code. Apparently, the only library I can think of is ffmpeg. FFMPEG can get separate frames, apparently even i p and b frames.</p> <p><code>ffmpeg -i &lt;inputfile&gt; -vf '[in]select=eq(pict_type\,B)[out]' b.frames.mp4 </code></p> <p>But this is just another video output, that I do not know how to open. What I was thinking of was outputting frames into bitmaps(?), then reading each bitmap separately, to reconstruct three 3D matrixes, of i frames, p frames and b frames. However this seems like quite a feat. Someone, somewhere has definitely tried to parse a video into a 3D matrix and has found a better solution than what I'm thinking of. </p> <p>To be concise, I have a video, I need a 3D matrix. The 3D matrix is a matrix of 2D matrixes, which represent a frame in the video. Each point in a 3D matrix is a pixel(or whatever the equivalent is in videos).</p> <p><a href="https://i.stack.imgur.com/h0nKr.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/h0nKr.png" alt="3D matrix"></a></p> </div>

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

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

人工智能-计算机视觉实战之路(必备算法+深度学习+项目实战)

系列课程主要分为3大阶段:(1)首先掌握计算机视觉必备算法原理,结合Opencv进行学习与练手,通过实际视项目进行案例应用展示。(2)进军当下最火的深度学习进行视觉任务实战,掌握深度学习中必备算法原理与网络模型架构。(3)结合经典深度学习框架与实战项目进行实战,基于真实数据集展开业务分析与建模实战。整体风格通俗易懂,项目驱动学习与就业面试。 建议同学们按照下列顺序来进行学习:1.Python入门视频课程 2.Opencv计算机视觉实战(Python版) 3.深度学习框架-PyTorch实战/人工智能框架实战精讲:Keras项目 4.Python-深度学习-物体检测实战 5.后续实战课程按照自己喜好选择就可以

linux2.6.1内核源码注释

包含LINUX内核同步、信号、内存、调度、文件系统、网络系统、时钟等部分的源码注释。前后历时三年,算是干货。

Python可以这样学(第四季:数据分析与科学计算可视化)

董付国老师系列教材《Python程序设计(第2版)》(ISBN:9787302436515)、《Python可以这样学》(ISBN:9787302456469)配套视频,在教材基础上又增加了大量内容,通过实例讲解numpy、scipy、pandas、statistics、matplotlib等标准库和扩展库用法。

u-boot-2015.07.tar.bz2

uboot-2015-07最新代码,喜欢的朋友请拿去

Vue.js 2.0之全家桶系列视频课程

基于新的Vue.js 2.3版本, 目前新全的Vue.js教学视频,让你少走弯路,直达技术前沿! 1. 包含Vue.js全家桶(vue.js、vue-router、axios、vuex、vue-cli、webpack、ElementUI等) 2. 采用笔记+代码案例的形式讲解,通俗易懂

MySQL 8.0.19安装教程(windows 64位)

话不多说直接开干 目录 1-先去官网下载点击的MySQL的下载​ 2-配置初始化的my.ini文件的文件 3-初始化MySQL 4-安装MySQL服务 + 启动MySQL 服务 5-连接MySQL + 修改密码 先去官网下载点击的MySQL的下载 下载完成后解压 解压完是这个样子 配置初始化的my.ini文件的文件 ...

零基础学C#编程—C#从小白到大咖

本课程从初学者角度出发,提供了C#从入门到成为程序开发高手所需要掌握的各方面知识和技术。 【课程特点】 1 由浅入深,编排合理; 2 视频讲解,精彩详尽; 3 丰富实例,轻松易学; 4 每章总结配有难点解析文档。 15大章节,228课时,1756分钟与你一同进步!

微信公众平台开发入门

本套课程的设计完全是为初学者量身打造,课程内容由浅入深,课程讲解通俗易懂,代码实现简洁清晰。通过本课程的学习,学员能够入门微信公众平台开发,能够胜任企业级的订阅号、服务号、企业号的应用开发工作。 通过本课程的学习,学员能够对微信公众平台有一个清晰的、系统性的认识。例如,公众号是什么,它有什么特点,它能做什么,怎么开发公众号。 其次,通过本课程的学习,学员能够掌握微信公众平台开发的方法、技术和应用实现。例如,开发者文档怎么看,开发环境怎么搭建,基本的消息交互如何实现,常用的方法技巧有哪些,真实应用怎么开发。

java jdk 8 帮助文档 中文 文档 chm 谷歌翻译

JDK1.8 API 中文谷歌翻译版 java帮助文档 JDK API java 帮助文档 谷歌翻译 JDK1.8 API 中文 谷歌翻译版 java帮助文档 Java最新帮助文档 本帮助文档是使用谷

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

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

编程实现学生基本信息管理程序

编程实现学生基本信息管理程序。学生基本信息包括:学号、姓名、性别、年龄、班级、学院、专业等。具体实现的管理功能如下: (1) 输入并显示多个学生的基本信息; (2) 可根据需要实现学生信息的添加; (

机器学习实战系列套餐(必备基础+经典算法+案例实战)

机器学习实战系列套餐以实战为出发点,帮助同学们快速掌握机器学习领域必备经典算法原理并结合Python工具包进行实战应用。建议学习顺序:1.Python必备工具包:掌握实战工具 2.机器学习算法与实战应用:数学原理与应用方法都是必备技能 3.数据挖掘实战:通过真实数据集进行项目实战。按照下列课程顺序学习即可! 课程风格通俗易懂,用最接地气的方式带领大家轻松进军机器学习!提供所有课程代码,PPT与实战数据,有任何问题欢迎随时与我讨论。

YOLOv3目标检测实战:训练自己的数据集

YOLOv3是一种基于深度学习的端到端实时目标检测方法,以速度快见长。本课程将手把手地教大家使用labelImg标注和使用YOLOv3训练自己的数据集。课程分为三个小项目:足球目标检测(单目标检测)、梅西目标检测(单目标检测)、足球和梅西同时目标检测(两目标检测)。 本课程的YOLOv3使用Darknet,在Ubuntu系统上做项目演示。包括:安装Darknet、给自己的数据集打标签、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计(mAP计算和画出PR曲线)和先验框聚类。 Darknet是使用C语言实现的轻型开源深度学习框架,依赖少,可移植性好,值得深入探究。 除本课程《YOLOv3目标检测实战:训练自己的数据集》外,本人推出了有关YOLOv3目标检测的系列课程,请持续关注该系列的其它课程视频,包括: 《YOLOv3目标检测实战:交通标志识别》 《YOLOv3目标检测:原理与源码解析》 《YOLOv3目标检测:网络模型改进方法》 敬请关注并选择学习!

Python+OpenCV计算机视觉

Python+OpenCV计算机视觉系统全面的介绍。

土豆浏览器

土豆浏览器可以用来看各种搞笑、电影、电视剧视频

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

玩转Linux:常用命令实例指南

人工智能、物联网、大数据时代,Linux正有着一统天下的趋势,几乎每个程序员岗位,都要求掌握Linux。本课程零基础也能轻松入门。 本课程以简洁易懂的语言手把手教你系统掌握日常所需的Linux知识,每个知识点都会配合案例实战让你融汇贯通。课程通俗易懂,简洁流畅,适合0基础以及对Linux掌握不熟练的人学习; 【限时福利】 1)购课后按提示添加小助手,进答疑群,还可获得价值300元的编程大礼包! 2)本月购买此套餐加入老师答疑交流群,可参加老师的免费分享活动,学习最新技术项目经验。 --------------------------------------------------------------- 29元=掌握Linux必修知识+社群答疑+讲师社群分享会+700元编程礼包。 &nbsp;

基于STM32的电子时钟设计

时钟功能 还有闹钟功能,温湿度功能,整点报时功能 你值得拥有

Python数据清洗实战入门

本次课程主要以真实的电商数据为基础,通过Python详细的介绍了数据分析中的数据清洗阶段各种技巧和方法。

Git 实用技巧

这几年越来越多的开发团队使用了Git,掌握Git的使用已经越来越重要,已经是一个开发者必备的一项技能;但很多人在刚开始学习Git的时候会遇到很多疑问,比如之前使用过SVN的开发者想不通Git提交代码为什么需要先commit然后再去push,而不是一条命令一次性搞定; 更多的开发者对Git已经入门,不过在遇到一些代码冲突、需要恢复Git代码时候就不知所措,这个时候哪些对 Git掌握得比较好的少数人,就像团队中的神一样,在队友遇到 Git 相关的问题的时候用各种流利的操作来帮助队友于水火。 我去年刚加入新团队,发现一些同事对Git的常规操作没太大问题,但对Git的理解还是比较生疏,比如说分支和分支之间的关联关系、合并代码时候的冲突解决、提交代码前未拉取新代码导致冲突问题的处理等,我在协助处理这些问题的时候也记录各种问题的解决办法,希望整理后通过教程帮助到更多对Git操作进阶的开发者。 本期教程学习方法分为“掌握基础——稳步进阶——熟悉协作”三个层次。从掌握基础的 Git的推送和拉取开始,以案例进行演示,分析每一个步骤的操作方式和原理,从理解Git 工具的操作到学会代码存储结构、演示不同场景下Git遇到问题的不同处理方案。循序渐进让同学们掌握Git工具在团队协作中的整体协作流程。 在教程中会通过大量案例进行分析,案例会模拟在工作中遇到的问题,从最基础的代码提交和拉取、代码冲突解决、代码仓库的数据维护、Git服务端搭建等。为了让同学们容易理解,对Git简单易懂,文章中详细记录了详细的操作步骤,提供大量演示截图和解析。在教程的最后部分,会从提升团队整体效率的角度对Git工具进行讲解,包括规范操作、Gitlab的搭建、钩子事件的应用等。 为了让同学们可以利用碎片化时间来灵活学习,在教程文章中大程度降低了上下文的依赖,让大家可以在工作之余进行学习与实战,并同时掌握里面涉及的Git不常见操作的相关知识,理解Git工具在工作遇到的问题解决思路和方法,相信一定会对大家的前端技能进阶大有帮助。

计算机组成原理算法实现

计算机组成原理算法实现,能够实现定点小数的机器数表示、定点小数的变形补码加减运算、定点小数的原码一位乘法运算和浮点数的加减运算。

为linux系统设计一个简单的二级文件系统

实验目的: 通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。 实验要求: 为linux系统设计一个简单的二级文件系统。要求做到以下几点: (1)可以实现下列几条命令(至少4条)

几率大的Redis面试题(含答案)

本文的面试题如下: Redis 持久化机制 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题 热点数据和冷数据是什么 Memcache与Redis的区别都有哪些? 单线程的redis为什么这么快 redis的数据类型,以及每种数据类型的使用场景,Redis 内部结构 redis的过期策略以及内存淘汰机制【~】 Redis 为什么是单线程的,优点 如何解决redis的并发竞争key问题 Red...

机器学习初学者必会的案例精讲

通过六个实际的编码项目,带领同学入门人工智能。这些项目涉及机器学习(回归,分类,聚类),深度学习(神经网络),底层数学算法,Weka数据挖掘,利用Git开源项目实战等。

网络工程师小白入门--【思科CCNA、华为HCNA等网络工程师认证】

本课程适合CCNA或HCNA网络小白同志,高手请绕道,可以直接学习进价课程。通过本预科课程的学习,为学习网络工程师、思科CCNA、华为HCNA这些认证打下坚实的基础! 重要!思科认证2020年2月24日起,已启用新版认证和考试,包括题库都会更新,由于疫情原因,请关注官网和本地考点信息。题库网络上很容易下载到。

2019全国大学生数学建模竞赛C题原版优秀论文

2019全国大学生数学建模竞赛C题原版优秀论文,PDF原版论文,不是图片合成的,是可编辑的文字版。共三篇。 C044.pdf C137.pdf C308.pdf

土豆SDK(Java版)-非官方

由于土豆SDK一直建设中,最近几天抽空写了一套java的SDK。包含了现有的所有请求协议。本套SDK中仅提供了oAuth的方式(引用oAuth.net的java版示例),并没有在框架中实现,涉及到登录

Android小项目——新闻APP(源码)

Android小项目——新闻APP(源码),一个很简单的可以练手的Android Demo Ps:下载之前可以先看一下这篇文章——https://blog.csdn.net/qq_34149526/a

实用主义学Python(小白也容易上手的Python实用案例)

原价169,限时立减100元! 系统掌握Python核心语法16点,轻松应对工作中80%以上的Python使用场景! 69元=72讲+源码+社群答疑+讲师社群分享会&nbsp; 【哪些人适合学习这门课程?】 1)大学生,平时只学习了Python理论,并未接触Python实战问题; 2)对Python实用技能掌握薄弱的人,自动化、爬虫、数据分析能让你快速提高工作效率; 3)想学习新技术,如:人工智能、机器学习、深度学习等,这门课程是你的必修课程; 4)想修炼更好的编程内功,优秀的工程师肯定不能只会一门语言,Python语言功能强大、使用高效、简单易学。 【超实用技能】 从零开始 自动生成工作周报 职场升级 豆瓣电影数据爬取 实用案例 奥运冠军数据分析 自动化办公:通过Python自动化分析Excel数据并自动操作Word文档,最终获得一份基于Excel表格的数据分析报告。 豆瓣电影爬虫:通过Python自动爬取豆瓣电影信息并将电影图片保存到本地。 奥运会数据分析实战 简介:通过Python分析120年间奥运会的数据,从不同角度入手分析,从而得出一些有趣的结论。 【超人气老师】 二两 中国人工智能协会高级会员 生成对抗神经网络研究者 《深入浅出生成对抗网络:原理剖析与TensorFlow实现》一书作者 阿里云大学云学院导师 前大型游戏公司后端工程师 【超丰富实用案例】 0)图片背景去除案例 1)自动生成工作周报案例 2)豆瓣电影数据爬取案例 3)奥运会数据分析案例 4)自动处理邮件案例 5)github信息爬取/更新提醒案例 6)B站百大UP信息爬取与分析案例 7)构建自己的论文网站案例

三个项目玩转深度学习(附1G源码)

从事大数据与人工智能开发与实践约十年,钱老师亲自见证了大数据行业的发展与人工智能的从冷到热。事实证明,计算机技术的发展,算力突破,海量数据,机器人技术等,开启了第四次工业革命的序章。深度学习图像分类一直是人工智能的经典任务,是智慧零售、安防、无人驾驶等机器视觉应用领域的核心技术之一,掌握图像分类技术是机器视觉学习的重中之重。针对现有线上学习的特点与实际需求,我们开发了人工智能案例实战系列课程。打造:以项目案例实践为驱动的课程学习方式,覆盖了智能零售,智慧交通等常见领域,通过基础学习、项目案例实践、社群答疑,三维立体的方式,打造最好的学习效果。

微信小程序开发实战之番茄时钟开发

微信小程序番茄时钟视频教程,本课程将带着各位学员开发一个小程序初级实战类项目,针对只看过官方文档而又无从下手的开发者来说,可以作为一个较好的练手项目,对于有小程序开发经验的开发者而言,可以更好加深对小程序各类组件和API 的理解,为更深层次高难度的项目做铺垫。

2019 AI开发者大会

2019 AI开发者大会(AI ProCon 2019)是由中国IT社区CSDN主办的AI技术与产业年度盛会。多年经验淬炼,如今蓄势待发:2019年9月6-7日,大会将有近百位中美顶尖AI专家、知名企业代表以及千余名AI开发者齐聚北京,进行技术解读和产业论证。我们不空谈口号,只谈技术,诚挚邀请AI业内人士一起共铸人工智能新篇章!

深度学习原理+项目实战+算法详解+主流框架(套餐)

深度学习系列课程从深度学习基础知识点开始讲解一步步进入神经网络的世界再到卷积和递归神经网络,详解各大经典网络架构。实战部分选择当下最火爆深度学习框架PyTorch与Tensorflow/Keras,全程实战演示框架核心使用与建模方法。项目实战部分选择计算机视觉与自然语言处理领域经典项目,从零开始详解算法原理,debug模式逐行代码解读。适合准备就业和转行的同学们加入学习! 建议按照下列课程顺序来进行学习 (1)掌握深度学习必备经典网络架构 (2)深度框架实战方法 (3)计算机视觉与自然语言处理项目实战。(按照课程排列顺序即可)

IE主页被篡改修复

IE主页修复。IE主页被篡改修复。一键修复IE主页

android 漂亮的UI界面 完整的界面设计

声明:这也是我学习时在网上下载的,鉴于分享精神,并且觉得很不错才上传上来的。。。。。 android 漂亮的UI界面 完整的界面设计 这是一个完整的UI设计,但是没写动作,这是一个公司程序员的公司任务

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

专为程序员设计的数学课

<p> 限时福利限时福利,<span>15000+程序员的选择!</span> </p> <p> 1、原价 115 元,限时特价仅需 49 元!<br> 2、购课后添加学习助手(微信号:csdnxy68),按提示消息领取编程大礼包!并获取讲师答疑服务! </p> <p> <br> </p> <p> 套餐中一共包含5门程序员必学的数学课程(共47讲) </p> <p> 课程1:《零基础入门微积分》 </p> <p> 课程2:《数理统计与概率论》 </p> <p> 课程3:《代码学习线性代数》 </p> <p> 课程4:《数据处理的最优化》 </p> <p> 课程5:《马尔可夫随机过程》 </p> <p> <br> </p> <p> 哪些人适合学习这门课程? </p> <p> 1)大学生,平时只学习了数学理论,并未接触如何应用数学解决编程问题; </p> <p> 2)对算法、数据结构掌握程度薄弱的人,数学可以让你更好的理解算法、数据结构原理及应用; </p> <p> 3)看不懂大牛代码设计思想的人,因为所有的程序设计底层逻辑都是数学; </p> <p> 4)想学习新技术,如:人工智能、机器学习、深度学习等,这门课程是你的必修课程; </p> <p> 5)想修炼更好的编程内功,在遇到问题时可以灵活的应用数学思维解决问题。 </p> <p> <br> </p> <p> 在这门「专为程序员设计的数学课」系列课中,我们保证你能收获到这些:<br> <br> <span> </span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">①价值300元编程课程大礼包</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">②应用数学优化代码的实操方法</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">③数学理论在编程实战中的应用</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">④程序员必学的5大数学知识</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">⑤人工智能领域必修数学课</span> </p> <p> <br> 备注:此课程只讲程序员所需要的数学,即使你数学基础薄弱,也能听懂,只需要初中的数学知识就足矣。<br> <br> 如何听课? </p> <p> 1、登录CSDN学院 APP 在我的课程中进行学习; </p> <p> 2、登录CSDN学院官网。 </p> <p> <br> </p> <p> 购课后如何领取免费赠送的编程大礼包和加入答疑群? </p> <p> 购课后,添加助教微信:<span> csdnxy68</span>,按提示领取编程大礼包,或观看付费视频的第一节内容扫码进群答疑交流! </p> <p> <img src="https://img-bss.csdn.net/201912251155398753.jpg" alt=""> </p>

ISO13400-2-2019.pdf

是最新版汽车以太网诊断标准,iso13400——2——2019,2019版本,新增安全相关等内容,最新车载以太网 ISO 13400 DoIP 是汽车网络测试和汽车网络开发人员绝佳资料

相关热词 c#树形选择 c#中类图的使用方法 c# 传参 调用exe c# 怎么定义方法 c# 修改本地时间 c#前台怎么读取资源文件 c# xml转list c#实现框选截图 m*m乘法表c# c# 乘法99表
立即提问