【问题标题】:How to use FFMPEG to play H.264 stream from NAL units that are stored as video AVPackets如何使用 FFMPEG 从存储为视频 AVPackets 的 NAL 单元播放 H.264 流
【发布时间】:2013-04-10 23:45:42
【问题描述】:

我正在编写客户端-服务器系统,它使用 FFMPEG 库将 H.264 流解析为服务器端的 NAL 单元,然后使用通道编码通过网络将它们发送到客户端,我的应用程序必须能够播放视频.

问题是如何在我的应用程序中将接收到的 AVPackets(NAL 单元)作为视频流播放。 我发现this tutorial 很有帮助,并将其用作服务器端和客户端的基础。

一些与播放视频相关的示例代码或资源不是来自文件,而是来自使用 FFMPEG 库的程序内部数据,这将非常有帮助。

我确信接收到的信息足以播放视频,因为我尝试将接收到的数据保存为 .h264 或 .mp4 文件,并且可以通过 VLC 播放器播放。

【问题讨论】:

    标签: c++ ffmpeg video-streaming h.264


    【解决方案1】:

    我从您的问题中了解到,您拥有 AVPackets 并想要播放视频。实际上这是两个问题; 1. 解码您的数据包,以及 2. 播放视频。

    要使用 FFmpeg 解码您的数据包,您应该查看AVPacketAVCodecContextavcodec_decode_video2 的文档以获得一些想法;一般的想法是你想做一些事情(只是在浏览器中写了这个,带着一粒盐):

    //the context, set this appropriately based on your video. See the above links for the documentation 
    AVCodecContext *decoder_context; 
    std::vector<AVPacket> packets;   //assume this has your packets
    ...
    AVFrame *decoded_frame = av_frame_alloc();
    int ret = -1;
    int got_frame = 0;
    for(AVPacket packet : packets) 
    {
        avcodec_get_frame_defaults(frame);
        ret = avcodec_decode_video2(decoder_context, decoded_frame, &got_frame, &packet);
        if (ret <= 0) {
            //had an error decoding the current packet or couldn't decode the packet
            break;
        } 
    
        if(got_frame)
        {
            //send to whatever video player queue you're using/do whatever with the frame
            ...
        }
        got_frame = 0;
        av_free_packet(&packet);
    }
    

    这是一个相当粗略的草图,但这是您解码 AVPackets 问题的一般思路。至于播放视频的问题,您有很多选择,这可能更多地取决于您的客户。您要问的是一个相当大的问题,我建议您熟悉 FFmpeg 文档和the FFmpeg site 提供的示例。希望有道理

    【讨论】:

    • 感谢您的回答,我会花时间深入研究和了解FFmpeg。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 2018-06-27
    • 1970-01-01
    相关资源
    最近更新 更多