diff --git a/doc/ffprobe.texi b/doc/ffprobe.texi
index 597b6b5342ccdc82787f6d15953463cebb0e7a2d..9496fc95be867ea64829fff1062cc467f5966244 100644
--- a/doc/ffprobe.texi
+++ b/doc/ffprobe.texi
@@ -80,9 +80,12 @@ Use sexagesimal format HH:MM:SS.MICROSECONDS for time values.
 Prettify the format of the displayed values, it corresponds to the
 options "-unit -prefix -byte_binary_prefix -sexagesimal".
 
-@item -print_format @var{format}
+@item -print_format @var{writer_name}[=@var{writer_options}]
 Set the output printing format.
 
+@var{writer_name} specifies the name of the writer, and
+@var{writer_options} specifies the options to be passed to the writer.
+
 For example for printing the output in JSON format, specify:
 @example
 -print_format json
diff --git a/ffprobe.c b/ffprobe.c
index d2ef86fe628969a45f810ef2d0bf520d6af1f705..82a8f5425ec421db4a1b4e0bd0ebdf05ea2937fa 100644
--- a/ffprobe.c
+++ b/ffprobe.c
@@ -23,6 +23,7 @@
 
 #include "libavformat/avformat.h"
 #include "libavcodec/avcodec.h"
+#include "libavutil/avstring.h"
 #include "libavutil/opt.h"
 #include "libavutil/pixdesc.h"
 #include "libavutil/dict.h"
@@ -737,23 +738,34 @@ static int probe_file(const char *filename)
     AVFormatContext *fmt_ctx;
     int ret;
     Writer *w;
+    const char *buf = print_format;
+    char *w_str = NULL, *w_args = NULL;
     WriterContext *wctx;
 
     writer_register_all();
 
-    if (!print_format)
-        print_format = av_strdup("default");
-    w = writer_get_by_name(print_format);
-    if (!w) {
-        fprintf(stderr, "Invalid output format '%s'\n", print_format);
-        return AVERROR(EINVAL);
+    if (buf) {
+        w_str = av_get_token(&buf, "=");
+        if (*buf == '=') {
+            buf++;
+            w_args = av_get_token(&buf, "");
+        }
     }
 
-    if ((ret = writer_open(&wctx, w, NULL, NULL)) < 0)
-        return ret;
+    if (!w_str)
+        w_str = av_strdup("default");
 
+    w = writer_get_by_name(w_str);
+    if (!w) {
+        av_log(NULL, AV_LOG_ERROR, "Invalid output format '%s'\n", w_str);
+        ret = AVERROR(EINVAL);
+        goto end;
+    }
+
+    if ((ret = writer_open(&wctx, w, w_args, NULL)) < 0)
+        goto end;
     if ((ret = open_input_file(&fmt_ctx, filename)))
-        return ret;
+        goto end;
 
     writer_print_header(wctx);
     PRINT_CHAPTER(packets);
@@ -764,7 +776,11 @@ static int probe_file(const char *filename)
     av_close_input_file(fmt_ctx);
     writer_close(&wctx);
 
-    return 0;
+end:
+    av_free(w_str);
+    av_free(w_args);
+
+    return ret;
 }
 
 static void show_usage(void)