ffmpeg av_interleaved_write_frame(): Broken pipe under windows

陌路散爱 提交于 2019-12-20 02:54:13

问题


I am using ffmpeg to convert original media file to rawvideo yuv format, ouputed the yuv to pipe, then my command tool receive the raw yuv as input, do some processing.

e.g:

D:\huang_xuezhong\build_win32_VDNAGen>ffmpeg -i test.mkv -c:v rawvideo -s 320x240 -f rawvideo - | my_tool -o output

every time, when run the command, ffmpeg will dump this av_interleaved_write_frame(): Broken pipe error msg:

Output #0, rawvideo, to 'pipe:':
  Metadata:
  encoder         : Lavf56.4.101
  Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 320x240 [SAR 120:91 DAR 160:91], q=2-31, 200 kb/s, 24 fps, 24 tbn, 24 tbc (default)
  Metadata:
      encoder         : Lavc56.1.100 rawvideo
  Stream mapping:
      Stream #0:0 -> #0:0 (h264 (native) -> rawvideo (native))
Press [q] to stop, [?] for help
av_interleaved_write_frame(): Broken pipe
frame=    1 fps=0.0 q=0.0 Lsize=     112kB time=00:00:00.04 bitrate=22118.2kbits/s
video:112kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing o
verhead: 0.000000%
Conversion failed!

in my souce code: it take stdin as the input file, every time, it read a frame size content from it, if the content read is less than a frame size, then continue read, until a frame is fetched, then it use the frame content to generate something.

int do_work (int jpg_width, int jpg_height) 
{
int ret = 0;

FILE *yuv_fp = NULL;
unsigned char * yuv_buf = NULL;
int frame_size = 0;
int count = 0;
int try_cnt = 0;

frame_size = jpg_width * jpg_height * 3 / 2;
va_log (vfp_log, "a frame size:%d\n", frame_size);

yuv_fp = stdin;

yuv_buf = (unsigned char *) aligned_malloc_int(
        sizeof(char) * (jpg_width + 1) * (jpg_height + 1) * 3, 128);

if (!yuv_buf) {
    fprintf (stderr, "malloc yuv buf error\n");
    goto end;
} 

memset (yuv_buf, 0, frame_size);
while (1) {

    try_cnt++;
    va_log (vfp_log, "try_cnt is %d\n", try_cnt);

    //MAX_TRY_TIMES = 10
    if (try_cnt > MAX_TRY_TIMES) {
        va_log (vfp_log, "try time out\n");
        break;
    }

    count = fread (yuv_buf + last_pos, 1, frame_size - last_pos, yuv_fp);
    if (last_pos + count < frame_size) {
        va_log (vfp_log, "already read yuv: %d, this time:%d\n", last_pos + count, count);
        last_pos += count;
        continue;
    }

    // do my work here

    memset (yuv_buf, 0, frame_size);
    last_pos = 0;
    try_cnt = 0;
}

end:
if (yuv_buf) {
    aligned_free_int (yuv_buf);
}

return ret;
}

my log:

2016/04/05 15:20:38: a frame size:115200 2016/04/05 15:20:38: try_cnt is 1 2016/04/05 15:20:38: already read yuv: 49365, this time:49365 2016/04/05 15:20:38: try_cnt is 2 2016/04/05 15:20:38: already read yuv: 49365, this time:0 2016/04/05 15:20:38: try_cnt is 3 2016/04/05 15:20:38: already read yuv: 49365, this time:0 2016/04/05 15:20:38: try_cnt is 4 2016/04/05 15:20:38: already read yuv: 49365, this time:0 2016/04/05 15:20:38: try_cnt is 5 2016/04/05 15:20:38: already read yuv: 49365, this time:0 2016/04/05 15:20:38: try_cnt is 6 2016/04/05 15:20:38: already read yuv: 49365, this time:0 2016/04/05 15:20:38: try_cnt is 7 2016/04/05 15:20:38: already read yuv: 49365, this time:0 2016/04/05 15:20:38: try_cnt is 8 2016/04/05 15:20:38: already read yuv: 49365, this time:0 2016/04/05 15:20:38: try_cnt is 9 2016/04/05 15:20:38: already read yuv: 49365, this time:0 2016/04/05 15:20:38: try_cnt is 10 2016/04/05 15:20:38: already read yuv: 49365, this time:0 2016/04/05 15:20:38: try_cnt is 11 2016/04/05 15:20:38: try time out ```

my question:

when piping used ,does ffmpeg write content to pipe buffer as soon as it has content, or it will buffer some size content, then flushes them to pipe?Maybe some internal logic that I misunderstood,any one could help explain or fix my code?

PS: this command run ok under linux.

来源:https://stackoverflow.com/questions/36420233/ffmpeg-av-interleaved-write-frame-broken-pipe-under-windows

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!