Clarification of terms to simplify discussion: Your URLs do not *contain* a question mark or query string. Rather, a question mark and query string are *appended* to your URLs. URLs and query strings, along with the "?" token that demarcates the query string, are three separate things.
RewriteRule in a .htaccess or <Directory> context tests only the local URL-path -- that is, the URL with the protocol, hostname, FQDN indicator, port number, and path to the current .htaccess file's directory removed.
So this is why your rule won't work.
In order to detect the question mark that marks the beginning of a query-string, you have to use the mod_rewrite variable %{THE_REQUEST}, which contains the entire HTTP request line sent by the client -- the same string that appears in quotes in each of your raw server access log file entries. It starts with the HTTP method (e.g. GET, HEAD, or POST) and ends with the requested protocol version (e.g. HTTP/1.1).
Further, if you want an external client redirect, then a full protocol, hostname, and URL-path should be specified:
In example.com/.htaccess:
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /\?/channels/([^/#\ ]+)(#[^\ ]*)?\ HTTP/ [NC]
RewriteRule ^$ http://www.example.com/channels/action/view/channel/%1? [R=301,L]
The second question mark (unescaped) in the RewriteCond is not a literal. It is a regular-expressions quantifier acting on the preceding parenthesized sub-expression. This subexpression is present in case a URL-fragment (an HTML "named anchor" or an AJAX parameter) is appended to the query string -- intentionally, accidentally, or maliciously.
The negative-match subpatterns are used for efficiency; We tell the matching engine what characters to
stop on, in order to avoid it matching all the way to the end of the HTTP protocol version and then having to iteratively "back-off" one character at a time to get a match.
The question mark appended to the RewriteRule substitution is not a literal. It functions as an operator which clears (i.e. effectively "removes") the current query string by replacing it with a blank one. This question mark will not appear in the output URL unless a new query string is also specified after it.
Jim