【问题标题】:H.264 - Green frames when streaming over TCP using FFmpegH.264 - 使用 FFmpeg 通过 TCP 流式传输时出现绿色帧
【发布时间】:2018-01-24 04:02:23
【问题描述】:

我用的是FC23机器,FFMPEG版本是2.8.10

使用下面的命令,我可以成功地通过 tcp 流式传输 flv,并且也能够在接收方成功接收它。我使用vlc播放器播放它。音频和视频都播放得很好。

./ffmpeg -f x11grab -s 1920x1080 -framerate 15 -i :0.0 -f alsa -ac 2 -i hw:1 -vcodec libx264 -r 30 -pix_fmt yuv420p -tune zerolatency -preset ultrafast -acodec aac -strict -2 -ar 48000 -ab 96k -f flv -metadata streamName=naseeb.sdp tcp://127.0.0.1:6666

但实际上我需要使用应用程序来执行此操作。所以我用'C'语言编写了一个应用程序。 我在应用程序中做了以下事情。

 1. Open `AVOutputFormat` using below API
    fmt = av_guess_format("flv", NULL , NULL);
 2. Get `AVFormatContext` using below API
    avformat_alloc_output_context2(&oc, fmt, NULL, NULL);
 3. Then added streams(audio and video) using required APIs
 4. Then open codecs using required APIs
 5. Then set the output using below API
    ret = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE);

(A) 如果我需要将 flv 写入 到系统上的文件中,那么我在第 5 步中将 filename 提供为 muxer.flv

  • 结果:当我使用 VLC 播放器播放 muxer.flv 时,视频和音频都播放良好

(B) 如果我需要通过 tcp 流式传输 flv,那么我将 filename 提供为 tcp://127.0.0.1:6666

  • 结果:当它通过网络流式传输时,视频会显示绿框(但音频效果很好)。当我需要通过网络流式传输时,是否需要额外设置?

我对接收方毫无疑问,因为它与FFmpeg 实用程序(上面提到的命令)配合得很好。 目前我已经下载了 ffmpeg 2.8.10 源代码并查看了ffmpeg.c 文件以获取一些额外的设置。到目前为止,我还没有发现任何有用的东西。

请说明为什么在网络上发送flv时显示绿框,而在系统硬盘上转储时效果很好。

【问题讨论】:

    标签: video ffmpeg video-streaming h.264 flv


    【解决方案1】:

    我已经解决了这个问题。

    之前,我在提取 flv 容器所需的额外数据之前调用了 avformat_write_header

    现在我首先更新st->codec->extradatast->codec->extradata_size 然后我调用avformat_write_header api,一切正常。

    【讨论】:

    • 如何更新st->codec->extradatast->codec->extradata_size。你能分享一些代码示例吗?
    • pkt.data 是第一帧。 st->codec->extradata_size = oc->streams[0]->parser->parser->split(oc->streams[0]->codec,pkt.data,pkt.size); memcpy(st->codec->extradata, pkt.data, st->codec->extradata_size);
    猜你喜欢
    • 2012-04-25
    • 2013-02-06
    • 2013-05-01
    • 2013-06-23
    • 2015-11-22
    • 1970-01-01
    • 2022-08-09
    • 2013-09-22
    • 2020-08-18
    相关资源
    最近更新 更多