From 828e4b0981b546431ce1fe9f61d1883a84b07894 Mon Sep 17 00:00:00 2001 From: hanruobing Date: Fri, 16 Aug 2019 11:15:55 +0800 Subject: [PATCH] add some annotation --- bin/testGo.jpeg | Bin 0 -> 19199 bytes convert.go | 120 +++++++++++++------------------- {src => resource}/h265.mp4 | Bin {src => resource}/test.h265 | Bin {src => resource}/testvack.h265 | Bin 5 files changed, 49 insertions(+), 71 deletions(-) create mode 100644 bin/testGo.jpeg rename {src => resource}/h265.mp4 (100%) rename {src => resource}/test.h265 (100%) rename {src => resource}/testvack.h265 (100%) diff --git a/bin/testGo.jpeg b/bin/testGo.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..7a02ec951ee3041310cd008e891b6473db56e44b GIT binary patch literal 19199 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%0DO=&ArecJLXy%b)9x+Ujiz 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 S3#C+FYPFmGUm-a6AOG2o)H0L+ literal 0 HcmV?d00001 diff --git a/convert.go b/convert.go index 31d7e3a..d5a5636 100644 --- a/convert.go +++ b/convert.go @@ -1,7 +1,7 @@ package main /* - +//user you own clib path and *.h path #cgo CFLAGS: -I/usr/local/ffmpeg/include #cgo LDFLAGS:-L/usr/local/ffmpeg/lib -lavcodec -lavformat -lavfilter -lavutil -lavdevice -lswresample @@ -26,20 +26,11 @@ struct Output int offset; }; -//函数声明 +//func declear int saveJpg(AVFrame *pFrame, struct Output *output_data); //缓存1Mb const int BUF_SIZE = 1048576; -// const 32KB = 32768; -// char h265_data; //传入的h265文件 -// // char *h265_data; -// int read_true_size = 0; //h265文件实际大小 -// int read_offset = 0; //读取的偏移 - -// int write_offset = 0; -// uint8_t jpeg_data[1048576] = {"\0"}; -// uint8_t *jpeg_data = NULL; //读取数据的回调函数------------------------- //AVIOContext使用的回调函数! @@ -47,10 +38,14 @@ const int BUF_SIZE = 1048576; //手动初始化AVIOContext只需要两个东西:内容来源的buffer,和读取这个Buffer到FFmpeg中的函数 //回调函数,功能就是:把buf_size字节数据送入buf即可 //第一个参数(void *opaque)一般情况下可以不用 + +//call back fun for AVIOContext +//retuen the size of data in real +//send buf_size data to buf int fill_iobuffer(void *opaque, uint8_t *buf, int buf_size) { //从h256_data拷贝到buf中buf_size个字节 - + //copy buf_size data to buf from h265_data struct Input *data = (struct Input *)opaque; // int read_offset = data->offset; int size = data->size; @@ -58,7 +53,7 @@ int fill_iobuffer(void *opaque, uint8_t *buf, int buf_size) if (data->offset + buf_size - 1 < size) { - //读取未溢出 直接复制 + //has enough data memcpy(buf, h265_data + data->offset, buf_size); data->offset += buf_size; // printf("callback: read offset: %d\n", read_offset); @@ -66,18 +61,17 @@ int fill_iobuffer(void *opaque, uint8_t *buf, int buf_size) } else { - //已经溢出无法读取 + //no data to read if (data->offset >= size) { return -1; } else { - //还有剩余字节未读取但不到buf_size 读取剩余字节 int real_read = size - data->offset; memcpy(buf, h265_data + data->offset, real_read); data->offset += buf_size; - printf("callback: read offset: %d\n", data->offset); + // printf("callback: read offset: %d\n", data->offset); return real_read; } } @@ -94,11 +88,10 @@ int convert(struct Input *input_data, struct Output *output_data) AVFrame *frame; // 帧 AVPacket avpkt; // 数据包 - //打开文件描述符 - // fp_open = fopen(inputFile, "rb+"); fmtCtx = avformat_alloc_context(); unsigned char *iobuffer = (unsigned char *)av_malloc(BUF_SIZE); - //初始化AVIOContext fill_iobuffer为自定的回调函数 + + //init AVIOContext fill_iobuffer is a callback func AVIOContext *avio = avio_alloc_context(iobuffer, BUF_SIZE, 0, input_data, fill_iobuffer, NULL, NULL); fmtCtx->pb = avio; @@ -108,14 +101,14 @@ int convert(struct Input *input_data, struct Output *output_data) exit(0); } - if (avformat_find_stream_info(fmtCtx, NULL) < 0) // 失败返回负值 + if (avformat_find_stream_info(fmtCtx, NULL) < 0) { printf("Error in find stream"); exit(0); } - //av_dump_format(fmt_ctx, 0, inputFile, 0); // 打印控制信息 - av_init_packet(&avpkt); // 初始化数据包 + //av_dump_format(fmt_ctx, 0, inputFile, 0); + av_init_packet(&avpkt); avpkt.data = NULL; avpkt.size = 0; @@ -126,10 +119,11 @@ int convert(struct Input *input_data, struct Output *output_data) exit(0); } - originPar = fmtCtx->streams[streamType]->codecpar; // 获取流对应的解码器参数 - codec = avcodec_find_decoder(originPar->codec_id); // 根据解码器参数获取解码器 + //auto find right encoder + originPar = fmtCtx->streams[streamType]->codecpar; + codec = avcodec_find_decoder(originPar->codec_id); if (!codec) - { // 未找到返回NULL + { printf("Error in get the codec"); exit(0); } @@ -141,7 +135,7 @@ int convert(struct Input *input_data, struct Output *output_data) exit(0); } - if (avcodec_parameters_to_context(codeCtx, originPar) < 0) // 替换解码器上下文参数 + if (avcodec_parameters_to_context(codeCtx, originPar) < 0) { printf("Error in replace the parameters int the codeCtx"); exit(0); @@ -171,10 +165,11 @@ int convert(struct Input *input_data, struct Output *output_data) } } + //free av_packt av_packet_unref(&avpkt); } -//写文件的回调函数 +//your own callback func, to deal with converted data int write_buffer(void *opaque, uint8_t *buf, int buf_size) { struct Output *data = (struct Output *)opaque; @@ -195,28 +190,19 @@ int saveJpg(AVFrame *pFrame, struct Output *output_data) int height = pFrame->height; AVCodecContext *pCodeCtx = NULL; - //打开输出文件 - // fp_write = fopen(out_name, "wb+"); AVFormatContext *pFormatCtx = NULL; avformat_alloc_output_context2(&pFormatCtx, NULL, "mjpeg", NULL); - // AVFormatContext *pFormatCtx = avformat_alloc_context(); - // 设置输出文件格式 - // pFormatCtx->oformat = av_guess_format("mjpeg", NULL, NULL); + //new a AVIOContext and contact with pFormatCtx + //you need give AVIOContext your own call back func, to tell AVIOContext how to write the converted data unsigned char *outbuffer = (unsigned char *)av_malloc(BUF_SIZE); - //新建一个AVIOContext 并与pFormatCtx关联 AVIOContext *avio_out = avio_alloc_context(outbuffer, BUF_SIZE, 1, output_data, NULL, write_buffer, NULL); + //contact with pFormatCtx pFormatCtx->pb = avio_out; pFormatCtx->flags = AVFMT_FLAG_CUSTOM_IO | AVFMT_FLAG_FLUSH_PACKETS; - // //创建并初始化输出AVIOContext - // if (avio_open(&pFormatCtx->pb, "./bin/nothing.jpeg", AVIO_FLAG_READ_WRITE) < 0) - // { - // printf("Couldn't open output file.\n"); - // return -1; - // } - // 构建一个新stream + // new stream AVStream *pAVStream = avformat_new_stream(pFormatCtx, 0); if (pAVStream == NULL) { @@ -269,11 +255,11 @@ int saveJpg(AVFrame *pFrame, struct Output *output_data) int y_size = width * height; //Encode - // 给AVPacket分配足够大的空间 + //give AVPacket enough space AVPacket pkt; av_new_packet(&pkt, y_size * 3); - // 编码数据 + // send frame ret = avcodec_send_frame(pCodeCtx, pFrame); if (ret < 0) { @@ -281,7 +267,7 @@ int saveJpg(AVFrame *pFrame, struct Output *output_data) return -1; } - // 得到编码后数据 + // recv packt ret = avcodec_receive_packet(pCodeCtx, &pkt); if (ret < 0) { @@ -373,54 +359,46 @@ func c_h265_to_jpeg(src []byte, size int) (des []byte, err error) { res := C.h265_to_jpeg(c_src, c_des, *c_int) // fmt.Println(res) if res < 0 { - err = errors.New("C encode err!") + err = errors.New("C convert err!") return } des = des[:res] return } -var times = 10 - -//BenchmarkFFMpegC test -func BenchmarkFFMpegC(src []byte) { - - var des []byte - for i := 0; i < times; i++ { - func() { - des, _ = c_h265_to_jpeg(src, len(src)) - }() +func startConvert(src []byte) { + des, err := c_h265_to_jpeg(src, len(src)) + if err != nil { + return } - + //write files WriteWithIoutil("./bin/testGo.jpeg", des) } func main() { - var now, end time.Time - // go func() { - // log.Println(http.ListenAndServe("localhost:10000", nil)) - // }() - //读取文件 - inputFile := "/work/dana_work/gopath/src/github.com/lucish/convert-video/src/huangxiao.h265" + //read resource + inputFile := "resource/test.h265" src, err := ReadAll(inputFile) if err != nil || len(src) == 0 { fmt.Println(err.Error()) fmt.Println("read file err") return } - fmt.Println("read file len: ", len(src)) + // fmt.Println("read file len: ", len(src)) - fmt.Println("开始执行转码") - now = time.Now() - BenchmarkFFMpegC(src) - end = time.Now() + fmt.Println("start convert") - fmt.Printf("FFMpegC loop %d times, the cost time is %d\n", times, end.Sub(now)) + start := time.Now().UnixNano() + startConvert(src) + end := time.Now().UnixNano() + + fmt.Printf("cost time is %d ms\n", (end-start)/1e6) // select {} } +//read file func ReadAll(filePth string) ([]byte, error) { f, err := os.Open(filePth) defer f.Close() @@ -430,10 +408,10 @@ func ReadAll(filePth string) ([]byte, error) { return ioutil.ReadAll(f) } -//使用ioutil.WriteFile方式写入文件,是将[]byte内容写入文件,如果content字符串中没有换行符的话,默认就不会有换行符 -func WriteWithIoutil(name string, content []byte) error { - if err := ioutil.WriteFile(name, content, 0644); err == nil { - fmt.Println("写入文件成功") +//weite file +func WriteWithIoutil(filePath string, content []byte) error { + if err := ioutil.WriteFile(filePath, content, 0644); err == nil { + fmt.Println("write file success") } else { fmt.Println(err.Error()) } diff --git a/src/h265.mp4 b/resource/h265.mp4 similarity index 100% rename from src/h265.mp4 rename to resource/h265.mp4 diff --git a/src/test.h265 b/resource/test.h265 similarity index 100% rename from src/test.h265 rename to resource/test.h265 diff --git a/src/testvack.h265 b/resource/testvack.h265 similarity index 100% rename from src/testvack.h265 rename to resource/testvack.h265