H264解码实战

0.解码流程图

视频解码.png

1.命令行解码

 songlin@feng-sl  ~/audio/h264_decode   master ±✚  ffmpeg -c:v h264 -i 352x288-yuv420p.h264 352x288-yuv420pCommand.yuv
ffmpeg version 4.3.2 Copyright (c) 2000-2021 the FFmpeg developers
  built with Apple clang version 12.0.0 (clang-1200.0.32.29)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.2_4 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Input #0, h264, from '352x288-yuv420p.h264':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: h264 (High), yuv420p(progressive), 352x288, 25 fps, 25 tbr, 1200k tbn, 50 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> rawvideo (native))
Press [q] to stop, [?] for help
Output #0, rawvideo, to '352x288-yuv420pCommand.yuv':
  Metadata:
    encoder         : Lavf58.45.100
    Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 352x288, q=2-31, 30412 kb/s, 25 fps, 25 tbn, 25 tbc
    Metadata:
      encoder         : Lavc58.91.100 rawvideo
frame=  300 fps=0.0 q=-0.0 Lsize=   44550kB time=00:00:12.00 bitrate=30412.8kbits/s speed=12.3x
video:44550kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%
 songlin@feng-sl  ~/audio/h264_decode   master ±✚  ls -l
# -c:v h264是指定使用h264作为解码器
-rw-r--r--@ 1 songlin  staff    147325 Jun 12 11:16 352x288-yuv420p.h264
-rw-r--r--  1 songlin  staff  45619200 Jun 12 15:57 352x288-yuv420pCommand.yuv

可以看到命令行成功还算了h264 为yuv原始数据,接下来看看代码实现

2.程序实践

  • ffmpeg.h
#ifndef FFMPEGS_H
#define FFMPEGS_H

extern "C"{
#include 
}

typedef struct {
    const char *filename;
    int width;
    int height;
    AVPixelFormat pixFmt;
    int fps;
} VideoDecodeSpec;

class FFmpegs
{
public:
    FFmpegs();

    static void h264Decode(const char *inFilename,
                           VideoDecodeSpec &out);
};

#endif // FFMPEGS_H

  • ffmpegs.cpp
#include "ffmpegs.h"
#include 
#include 

extern "C" {
#include 
#include 
#include 
}

#define ERROR_BUF(ret) \
    char errbuf[1024]; \
    av_strerror(ret, errbuf, sizeof (errbuf));

// 输入缓冲区的大小
#define IN_DATA_SIZE 4096

FFmpegs::FFmpegs() {

}

static int frameIdx = 0;

static int decode(AVCodecContext *ctx,
                  AVPacket *pkt,
                  AVFrame *frame,
                  QFile &outFile) {
    // 发送压缩数据到解码器
    int ret = avcodec_send_packet(ctx, pkt);
    if (ret < 0) {
        ERROR_BUF(ret);
        qDebug() << "avcodec_send_packet error" << errbuf;
        return ret;
    }

    while (true) {
        // 获取解码后的数据
        ret = avcodec_receive_frame(ctx, frame);
        if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
            return 0;
        } else if (ret < 0) {
            ERROR_BUF(ret);
            qDebug() << "avcodec_receive_frame error" << errbuf;
            return ret;
        }

        qDebug() << "解码出第" << ++frameIdx << "帧";

        // 将解码后的数据写入文件
        // 写入Y平面
//        outFile.write((char *) frame->data[0],
//                      frame->linesize[0] * ctx->height);
//        // 写入U平面
//        outFile.write((char *) frame->data[1],
//                      frame->linesize[1] * ctx->height >> 1);
//        // 写入V平面
//        outFile.write((char *) frame->data[2],
//                      frame->linesize[2] * ctx->height >> 1);

             /*   outFile.write((char *) frame->data[0],
                              921600);
                // 写入U平面
                outFile.write((char *) frame->data[1],
                              230400);
                // 写入V平面
                outFile.write((char *) frame->data[2],
                              230400);
//       qDebug() << frame->linesize[0] * ctx->height << (frame->linesize[1] * ctx->height >> 1) << (frame->linesize[2] * ctx->height >> 1);
//        return 0;
//  av_image_alloc(frame->data,frame->linesize,1280,720,AV_PIX_FMT_YUV420P,1); 连续内存地址
//                return;


        /*
         * frame->data[0] 0x7ffea128c000
         * frame->data[1] 0x7ffea1d33000
         * frame->data[2] 0x7ffea1d6d000
         *
         * frame->data[1] - frame->data[0] = 11169792 = y平面的大小
         * frame->data[2] - frame->data[1] = 237568 = u平面的大小
         *
         * y平面的大小 1280*720*1 = 921600
         * u平面的大小 1280*720*0.25 = 230400
         * v平面的大小 1280*720*0.25 =  230400
         */
 qDebug() << frame->data[0] << frame->data[1] << frame->data[2];

//        // 将解码后的数据写入文件(1382400)
        int imgSize = av_image_get_buffer_size(ctx->pix_fmt, ctx->width, ctx->height, 1);
        qDebug() << "输出一幁的大小" << imgSize;
//        // outFile.write((char *) frame->data[0], frame->linesize[0]);
        outFile.write((char *) frame->data[0], imgSize);
    }
}

void FFmpegs::h264Decode(const char *inFilename,
                         VideoDecodeSpec &out) {
    // 返回结果
    int ret = 0;

    // 用来存放读取的输入文件数据(h264)
    // 加上AV_INPUT_BUFFER_PADDING_SIZE是为了防止某些优化过的reader一次性读取过多导致越界
    char inDataArray[IN_DATA_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];
    char *inData = inDataArray;

    // 每次从输入文件中读取的长度(h264)
    // 输入缓冲区中,剩下的等待进行解码的有效数据长度
    int inLen;
    // 是否已经读取到了输入文件的尾部
    int inEnd = 0;

    // 文件
    QFile inFile(inFilename);
    QFile outFile(out.filename);

    // 解码器
    AVCodec *codec = nullptr;
    // 上下文
    AVCodecContext *ctx = nullptr;
    // 解析器上下文
    AVCodecParserContext *parserCtx = nullptr;

    // 存放解码前的数据(h264)
    AVPacket *pkt = nullptr;
    // 存放解码后的数据(yuv)
    AVFrame *frame = nullptr;

    // 获取解码器
    //    codec = avcodec_find_decoder_by_name("h264");
    codec = avcodec_find_decoder(AV_CODEC_ID_H264);
    if (!codec) {
        qDebug() << "decoder not found";
        return;
    }

    // 初始化解析器上下文
    parserCtx = av_parser_init(codec->id);
    if (!parserCtx) {
        qDebug() << "av_parser_init error";
        return;
    }

    // 创建上下文
    ctx = avcodec_alloc_context3(codec);
    if (!ctx) {
        qDebug() << "avcodec_alloc_context3 error";
        goto end;
    }

    // 创建AVPacket
    pkt = av_packet_alloc();
    if (!pkt) {
        qDebug() << "av_packet_alloc error";
        goto end;
    }

    // 创建AVFrame
    frame = av_frame_alloc();
    if (!frame) {
        qDebug() << "av_frame_alloc error";
        goto end;
    }

    // 打开解码器
    ret = avcodec_open2(ctx, codec, nullptr);
    if (ret < 0) {
        ERROR_BUF(ret);
        qDebug() << "avcodec_open2 error" << errbuf;
        goto end;
    }

    // 打开文件
    if (!inFile.open(QFile::ReadOnly)) {
        qDebug() << "file open error:" << inFilename;
        goto end;
    }
    if (!outFile.open(QFile::WriteOnly)) {
        qDebug() << "file open error:" << out.filename;
        goto end;
    }

    // 读取文件数据
    do {
        inLen = inFile.read(inDataArray, IN_DATA_SIZE);
        // 设置是否到了文件尾部
        inEnd = !inLen;

        // 让inData指向数组的首元素
        inData = inDataArray;

        // 只要输入缓冲区中还有等待进行解码的数据
        while (inLen > 0 || inEnd) {
            // 到了文件尾部(虽然没有读取任何数据,但也要调用av_parser_parse2,修复bug)

            // 经过解析器解析
            ret = av_parser_parse2(parserCtx, ctx,
                                   &pkt->data, &pkt->size,
                                   (uint8_t *) inData, inLen,
                                   AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);

            if (ret < 0) {
                ERROR_BUF(ret);
                qDebug() << "av_parser_parse2 error" << errbuf;
                goto end;
            }

            // 跳过已经解析过的数据
            inData += ret;
            // 减去已经解析过的数据大小
            inLen -= ret;

            qDebug() << inEnd << pkt->size << ret;

            // 解码
            if (pkt->size > 0 && decode(ctx, pkt, frame, outFile) < 0) {
                goto end;
            }

            // 如果到了文件尾部
            if (inEnd) break;
        }
    } while (!inEnd);
//        while ((inLen = inFile.read(inDataArray, IN_DATA_SIZE)) > 0){
//            // 让inData指向数组的首元素
//            inData = inDataArray;
//            while (inLen > 0) {
//                // 经过解析器解析
//                ret = av_parser_parse2(parserCtx, ctx,
//                                       &pkt->data, &pkt->size,
//                                       (uint8_t *) inData, inLen,
//                                       AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);

//                if (ret < 0) {
//                    ERROR_BUF(ret);
//                    qDebug() << "av_parser_parse2 error" << errbuf;
//                    goto end;
//                }

//                // 跳过已经解析过的数据
//                inData += ret;
//                // 减去已经解析过的数据大小
//                inLen -= ret;

//                // 解码
//                if (pkt->size > 0 && decode(ctx, pkt, frame, outFile) < 0) {
//                    goto end;
//                }
//            }
//        }

    // 刷新缓冲区
    //    pkt->data = nullptr;
    //    pkt->size = 0;
    //    decode(ctx, pkt, frame, outFile);
    decode(ctx, nullptr, frame, outFile);

    // 赋值输出参数
    out.fps = ctx->framerate.num;
    out.width = ctx->width;
    out.height = ctx->height;
    out.pixFmt = ctx->pix_fmt;
    // 用framerate.num获取帧率,并不是time_base.den

end:
    inFile.close();
    outFile.close();
    av_packet_free(&pkt);
    av_frame_free(&frame);
    av_parser_close(parserCtx);
    avcodec_free_context(&ctx);

// bug fix
// https://patchwork.ffmpeg.org/project/ffmpeg/patch/[email protected]/

//
//    while ((inLen = inFile.read(inDataArray, IN_DATA_SIZE)) > 0){
//        while (inLen > 0) {
    // 让inData指向数组的首元素
//    inData = inDataArray;
//            // 经过解析器解析
//            ret = av_parser_parse2(parserCtx, ctx,
//                                   &pkt->data, &pkt->size,
//                                   (uint8_t *) inData, inLen,
//                                   AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);

//            if (ret < 0) {
//                ERROR_BUF(ret);
//                qDebug() << "av_parser_parse2 error" << errbuf;
//                goto end;
//            }

//            // 跳过已经解析过的数据
//            inData += ret;
//            // 减去已经解析过的数据大小
//            inLen -= ret;

//            // 解码
//            if (pkt->size > 0 && decode(ctx, pkt, frame, outFile) < 0) {
//                goto end;
//            }
//        }
//    }
}


  • audiothread.h
#ifndef AUDIOTHREAD_H
#define AUDIOTHREAD_H

#include 

class AudioThread : public QThread
{
    Q_OBJECT
public:
    explicit AudioThread(QObject *parent = nullptr);
    ~AudioThread();
private:
    void run();

signals:

};

#endif // AUDIOTHREAD_H

  • audiothread.cpp
#include "audiothread.h"
#include 
#include "ffmpegs.h"

extern "C" {
#include 
}

AudioThread::AudioThread(QObject *parent) : QThread(parent)
{
    // 当监听到线程结束时(finished),就调用deleteLater回收内存
        connect(this, &AudioThread::finished,
                this, &AudioThread::deleteLater);
}

AudioThread::~AudioThread() {
    // 断开所有的连接
    disconnect();
    // 内存回收之前,正常结束线程
    requestInterruption();
    // 安全退出
    quit();
    wait();
    qDebug() << this << "析构(内存被回收)";
}

void AudioThread::run() {
    VideoDecodeSpec out;
    out.filename = "/Users/songlin/audio/h264_decode/352x288-yuv420p-program.yuv";

    FFmpegs::h264Decode("/Users/songlin/audio/h264_decode/352x288-yuv420p.h264", out);

    qDebug() << out.width << out.height
             << out.fps << av_get_pix_fmt_name(out.pixFmt);
}

  • mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 

#include 

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_audioButton_clicked();

private:
    Ui::MainWindow *ui;
     AudioThread *_audioThread = nullptr;
};
#endif // MAINWINDOW_H

  • mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_audioButton_clicked()
{
    _audioThread = new AudioThread(this);
    _audioThread->start();
}

2.1 查看实践结果

程序生成文件小于命令行生成文件的问题

解码出第 1 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 2 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 3 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 4 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 5 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 6 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 7 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 8 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 9 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 10 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 11 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 12 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 13 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 14 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 15 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 16 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 17 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 18 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 19 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 20 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 21 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 22 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 23 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 24 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 25 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 26 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 27 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 28 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 29 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 30 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 31 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 32 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 33 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 34 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 35 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 36 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 37 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 38 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 39 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 40 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 41 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 42 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 43 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 44 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 45 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 46 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 47 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 48 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 49 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 50 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 51 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 52 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 53 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 54 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 55 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 56 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 57 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 58 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 59 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 60 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 61 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 62 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 63 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 64 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 65 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 66 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 67 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 68 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 69 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 70 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 71 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 72 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 73 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 74 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 75 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 76 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 77 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 78 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 79 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 80 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 81 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 82 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 83 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 84 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 85 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 86 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 87 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 88 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 89 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 90 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 91 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 92 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 93 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 94 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 95 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 96 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 97 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 98 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 99 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 100 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 101 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 102 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 103 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 104 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 105 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 106 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 107 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 108 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 109 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 110 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 111 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 112 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 113 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 114 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 115 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 116 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 117 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 118 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 119 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 120 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 121 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 122 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 123 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 124 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 125 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 126 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 127 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 128 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 129 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 130 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 131 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 132 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 133 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 134 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 135 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 136 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 137 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 138 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 139 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 140 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 141 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 142 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 143 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 144 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 145 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 146 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 147 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 148 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 149 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 150 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 151 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 152 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 153 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 154 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 155 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 156 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 157 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 158 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 159 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 160 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 161 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 162 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 163 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 164 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 165 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 166 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 167 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 168 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 169 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 170 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 171 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 172 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 173 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 174 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 175 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 176 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 177 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 178 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 179 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 180 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 181 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 182 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 183 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 184 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 185 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 186 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 187 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 188 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 189 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 190 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 191 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 192 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 193 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 194 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 195 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 196 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 197 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 198 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 199 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 200 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 201 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 202 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 203 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 204 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 205 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 206 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 207 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 208 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 209 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 210 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 211 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 212 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 213 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 214 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 215 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 216 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 217 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 218 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 219 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 220 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 221 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 222 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 223 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 224 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 225 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 226 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 227 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 228 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 229 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 230 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 231 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 232 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 233 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 234 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 235 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 236 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 237 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 238 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 239 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 240 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 241 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 242 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 243 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 244 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 245 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 246 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 247 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 248 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 249 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 250 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 251 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 252 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 253 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 254 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 255 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 256 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 257 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 258 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 259 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 260 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 261 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 262 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 263 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 264 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 265 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 266 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 267 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 268 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 269 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 270 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 271 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 272 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 273 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 274 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 275 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 276 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 277 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 278 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 279 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 280 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 281 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 282 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 283 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 284 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 285 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 286 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 287 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 288 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 289 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 290 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 291 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 292 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
解码出第 293 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 294 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 295 帧
一幁的大小是 152064
0x7fa4888b8000 0x7fa48714e600 0x7fa487155400
解码出第 296 帧
一幁的大小是 152064
0x7fa48ccd3000 0x7fa4878ad600 0x7fa4878b4400
解码出第 297 帧
一幁的大小是 152064
0x7fa488898000 0x7fa48712c800 0x7fa487133600
解码出第 298 帧
一幁的大小是 152064
0x7fa488858000 0x7fa487183600 0x7fa48718a400
解码出第 299 帧
一幁的大小是 152064
0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
输出格式 352 288 25 yuv420p
AudioThread(0x7fa488b05f90) 析构(内存被回收)

我们来验证一下这些参数是否正确,首先查看一幁的数据是多大

  • 验证1 整数据大小是否和输出一致
352 * 288 * 1.5 = 152064
这个大小和输出的一致,说明计算的一幁大小是没有问题的
  • 验证2 程序运行和终端运行产出文件是否一致
-rw-r--r--  1 songlin  staff  43144704 Jun 12 16:43 352x288-yuv420p-program.yuv
-rw-r--r--@ 1 songlin  staff    147325 Jun 12 11:16 352x288-yuv420p.h264
-rw-r--r--  1 songlin  staff  45619200 Jun 12 15:57 352x288-yuv420pCommand.yuv

可以看命令行生成的文件要比程序代码生成的要大45619200 - 43144704 = 2474496 字节
另外计算写入总的大小=幁数 152064 * 299 = 45467136,这三个大小感觉相差不大,但是为什么会有差值呢?猜测会不会是没有将一幁的数据大小完全写进去,或者没有写完全部幁数呢,这些和指向YUV的内存地址是否连续有很大的相关性,所以我们对上述的内存地址做一次计算,取299幁的来计算

0x7fa488878000 0x7fa487168e00 0x7fa48716fc00
* frame->data[0] 0x8878000
* frame->data[1] 0x87168e00
* frame->data[2] 0x8716fc00

看到这里我分析不下去了,因为不知道为什么frame->data[1] 比frame->data[0] 小,又比frame->data[2]小,按道理来讲数组的内存应该是连续且变大的,但是这里明显不是?
经过一天的摸索,发现可能是原视频本身存在问题导致的,所以决定用一个mp4的视频,进行转码变成原始yuv来测试

mp4------>yuv yuv------>h264 h 264------->yuv 测试

  • mp4 转yuv
ffmpeg -ss 00:00 -i in.mp4 -t 10 -c:v copy -c:a copy 10s.mp4
ffmpeg -c:v h264 -i 10.mp4 mp4.yuv
  • yuv 转h264
ffmpeg -s 1280x720 -pix_fmt yuv420p -i mp4.yuv -c:v libx264 mp4.h264
  • h264 转yuv
  • 命令行 ffmpeg -c:v h264 -i mp4.h264 mp4Command.yuv
  • 程序
解码出第 1 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 2 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 3 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 4 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 5 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 6 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 7 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 8 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 9 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 10 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 11 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 12 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 13 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 14 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 15 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 16 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 17 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 18 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 19 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 20 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 21 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 22 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 23 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 24 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 25 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 26 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 27 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 28 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 29 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 30 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 31 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 32 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 33 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 34 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 35 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 36 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 37 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 38 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 39 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 40 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 41 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 42 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 43 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 44 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 45 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 46 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 47 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 48 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 49 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 50 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 51 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 52 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 53 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 54 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 55 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 56 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 57 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 58 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 59 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 60 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 61 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 62 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 63 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 64 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 65 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 66 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 67 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 68 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 69 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 70 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 71 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 72 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 73 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 74 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 75 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 76 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 77 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 78 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 79 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 80 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 81 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 82 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 83 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 84 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 85 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 86 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 87 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 88 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 89 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 90 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 91 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 92 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 93 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 94 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 95 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 96 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 97 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 98 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 99 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 100 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 101 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 102 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 103 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 104 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 105 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 106 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 107 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 108 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 109 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 110 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 111 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 112 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 113 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 114 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 115 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 116 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 117 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 118 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 119 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 120 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 121 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 122 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 123 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 124 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 125 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 126 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 127 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 128 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 129 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 130 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 131 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 132 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 133 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 134 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 135 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 136 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 137 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 138 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 139 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 140 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 141 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 142 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 143 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 144 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 145 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 146 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 147 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 148 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 149 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 150 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 151 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 152 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 153 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 154 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 155 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 156 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 157 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 158 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 159 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 160 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 161 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 162 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 163 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 164 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 165 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 166 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 167 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 168 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 169 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 170 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 171 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 172 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 173 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 174 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 175 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 176 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 177 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 178 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 179 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 180 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 181 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 182 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 183 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 184 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 185 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 186 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 187 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 188 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 189 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 190 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 191 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 192 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 193 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 194 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 195 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 196 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 197 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 198 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 199 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 200 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 201 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 202 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 203 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 204 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 205 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 206 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 207 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 208 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 209 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 210 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 211 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 212 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 213 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 214 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 215 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 216 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 217 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 218 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 219 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 220 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 221 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 222 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 223 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 224 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 225 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 226 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 227 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 228 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 229 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 230 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 231 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 232 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 233 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 234 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 235 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 236 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 237 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 238 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 239 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 240 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 241 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 242 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 243 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 244 帧
0x7ffea1fe5000 0x7ffea20cc000 0x7ffea2106000
输出一幁的大小 1382400
解码出第 245 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
解码出第 246 帧
0x7ffea15a4000 0x7ffea1e19000 0x7ffea1e53000
输出一幁的大小 1382400
解码出第 247 帧
0x7ffea1100000 0x7ffea1c2c000 0x7ffea1c66000
输出一幁的大小 1382400
解码出第 248 帧
0x7ffea1418000 0x7ffea1eff000 0x7ffea1f39000
输出一幁的大小 1382400
解码出第 249 帧
0x7ffea128c000 0x7ffea1d33000 0x7ffea1d6d000
输出一幁的大小 1382400
输出格式 1280 720 25 yuv420p
AudioThread(0x7ffe9bce2950) 析构(内存被回收)

大小对比

-rw-r--r--  1 songlin  staff  345600000 Jun 14 08:58 mp4Command.yuv -- 命令行
-rw-r--r--  1 songlin  staff  344317200 Jun 14 08:46 lessmp4-program.yuv -- 程序

可以明显发现程序跑出来的比命令行的要小,这个时候接着上面的分析,取出frame->data[0],frame->data[1],frame->data[2] 的地址(用最后一幁来说明)

一幁的大小: 1280 * 720 * 1.5 = 1382400,和程序运行的是一样的
frame->data[0]:0x7ffea128c000 
frame->data[1]:0x7ffea1d33000 
frame->data[2]:0x7ffea1d6d000
如何检查这个内存是否连续呢?

frame->data[1] - frame->data[0] = 11169792 = y平面的大小
frame->data[2] - frame->data[1] = 237568 = u平面的大小

 y平面的大小 1280*720*1 = 921600(计算方式和存储方式有关)
u平面的大小 1280*720*0.25 = 230400(计算方式和存储方式有关)
v平面的大小 1280*720*0.25 =  230400(计算方式和存储方式有关)

出现这种YUV内存不连续的情况,如果按照这样去写进文件中,肯定是有问题的,因为有可能我读到一幁的数据是1382400,写进去的Y数据有可能只是921600,这样就会导致写进去的数据偏小,针对这种情况,我们可以使用直接将Y U V 数据大小写进去测试看看


                outFile.write((char *) frame->data[0],
                              921600);
                // 写入U平面
                outFile.write((char *) frame->data[1],
                              230400);
                // 写入V平面
                outFile.write((char *) frame->data[2],
                              230400);

测试结果:

-rw-r--r--  1 songlin  staff  345600000 Jun 14 08:58 mp4Command.yuv
-rw-r--r--  1 songlin  staff  344217600 Jun 14 09:37 test-program.yuv

发现这样写进去的,两者之间的数据更接近了,相减得出1382400 字节,刚刚是差了一幁字节,这一幁字节是在哪里缺少的呢?缓冲区又已经刷新了,那么只能是里面的while循环导致的,在网上也能找到的确是会出现这个问题,并且已经修复(ffmpeg源码也是我们代码这样写,有可能在以后的版本中修复了,但是没有在源码中更新)https://patchwork.ffmpeg.org/project/ffmpeg/patch/[email protected]/
按照这个方法,我们将写入数据的循环更改为:

    do {
        inLen = inFile.read(inDataArray, IN_DATA_SIZE);
        // 设置是否到了文件尾部
        inEnd = !inLen;

        // 让inData指向数组的首元素
        inData = inDataArray;

        // 只要输入缓冲区中还有等待进行解码的数据
        while (inLen > 0 || inEnd) {
            // 到了文件尾部(虽然没有读取任何数据,但也要调用av_parser_parse2,修复bug)

            // 经过解析器解析
            ret = av_parser_parse2(parserCtx, ctx,
                                   &pkt->data, &pkt->size,
                                   (uint8_t *) inData, inLen,
                                   AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);

            if (ret < 0) {
                ERROR_BUF(ret);
                qDebug() << "av_parser_parse2 error" << errbuf;
                goto end;
            }

            // 跳过已经解析过的数据
            inData += ret;
            // 减去已经解析过的数据大小
            inLen -= ret;

            qDebug() << inEnd << pkt->size << ret;

            // 解码
            if (pkt->size > 0 && decode(ctx, pkt, frame, outFile) < 0) {
                goto end;
            }

            // 如果到了文件尾部
            if (inEnd) break;
        }
    } while (!inEnd);

结果对比:

-rw-r--r--  1 songlin  staff  345600000 Jun 14 08:58 mp4Command.yuv
-rw-r--r--  1 songlin  staff  344217600 Jun 14 09:37 test-program.yuv
-rw-r--r--  1 songlin  staff  345600000 Jun 14 09:46 after-program.yuv --- 更改之后

可以发现数据已经正确了,好了,h264的解码到此结束

你可能感兴趣的:(H264解码实战)